通过 对 一个 数学 模型 的求解 来介绍 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的更多相关文章

  1. 非线性优化(高翔slam---第六讲 )

    1.线性最小二乘问题 2.非线性最小二乘问题 因为它非线性,所以df/dx有时候不好求,那么可以采用迭代法(有极值的话,那么它收敛,一步步逼近): 这样求导问题就变成了递归逼近问题,那么增量△xk如何 ...

  2. VINS(五)非线性优化与在线标定调整

    首先根据最大后验估计(Maximum a posteriori estimation,MAP)构建非线性优化的目标函数. 初始化过程通过线性求解直接会给出一个状态的初值,而非线性优化的过程关键在于求解 ...

  3. Ceres Solver: 高效的非线性优化库(二)实战篇

    Ceres Solver: 高效的非线性优化库(二)实战篇 接上篇: Ceres Solver: 高效的非线性优化库(一) 如何求导 Ceres Solver提供了一种自动求导的方案,上一篇我们已经看 ...

  4. Ceres Solver: 高效的非线性优化库(一)

    Ceres Solver: 高效的非线性优化库(一) 注:本文基于Ceres官方文档,大部分由英文翻译而来.可作为非官方参考文档. 简介 Ceres,原意是谷神星,是发现不久的一颗轨道在木星和火星之间 ...

  5. 【机器学习之数学】03 有约束的非线性优化问题——拉格朗日乘子法、KKT条件、投影法

    目录 1 将有约束问题转化为无约束问题 1.1 拉格朗日法 1.1.1 KKT条件 1.1.2 拉格朗日法更新方程 1.1.3 凸优化问题下的拉格朗日法 1.2 罚函数法 2 对梯度算法进行修改,使其 ...

  6. SLAM中的非线性优化

    总结一下SLAM中关于非线性优化的知识. 先列出参考: http://jacoxu.com/jacobian%E7%9F%A9%E9%98%B5%E5%92%8Chessian%E7%9F%A9%E9 ...

  7. nlopt 二次优化

    /* * main.c * * Created on: Oct 9, 2018 * Author: lgh */ #include <stdio.h> #include <math. ...

  8. R 包

    [下面列出每个步骤最有用的一些R包] .数据导入 以下R包主要用于数据导入和保存数据: feather:一种快速,轻量级的文件格式:在R和python上都可使用 readr:实现表格数据的快速导入 r ...

  9. R语言中常用包(二)

    数据导入 以下R包主要用于数据导入和保存数据 feather:一种快速,轻量级的文件格式.在R和python上都可使用readr:实现表格数据的快速导入.中文介绍可参考这里readxl:读取Micro ...

  10. r语言 包说明

    [在实际工作中,每个数据科学项目各不相同,但基本都遵循一定的通用流程.具体如下]   [下面列出每个步骤最有用的一些R包] 1.数据导入以下R包主要用于数据导入和保存数据:feather:一种快速,轻 ...

随机推荐

  1. php 高并发

    1 swoole的博客 http://rango.swoole.com/archives/508 2 消息队列 3 接口并发请求

  2. windows环境变量修改器

    软件及源码 前言 我一直再用win7的系统,当更改path环境变量的时候很难受, 就只能看到一段,然后前面有啥后面有啥都看不到,而且来回调整优先级的时候需要剪切粘贴,主要就是来回调节优先级特别麻烦.所 ...

  3. APACHE快速安装流程梳理

    操作参考教程:https://www.cnblogs.com/haw2106/p/9839655.html 快速安装开始: [环境配置1] yum -y install gcc gcc-c++ wge ...

  4. 【PostgreSQL】pgsql编写函数实现批量删除数字结尾的备份表

    执行前: 最终代码: CREATE OR REPLACE FUNCTION "ap"."iter_drop_table_bak"() RETURNS " ...

  5. 【每日一题】【map操作】【滑动窗口所需元素】2021年12月22日-76. 最小覆盖子串

    给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意: 对于 t 中重复字符 ...

  6. L1-064 估值一亿的AI核心代码 (20分)

    L1-064 估值一亿的AI核心代码 (20分) 以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除 ...

  7. markdown语法使用

    markdown语法使用 标题系列 ​ 1.警号 ​ 2.快捷键 ​ ctrl + 数字(1~6) 小标题系列 * 文本 无序标题 + 文本 无序标题 数字 文本 有序标题 语言环境 表格制作 表情制 ...

  8. 【RocketMQ】主从模式下的消费进度管理

    在[RocketMQ]消息的拉取一文中可知,消费者在启动的时候,会创建消息拉取API对象PullAPIWrapper,调用pullKernelImpl方法向Broker发送拉取消息的请求,那么在主从模 ...

  9. 重学c#系列—— 反射深入一点点[三十三]

    前言 在上一章中介绍了什么是反射: https://www.cnblogs.com/aoximin/p/16440966.html 正文 上一节讲述反射的基本原理和为什么要用反射,还用反射的优缺点这些 ...

  10. csp-j 游记

    ### 初赛 day -7 ~ day -1 赛前集训,都很简单,什么二叉树,图论呀,轻松搞定.做了 $2008$ 至 $2015$ 年的普及组真题,都在 $50$ 分以上,感觉初赛稳了(坐标 $HN ...