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

相关推荐
㓗冽4 分钟前
60题之内难题分析
开发语言·c++·算法
dingdingfish12 分钟前
Bash学习 - 第3章:Basic Shell Features,第5节:Shell Expansions
开发语言·学习·bash
rainbow688913 分钟前
C++开源库dxflib解析DXF文件实战
开发语言·c++·开源
deepxuan14 分钟前
Day7--python
开发语言·python
禹凕29 分钟前
Python编程——进阶知识(多线程)
开发语言·爬虫·python
蜡笔小马42 分钟前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
IOsetting42 分钟前
金山云主机添加开机路由
运维·服务器·开发语言·网络·php
林开落L1 小时前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制
牛奔1 小时前
Go 是如何做抢占式调度的?
开发语言·后端·golang
符哥20081 小时前
C++ 进阶知识点整理
java·开发语言·jvm