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

相关推荐
房开民7 小时前
c++总结
java·开发语言·c++
毕设源码-赖学姐8 小时前
【开题答辩全过程】以 基于Java的医院器材管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
float_com8 小时前
【java常用API】----- Arrays
java·开发语言
不会写DN8 小时前
PHP 中的文件读写与上传
android·开发语言·php
LuckyTHP9 小时前
迁移shibboleth java获取shibboleth用户信息
java·开发语言
客卿1239 小时前
数论===质数统计(暴力法,)
java·开发语言
Σίσυφος19009 小时前
C++ 多肽经典面试题
开发语言·c++·面试
csdn_aspnet10 小时前
C# 求n边凸多边形的对角线数量(Find number of diagonals in n sided convex polygon)
开发语言·算法·c#
qq_2546744110 小时前
Docker 中的 镜像(
开发语言
码云社区10 小时前
JAVA二手车交易二手车市场系统源码支持微信小程序+微信公众号+H5+APP
java·开发语言·微信小程序·二手交易·闲置回收