Matlab:非线性规划

1、语法:

复制代码
x=fmincon(fun,x0,A,b)
x=fmincon(fun,x0,A,b,Aeq,beq)
x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
x=fmincon(problem)
[x,fval]=fmincon(___)
[x,fval,exitflag,output] = fmincon(___)
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___)

注:b 和 beq 是向量,A 和 Aeq 是矩阵,c(x) 和 ceq(x) 是返回向量的函数,f(x) 是返回标量的函数。f(x)、c(x) 和 ceq(x) 可以是非线性函数

2、在边界约束下求 Rosenbrock 函数在圆内最小的点

例:

满足

且在1/3为半径,1/3,1/3为圆心的圆内

复制代码
%路径上名为circlecon.m的文件
function[c,ceq]=circlecon(x)
c=(x(1)-1/3)^2+(x(2)-1/3)^2-(1/3)^2;
ceq=[];

fun=@(x)120*(x(2)-x(1)^2)^2 + (1-x(1))^2;
lb=[0,0.2];
ub=[0.6,0.8];
A=[];
b=[];
Aeq=[];
beq=[];       %无线性约束
x0=[1/5,1/4];  %找一个满足条件的初始点即可
nonlcon=@circlecon;
x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

3、查看输出信息,使用不同算法

复制代码
%路径上名为unitdisk.m的文件
function[c,ceq]=unitdisk(x)
c=x(1)^2+x(2)^2-1;
ceq=[];

options=optimoptions('fmincon','Display','iter','Algorithm','sqp');
fun=@(x)120*(x(2)-x(1)^2)^2+(1-x(1))^2;
A=[];
b=[];
Aeq=[];
beq=[];
lb=[];
ub=[];
nonlcon=@unitdisk;
x0=[0,0];
x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

4、梯度计算(算法优化)

例:

,它的梯度

满足

复制代码
%路径上名为 rosenbrockwithgrad.m 的文件
function[f,g] = rosenbrockwithgrad(x)
f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;

if nargout > 1
    g=[-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));
        200*(x(2)-x(1)^2)];
end

options=optimoptions('fmincon','SpecifyObjectiveGradient',true);
fun=@rosenbrockwithgrad;
x0=[-1,1];
A=[];
b=[];
Aeq=[];
beq=[];
lb=[-3,-3];
ub=[3,3];
nonlcon=[];
x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

5、获取所有输出

例:

问题同上,调用unitdisk.m

复制代码
fun=@(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
nonlcon = @unitdisk;
A=[];
b=[];
Aeq=[];
beq=[];
lb=[];
ub=[];
x0=[0,0];
[x,fval,exitflag,output,lambda,grad,hessian]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

上接线性规划https://blog.csdn.net/weixin_73011353/article/details/135104402https://blog.csdn.net/weixin_73011353/article/details/135104402

相关推荐
蹊黎13 分钟前
C++中vector类的部分简单实现
开发语言·c++·visual studio
程序猿追6 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓6 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播6 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
墨云安全7 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php
摇滚侠7 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y7 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
jimy19 小时前
c++的 Type Traits (一)
开发语言·c++
Web极客码10 小时前
Python Ollama 本地 Agent 入门与订单查询实践
开发语言·jvm·python
kimnoic10 小时前
PHP 8.2的DNF类型怎么用才规范
开发语言·php