MATLAB fmincon函数 进阶资料(磕盐记录)

MATLAB fmincon函数 进阶资料(磕盐记录)初级资料 Matlab 求解非线性规划 fmincon 函数的用法总结完备资料 MathWork

说明:

阅读本文前,请先阅读 参考网址1-基础使用 中的案例,本文适用于运行过 fmincon函数 案例的读者!!!

一、fmincon函数:算法介绍

fmincon函数中,可以调用五种算法(具体每种算法的详细原理,可自行百度,如搜索“SQP算法原理”等),分别是:

  1. ‘interior-point’(默认!!!):内点法
  2. ‘trust-region-reflective’:信赖域反射算法
  3. ‘sqp’:SQP算法
  4. ‘sqp-legacy’:(仅限于 optimoptions)
  5. ‘active-set’:活动集算法
options = optimoptions('fmincon','Algorithm','interior-point'); [XXXXX]=fmincon( XXXXXXXXX,options); 

添加“options ”项,并将Algorithm后的 interior-point 改为其余算法即可,如“sqp”。

这里着重声明一下内点法
考虑到内点法一般有两种,一是障碍函数内点法,二是primal-Dual内点法(原对偶内点法)。根据“参考网址3”可知,fmincon函数采用的是前者——障碍函数内点法!而非原对偶内点法。截图如下:


MATLAB fmincon函数 进阶资料(磕盐记录)

二、fmincon函数:取消输出显示

fmincon函数运行后,总会显示各种输出,如下图。尤其是fmincon函数在循环中的时候,这种输出尤为碍眼。因此,如何让fmincon函数不显示各种输出项?


MATLAB fmincon函数 进阶资料(磕盐记录)

方法:

options = optimoptions('fmincon','Display','notify'); [XXXXX]=fmincon( XXXXXXXXX,options); 

添加“options ”项,并在Display后添加’notify’或’off’或’none’

详细信息见下图:(截图选自 参考网址2 )


MATLAB fmincon函数 进阶资料(磕盐记录)

三、fmincon函数:传递参数

使用句柄传参!否则无法实现参数传递。(句柄传参基础)

以参考网址1中的例子为例,我们向my_try_fun1.m函数中传递一个参数a写法如下:

function f = my_try_fun1(x,a) f=x(1).^2+x(2).^2+x(3).^2+a; 
function [g,h]=my_try_fun2(x) g=[-x(1).^2+x(2)-x(3).^2 x(1)+x(2).^2+x(3).^3-20]; h=[-x(1)-x(2).^2+2 x(2)+2*x(3).^2-3]; 

主函数为:

clear all clc options = optimoptions('fmincon','Display','notify','Algorithm','interior-point'); %表示针对fmincon函数,Display一项选择notify,Algorithm一项选择interior-point。详见 https://ww2.mathworks.cn/help/optim/ug/fmincon.html#busow0w-1  a = 8 ; [x,y]=fmincon( @(x) my_try_fun1(x,a),rand(3,1),[],[],[],[],zeros(3,1),[],'my_try_fun2',options) 

当然, my_try_fun2 函数若要传递参数,也可按照 my_try_fun1 的句柄方法书写,同理。

运行结果:


MATLAB fmincon函数 进阶资料(磕盐记录)

四、fmincon函数:非线性约束函数

非线性约束函数必须返回两个输出。
第一个输出对应于非线性不等式,第二个输出对应于非线性等式。

function [g,h]=my_try_fun2(x) g=[-x(1).^2+x(2)-x(3).^2 x(1)+x(2).^2+x(3).^3-20]; h=[]; 

五、fmincon函数:迭代参数设置

1)如果迭代提前终止,可增大函数计算的最大次数

如下图,表示迭代超过了允许的默认设置中的函数计算的最大次数(对应名称为 MaxFunEvals )!


MATLAB fmincon函数 进阶资料(磕盐记录)

默认的函数计算的最大次数是3000次,因此,上调即可。我改为了。修改方法如下:

options = optimoptions('fmincon','MaxFunEvals',); 

2)如果迭代时间太长,可降低迭代的精度

  • 一阶最优性的终止容差(正标量)
    默认值为 1e-6,名称是 TolFun,修改犯法如下:

options = optimoptions('fmincon','TolFun',10^(-2)); 
  • 容差(停止条件)(标量)
    针对内点法及SQP方法才可设置此项,名称是 ObjectiveLimit,默认值为 -1e20。如果目标函数值低于 ObjectiveLimit 并且迭代可行(标注:这里的“迭代可行”应该指的是迭代至可行域内吧?),则迭代停止,因为问题很可能是无界的。修改方法如下:

options = optimoptions('fmincon','ObjectiveLimit',10^(-3)); 

3)如果不知迭代进展,可作图查看迭代实时进度


MATLAB fmincon函数 进阶资料(磕盐记录)

案例:

options = optimoptions('fmincon','PlotFcns','optimplotfval'); 

结果显示:


MATLAB fmincon函数 进阶资料(磕盐记录)

五、fmincon函数:内点法的 Hessian 矩阵近似算法选取

适用于 fmincon 内点算法的 Hessian 矩阵


MATLAB fmincon函数 进阶资料(磕盐记录)

六、fmincon函数:内点法的 Hessian 矩阵输入

求解器使用逼近的 Hessian 矩阵,它可能与真实的 Hessian 矩阵相差甚远。所以,为了稳定性及准确性,可人为输入 Hessian 矩阵。

参考网址5

参考网址6

参考网址7(主要网址)

下图以求解 Rosenbrock函数 为例,展示如何书写 Hessian 矩阵,并给出函数调用时,出现的问题。


MATLAB fmincon函数 进阶资料(磕盐记录)

