非线性优化-NLopt
通过 对 一个 数学 模型 的求解 来介绍 NLopt的使用方法
数学模型:

这个是目标函数 求满足 条件的情况下 x2的开平方最小
边界约束

非线性不等式约束如下

有两个参数 x1 和 x2 ,其中 a和b是模型的参数可以设为任意的固定值,这个模型设为a1=2,b1=0,a2=-1,b2=1
绘制这两条曲线 如下图

可行性区域在交汇的上方,最优点在交汇处,最优值大约为0.5443
下面通过NLopt的方式来求解这个数学模型。
通过图片上的曲线可以看出,x2>0的约束没有什么用,因为可行性区域的都在0之上
但是在使用NLopt的时候最好也把这个条件加上去。
nlopt.cc
#include <nlopt.hpp>
#include <iostream>
#include <math.h>
using namespace std;
int count = 0;
typedef struct {
double a, b;
} my_constraint_data;
double myfunc(const std::vector<double>& x, std::vector<double>& grad, void *my_func_data)
{
count++;
if(!grad.empty())
{
grad[0] = 0.0;
grad[1] = 0.5 / sqrt(x[1]);
}
return sqrt(x[1]);
}
double myconstraint(const std::vector<double>& x, std::vector<double>& grad, void *data)
{
//声明对应外部数据刚定义的结构体 数据 然后赋值就可以了
my_constraint_data *d = (my_constraint_data *) data;
//获得a和b
double a = d->a, b = d->b;
if(!grad.empty())
{
grad[0] = 3 * a * (a*x[0] + b) * (a*x[0] + b);//对x0求偏导
grad[1] = -1.0;//对x1求偏导
}
return ((a*x[0] + b) * (a*x[0] + b) * (a*x[0] + b) - x[1]);//返回 不等函数
}
int main()
{
my_constraint_data data[2] = { {2,0}, {-1,1} };//不等式的外部参数 上面定义的结构体
nlopt::opt opt(nlopt::LD_SLSQP, 2);
opt.set_min_objective(myfunc, NULL);
opt.add_inequality_constraint(myconstraint, &data[0], 1e-8);
opt.add_inequality_constraint(myconstraint, &data[1], 1e-8);
opt.set_xtol_rel(1e-4);
/*优化参数的边界约束*/
std::vector<double> lb {0.1,0.1};//注意参数的个数要对应上
std::vector<double> ub {10000,10000};//注意参数的个数要对应上
//设置 参数 边界
opt.set_lower_bounds(lb);//设置参数下限
opt.set_upper_bounds(ub);//设置参数上限
std::vector<double> x(2);
x[0] = 2.5;
x[1] = 4.3;
double minf;
std::cout << "start optimize" << std::endl;
nlopt::result result = opt.optimize(x, minf);
std::cout << "count:" << count << endl;
std::cout << "found minimum at x1:" << x[0] << "x2:" << x[1] << "minf:" << minf << std::endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(nloptDemo)
find_package(Eigen3 REQUIRED)
find_package(
nlopt
)
include_directories(
${Eigen3_INCLUDE_DIRS}
${nlopt_INCLUDE_DIRS}
)
link_directories(${nlopt_LIBARIES})
add_definitions(${nlopt_DEFINITIONS})
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS} -O0 -Wall")
add_executable(nloptDemo nlopt.cc)
target_link_libraries( nloptDemo
${nlopt_LIBRARIES}
)
运行结果:
start optimize
count:9
found minimum at x1:0.333333x2:0.296296minf:0.544331
经过实验,发现初值对程序运行比较重要
非线性优化-NLopt的更多相关文章
- 非线性优化(高翔slam---第六讲 )
1.线性最小二乘问题 2.非线性最小二乘问题 因为它非线性,所以df/dx有时候不好求,那么可以采用迭代法(有极值的话,那么它收敛,一步步逼近): 这样求导问题就变成了递归逼近问题,那么增量△xk如何 ...
- VINS(五)非线性优化与在线标定调整
首先根据最大后验估计(Maximum a posteriori estimation,MAP)构建非线性优化的目标函数. 初始化过程通过线性求解直接会给出一个状态的初值,而非线性优化的过程关键在于求解 ...
- Ceres Solver: 高效的非线性优化库(二)实战篇
Ceres Solver: 高效的非线性优化库(二)实战篇 接上篇: Ceres Solver: 高效的非线性优化库(一) 如何求导 Ceres Solver提供了一种自动求导的方案,上一篇我们已经看 ...
- Ceres Solver: 高效的非线性优化库(一)
Ceres Solver: 高效的非线性优化库(一) 注:本文基于Ceres官方文档,大部分由英文翻译而来.可作为非官方参考文档. 简介 Ceres,原意是谷神星,是发现不久的一颗轨道在木星和火星之间 ...
- 【机器学习之数学】03 有约束的非线性优化问题——拉格朗日乘子法、KKT条件、投影法
目录 1 将有约束问题转化为无约束问题 1.1 拉格朗日法 1.1.1 KKT条件 1.1.2 拉格朗日法更新方程 1.1.3 凸优化问题下的拉格朗日法 1.2 罚函数法 2 对梯度算法进行修改,使其 ...
- SLAM中的非线性优化
总结一下SLAM中关于非线性优化的知识. 先列出参考: http://jacoxu.com/jacobian%E7%9F%A9%E9%98%B5%E5%92%8Chessian%E7%9F%A9%E9 ...
- nlopt 二次优化
/* * main.c * * Created on: Oct 9, 2018 * Author: lgh */ #include <stdio.h> #include <math. ...
- R 包
[下面列出每个步骤最有用的一些R包] .数据导入 以下R包主要用于数据导入和保存数据: feather:一种快速,轻量级的文件格式:在R和python上都可使用 readr:实现表格数据的快速导入 r ...
- R语言中常用包(二)
数据导入 以下R包主要用于数据导入和保存数据 feather:一种快速,轻量级的文件格式.在R和python上都可使用readr:实现表格数据的快速导入.中文介绍可参考这里readxl:读取Micro ...
- r语言 包说明
[在实际工作中,每个数据科学项目各不相同,但基本都遵循一定的通用流程.具体如下] [下面列出每个步骤最有用的一些R包] 1.数据导入以下R包主要用于数据导入和保存数据:feather:一种快速,轻 ...
随机推荐
- dlv远端调试go的问题
1.golang采用dlv 时提示 "could not launch process: could not open debug info " 在用dlv 远程debug 代码时 ...
- Spring校验器实例
@size (min=3, max=20,message="用户名长度只能在3-20之间") @size (min=6, max=20,message="密码长度只能在6 ...
- Linux 使用打印机
前言 在 deepin 上打印机好使,在我的mint上不好使,简单的查看一下deepin上驱动及软件.安装上就行了. 软件及驱动 ii hpijs-ppds 3.18.12+dfsg0-2 all H ...
- 关于mysql命令的学习
前言 这篇文章我不会具体说明哪些操作有哪些命令,我只说明这些命令的记忆方法.其实知道原理后,这些命令尽管多,但都是有据可循的 mysql提示符 可以通过登录时加入 –prompt 提示符内容 参数 登 ...
- 实践案例:同程艺龙网的 Dubbo 升级经验总结
本篇为同程艺龙旅行网 Apache Dubbo 的实践案例总结.感兴趣的朋友可以访问官网了解更多详情,或搜索关注官方微信公众号 Apache Dubbo 跟进最新动态. 作者信息: 严浩:同程艺龙高级 ...
- MYSQL快速安装整理
参考教程:https://www.cnblogs.com/brad93/p/16650780.html [检查是否已安装过] find / -name mysql [快速安装开始] groupadd ...
- 【Java EE】Day11 BootStrap、响应式布局、栅格系统、CSS样式、案例
一.BootStrap介绍 https://v3.bootcss.com/css/#overview 1.概念 基于三剑客开发的前端开发框架 定义了许多css样式和js插件,从而得到丰富的页面效果 依 ...
- go-carbon 1.5.2版本发布, 修复已知 bug 和新增功能及葡萄牙语翻译文件
carbon 是一个轻量级.语义化.对开发者友好的golang时间处理库,支持链式调用. 目前已被 [awesome-go](https://github.com/avelino/awesome-go ...
- HMS Core 6.8.0版本发布公告
分析服务 ◆ 游戏行业新增"区服分析"埋点模板及分析报告,支持开发者分服务器查看用户付费.留存等指标,可进一步评估不同服务器的玩家质量: ◆ 新增营销活动报告,可查看广告任务带来的 ...
- ORM数据库查询优化only与defer(select_related与prefetch_related)
目录 一:数据库查询优化 1.ORM语句特点 2.only 3.defer 4.only与defer区别 5.select_related与prefetch_related 6.select_rela ...