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

相关推荐
charlie1145141914 分钟前
嵌入式Linux驱动开发(3)——内核模块机制 - Linux 的插件系统
linux·运维·开发语言·驱动开发·嵌入式硬件·学习
C、空白格16 分钟前
Java集成Vosk实现离线语音识别
java·开发语言·语音识别
编码浪子25 分钟前
基于 Rust + Axum 的企业级权限管理系统设计与实现
开发语言·后端·rust
历程里程碑28 分钟前
MySQL事务深度解析:ACID到MVCC实战+万字长文解析
开发语言·数据结构·数据库·c++·sql·mysql·排序算法
Lyyaoo.35 分钟前
【JAVA基础面经】native方法
java·开发语言
牛十二37 分钟前
nacos2.4连接出错源码分析
java·linux·开发语言
小松加哲1 小时前
AspectJ编译期织入实战
java·开发语言
鲸渔1 小时前
【C++ 跳转语句】break、continue、goto 与 return
开发语言·c++·算法
喜欢吃燃面1 小时前
Linux 进程信号深度解析:从概念到产生机制
linux·开发语言·学习
AI玫瑰助手1 小时前
Python基础:字符串的常用内置方法(查找替换分割)
android·开发语言·python