直接调用上述函数后,报错。错误信息如下:


MATLAB fmincon函数 进阶资料(磕盐记录)

点击报错信息中的 “documentation page”,查阅错误原因。得知:是MATLAB版本差异导致的。在本人使用的 MATLAB 2014a 中,函数信息不含“SpecifyObjectiveGradient”等选项。


MATLAB fmincon函数 进阶资料(磕盐记录)

继而查阅新旧名称得知(参考网址8),名称发生了变化,因此,修改名称即可!


MATLAB fmincon函数 进阶资料(磕盐记录)

因此,只需要替换新旧名称即可!


MATLAB fmincon函数 进阶资料(磕盐记录)

code 如下:

  • (1)主函数如下:
fun = @rosenboth; nonlcon = @unitdisk2; x0 = [-1;2]; % options = optimoptions('fmincon','Algorithm','interior-point',... % 'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,... % 'HessianFcn',@hessianfcn); options = optimoptions('fmincon','Algorithm','interior-point',... 'GradObj','on','GradConstr','on','Hessian','user-supplied','HessFcn',@hessianfcn); [x,fval,exitflag,output] = fmincon(fun,x0,[],[],[],[],[],[],@unitdisk2,options); 
  • (2)目标函数如下:(包含原始原始目标函数、目标函数梯度矩阵、目标函数Hessian矩阵)
function [f, g, H] = rosenboth(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)]; H = [1200*x(1)^2-400*x(2)+2, -400*x(1); -400*x(1), 200]; % if nargout > 1 % gradient required % g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); % 200*(x(2)-x(1)^2)]; % % if nargout > 2 % Hessian required % H = [1200*x(1)^2-400*x(2)+2, -400*x(1); % -400*x(1), 200]; % end % % end 

(注意:该函数不是仅有目标函数 f !因为主函数的 options 中,设置了’GradObj’,‘on’。因此,目标函数中,除了原始目标函数以外,还必须有梯度及Hessian信息。)

  • (3)约束函数如下:(包含原始不等式约束函数c、原始等式约束函数ceq、不等式约束函数的梯度矩阵gc、等式约束函数的梯度矩阵gceq)
function [c,ceq,gc,gceq] = unitdisk2(x) c = x(1)^2 + x(2)^2 - 1; ceq = [ ]; gc = [2*x(1);2*x(2)]; gceq = []; % if nargout > 2 % gc = [2*x(1);2*x(2)]; % gceq = []; % end 

(同理:该函数不是仅有约束函数 c 及 ceq (其中,c为不等式约束,ceq为等式约束)。因为主函数的 options 中,设置了’GradConstr’,‘on’。因此,约束函数中,除了原始约束函数以外,还必须有梯度信息。注:此处不需要Hessian信息,只写梯度即可,因为约束的Hessian矩阵写在另一个函数中了)

  • (4)拉格朗日函数的Hessian函数如下:(包含:目标函数Hessian矩阵H、约束函数Hessian矩阵Hg)
function Hout = hessianfcn(x,lambda) % Hessian of objective H = [1200*x(1)^2-400*x(2)+2, -400*x(1); -400*x(1), 200]; % Hessian of nonlinear inequality constraint Hg = 2*eye(2); Hout = H + lambda.ineqnonlin*Hg; 

附:参考网址

1)初级资料:参考网址1

2)完备资料:参考网址2

3)进阶资料:参考网址3-对数障碍内点法原理

4)进阶资料:参考网址4-非线性约束

5)进阶资料:参考网址5

6)进阶资料:参考网址6

7)进阶资料:参考网址7














































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220638.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午8:00
下一篇 2026年3月17日 下午8:00


相关推荐

  • OpenClaw龙虾来袭,热搜却让我拒绝AI焦虑

    OpenClaw龙虾来袭,热搜却让我拒绝AI焦虑

    2026年3月13日
    2
  • vue分页组件

    vue分页组件/***分页组件*/<template><divclass=”pagination”><ulclass=”pagerclear”@click=”onPage”><li:class=”{disabled:page<=1}”:aria-disabled=”page<=

    2022年10月1日
    4
  • 使用pycharm画图不显示

    使用pycharm画图不显示项目场景 提示 这里简述项目相关背景 例如 项目场景 示例 通过蓝牙芯片 HC 05 与手机 APP 通信 每隔 5s 传输一批传感器数据 不是很大 问题描述 提示 这里描述项目中遇到的问题 例如 数据传输过程中数据不时出现丢失的情况 偶尔会丢失一部分数据 APP 中接收数据代码 Overridepubl bytes mmInStream read buffer mHandler obta

    2026年3月27日
    2
  • WebStorm快捷键配置「建议收藏」

    WebStorm快捷键配置「建议收藏」①浏览器快捷键设置

    2022年6月23日
    37
  • HDCVI——一种创新性的高清视频传输方案

    HDCVI——一种创新性的高清视频传输方案什么是HDCVI   2012年11月,大华技术股份有限公司发布了具有自主知识产权的同轴高清传输接口技术HDCVI。HDCVI技术是一种基于已有SYV75-3或SYV75-5同轴电缆的高清视频传输方法,能够在低成本和较低质量的同轴电缆上实现超长距离高清视频信号的可靠传输。相比较HD-SDI子系统在实际应用中对传输介质的高要求,HDCVI可以适应长距离、低成本的传输介质以及复杂的部署场合。

    2022年10月4日
    5
  • Bof基础实践_实践的基础是什么

    Bof基础实践_实践的基础是什么Bof基础Bof原理Linux下进程地址空间的布局典型的堆栈结构上图中可以看到栈中有returnaddress还有局部变量,也就是函数的参数,bof攻击是利用上参数的溢出将返回地址retur

    2022年8月4日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号