MATLAB非线性规划学习笔记

主要使用的MATLAB函数

非线性规划的MATLAB主要函数为fmincon,在MATLAB中的形式为:
MATLAB非线性规划学习笔记_第1张图片
MATLAB非线性规划学习笔记_第2张图片
它的返回值是向量x,其中 FUN 是用M 文件定义的函数 f (x);X0是x的初始值;
A,B,Aeq,Beq 定义了线性约束 A* X ≤ B, Aeq * X = Beq ,如果没有线性约束,则
A=[ ],B=[ ],Aeq=[ ],Beq=[ ];LB 和UB 是变量x 的下界和上界,如果上界和下界没有约
束,则LB=[],UB=[],如果x 无下界,则LB 的各分量都为-inf,如果x 无上界,则UB
的各分量都为 inf;NONLCON 是用M 文件定义的非线性向量函数C(x),Ceq(x);OPTIONS
定义了优化参数,可以使用Matlab 缺省的参数设置。
MATLAB非线性规划学习笔记_第3张图片

函数调用

options=optimset('largescale','off');
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[], 'fun2', options)

目标优化函数

function f=fun1(x)
f=sum(x.^2)+8;

约束条件

function [g,h]=fun2(x);
g=[-x(1)^2+x(2)-x(3)^2
x(1)+x(2)^2+x(3)^3-20]; %非线性不等式约束
h=[-x(1)-x(2)^2+2
x(2)+2*x(3)^2-3]; %非线性等式约束

结果
MATLAB非线性规划学习笔记_第4张图片
除了fmincon外,还有其他MATLAB内置函数用于求解非线性规划。如,fminbnd,quadprog,fseminf,fminmax等。

特殊求解方法

梯度法(最速下降法)

我们求解函数的最小值的时候,总是可以从当前点出发,每次都沿着当前点的梯度方向下降,这样就能够找到最低点。基本流程如下:
MATLAB非线性规划学习笔记_第5张图片
在这里插入图片描述
主函数如下

clc

x=[-1;-1];
[f0,g]=detaf(x);
r=[];
while norm(g)>0.0000001
p=g/norm(g);
t=0.1;f=detaf(x+t*p);
while f

求函数值及其梯度的函数如下

function [f,df]=detaf(x)
f=4.*x(1)+6.*x(2)-2.*x(1).^2-2.*x(1).*x(2)-2.*x(2).^2;
df=[4-4.*x(1)-2.*x(2)
6-2.*x(1)-4.*x(2)];

下图便是该题中通过梯度法找到的最高点。
MATLAB非线性规划学习笔记_第6张图片

牛顿法

Newton 法的优点是收敛速度快;缺点是有时不好用而需采取改进措施,此外,当
维数较高时,计算−[∇ 2 _{2} 2 f (x k _{k} k )] − 1 _{-1} 1的工作量很大。
其基本步骤如下:
MATLAB非线性规划学习笔记_第7张图片

clc,clear
x=[4;4];
[f0,g1,g2]=nwfun(x);
r=[];
while norm(g1)>0.00001
p=-inv(g2)*g1;p=p/norm(p);
t=0.1;f=nwfun(x+t*p);
while f>f0
t=t/2;f=nwfun(x+t*p);
end
x=x+t*p;
[f0,g1,g2]=nwfun(x);
r=[r;x',f0];
end
x,f0
x=-5:0.2:5;y=-5:0.2:5;
[xx,yy]=meshgrid(x,y);
z=xx.^4+25.*yy.^4+x(1).^2.*yy.^2;
surf(x,y,z)
hold on
plot3(r(:,1),r(:,2),r(:,3),'*','color','red')
function [f,df,d2f]=nwfun(x)
f=x(1)^4+25*x(2)^4+x(1)^2*x(2)^2;
df=[4*x(1)^3+2*x(1)*x(2)^2;100*x(2)^3+2*x(1)^2*x(2)];
d2f=[2*x(1)^2+2*x(2)^2,4*x(1)*x(2)
4*x(1)*x(2),300*x(2)^2+2*x(1)^2];

MATLAB非线性规划学习笔记_第8张图片

小结

本文给出了非线性规划的几种常用的解法,并给出了两个实例。
参考资料:数学建模算法与应用 司守奎,孙兆亮。
以及UESTC校内资料

你可能感兴趣的:(数学建模学习记录)