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

article/2025/8/17 7:04:29

说明:

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


一、fmincon函数:算法介绍

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

  1. ‘interior-point’(默认!!!):内点法
  2. ‘trust-region-reflective’:信赖域反射算法
  3. ‘sqp’:SQP算法
  4. ‘sqp-legacy’:(仅限于 optimoptions)
  5. ‘active-set’:活动集算法

一般情况下,默认采用的是内点法(interior-point),当然也可修改。
修改方法如下:

options = optimoptions('fmincon','Algorithm','interior-point'); 
[XXXXX]=fmincon( XXXXXXXXX,options);

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


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




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

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

方法:

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

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

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




三、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).^2x(1)+x(2).^2+x(3).^3-20];h=[-x(1)-x(2).^2+2x(2)+2*x(3).^2-3];

主函数为:

clear all
clcoptions = 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 的句柄方法书写,同理。

运行结果:




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

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

因此,前述 ‘my_try_fun2’ 约束中才会返回两个输出 g 与 h 。( [g,h]=my_try_fun2(x) )
当然了,若是没有非线性等式约束,则可写h = [ ]; 即可,但不可不写 h,因为非线性约束函数必须返回两个输出!
如:将前述的 my_try_fun2.m 函数改为下式:

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



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

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

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

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

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

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

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

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

案例:

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

结果显示:




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

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




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

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

参考网址5

参考网址6

参考网址7(主要网址)

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

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

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

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

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

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


http://chatgpt.dhexx.cn/article/QNlYZ691.shtml

相关文章

通过matlab自带的fmincon工具箱函数实现多维目标优化仿真

目录 一、理论基础 二、核心程序 三、仿真结论 一、理论基础 fmincon是matlab自带的优化工具箱函数之一,用于求解具有约束条件的多维目标优化问题。本文将详细介绍fmincon的用法,包括函数参数、优化模型的构建、约束条件的处理、求解结果的分析等。 …

MATLAB优化函数fmincon的简介

1 需要解决的问题 能效优化问题: 优化目标为找到最小化J对应的u、v。 时间为从零点开始的24小时,每隔20分钟取一次值,不同时间段的u、v不同,最后得到的u、v为72维的向量。 2 fmincon函数 fmincon解决的是形如下面问题的最优化…

Matlab非线性规划之fmincon()函数

关于非线性规划 非线性规划问题是指目标函数或者约束条件中包含非线性函数的规划问题。 前面我们学到的线性规划更多的是理想状况或者说只有在习题中,为了便于我们理解,引导我们进入规划模型的一种情况。相比之下,非线性规划会更加贴近实际的…

OpenJDK各平台版本下载

开源清华大学镜像 https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/ https://share.weiyun.com/pggTSFlP

如何下载OpenJDK安装版本

进入OpenJDK 官网: 选择需要的版本即可下载。

OpenJDK windows下安装过程

Windows下安装OpenJDK,需要额外配置系统环境变量(这和n年以前安装OracleJDK一样。。。) 下载OpenJDK12,并解压至任意文件夹 地址:http://jdk.java.net/12/ 配置环境变量 1.设置JAVA_HOME,指向openJDK目录 2.新建系统变量CLASS…

windows下载openjdk1.8

下载页:http://jdk.java.net/ openjdk8下载地址:https://jdk.java.net/java-se-ri/8-MR3(注意是32位的,官网64位没找到) 如图: 然后,1.添加环境变量:JAVA_HOMEF:\java-se-8-ri\bin…

windows jdk安装;windows openjdk安装

因为最近重新装了系统,要安装jdk环境。以前都是安装的oracle jdk,所以今天尝试安装下open jdk安装。 1. 下载openjdk ,我这里选择jdk8;jdk常用的几个版本 8 ;11;18;下载的文件为zip解压版; 下载…

openJDK源码下载及阅读

完全来源于:openJDK源码下载 1、打开openjdk网站 打开链接:http://hg.openjdk.java.net/ 2、点击想要下载的jdk的版本,如jdk8u 3、在新页面中找到jdk8u然后点击下面的jdk连接 4、然后出现了一个我们看不懂的页面,不要着急&…

windows下载openjdk8(附赠安装包)

openjdk下载地址:https://jdk.java.net/ (文末已经为大家下好了,放在网盘里) 进去后点8,win。 安装好后,使用java -version命令如下: 成功安装openjdk! 为大家提供网盘(…

openJDK下载教程

引用自:https://my.oschina.net/u/2518341/blog/1931088 直接从这个链接进http://hg.openjdk.java.net/ 附:下载链接https://adoptopenjdk.net/releases.html openJDK百度云链接: 链接:https://pan.baidu.com/s/1kPhgdhCRntkav…

openjdk1.8的下载与安装

需求场景: 之前使用的是jdk1.8,在对接企业微信开发中,对企业微信回传的好友信息进行解密校验的时候,显示如下异常:然后同样的分支在同事那边可以正常运行,排除一下后,确定是jdk版本的问题,换上了…

openJDK 源码下载

登录官网,找到openJDK的github地址: OpenJDK GitHubOpenJDK has 96 repositories available. Follow their code on GitHub.https://github.com/openjdk 进一步在tag页,查找需要的版本,比如这里下载 jdk8的最后一个版本&#xf…

Linux——安装JDK和OpenJDK【多种方法】

目录 一、Linux安装OpenJDK 1、查看系统是否有自带的版本 2、删除OpenJDK 3、本地下载OpenJDK 4、无法本地下载,也可以使用命令下载(方法1) 4、无法本地下载,也可以使用命令下载(方法2) 5、拓展 三…

openJDK 17.0.1 的下载与安装

openJDK 17.0.1 的下载与安装 下载安装 下载 我的安装环境为win10 下载地址:https://developers.redhat.com/products/openjdk/download 安装 下载好后,解压出来 可以进入bin目录中,测试是否完整,如图 然后配置好环境变量即…

openJDK 官方二进制下载

前言 由于Oracle的jdk收费license,JDK8 201~221开始不免费了,目前有最近的JDK17 LTS明确免费了,但是不确定什么时候会修改协议,而且升级jdk也不能从jdk8升级到jdk17吧,LTS版本有8/11/17,目前即使升级也先升…

OpenJDK各版本下载

开源清华大学镜像 清华大学开源软件镜像站 | Tsinghua Open Source Mirror清华大学开源软件镜像站,致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务,帮助用户更方便地获取开源软件。本镜像站由清华大学 TUNA 协会负责运行维护。http…

OpenJDK源码下载

OpenJDK源码地址: https://openjdk.org/ 找到github地址 https://github.com/openjdk/ 点击JDK 选择你想下载的任何一个版本 选择版本 这里选择jdk最后更新的一个版本 git clone Download ZIP 我这里现在失败了,就Download ZIP吧

JDK 下载与安装

首先下载 jdk 最新版本。可以去 http://java.sun.com/j2se/1.4.2/download.html 版本一:适合 win7oracle 版本 java 下载最新的 jdk 版本, 打开界面后。选择 J2SE v 1.4.2_08 SDK 拦目下面的 Download J2SE SDK, 然后选择 Accept License…

Linux下OpenJDK的下载和安装

如果你使用的是Linux,可以通过系统自带的命令行工具下载,但我还是推荐到官网下载安装,因为命令行非常的慢,不知道是什么原因(已经有代理和镜像了)。 OpenJDK的官网是下面的网站。 https://openjdk.org/inst…