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

相关推荐
xxie1237947 小时前
return与print
开发语言·python
秋97 小时前
从 Python 后端工程师转型 AI Engineer(AI 工程化)的完整补课清单(2026实战版)
开发语言·人工智能·python
程序员二叉7 小时前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试
慕木沐8 小时前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
Roann_seo%8 小时前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
huangdong_9 小时前
淘宝商品SKU图自动分类技术深度解析:从DOM解析到智能归档
开发语言·javascript·ecmascript
阿正的梦工坊9 小时前
【Rust】12-借用检查器与非词法生命周期
开发语言·后端·rust
qq_2518364579 小时前
基于java Web网络订餐系统设计与实现 源码文档
java·开发语言·前端
秋910 小时前
3年经验Python后端转AI Engineer:3个月实战转型计划(2026版)
开发语言·人工智能·python
凡人叶枫10 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法