MATLAB非线性规划学习笔记
主要使用的MATLAB函数
非线性规划的MATLAB主要函数为fmincon,在MATLAB中的形式为:


它的返回值是向量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 缺省的参数设置。

函数调用
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]; %非线性等式约束
结果

除了fmincon外,还有其他MATLAB内置函数用于求解非线性规划。如,fminbnd,quadprog,fseminf,fminmax等。
特殊求解方法
梯度法(最速下降法)
我们求解函数的最小值的时候,总是可以从当前点出发,每次都沿着当前点的梯度方向下降,这样就能够找到最低点。基本流程如下:


主函数如下
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<f0
t=t/2;
f=detaf(x+t*p);
end
x=x+t*p;
[f0,g]=detaf(x);
r=[r;x',f0];
end
x,f0
x=-1:0.05:2;y=-1:0.05:2;
[xx,yy]=meshgrid(x,y);
z=4.*xx+6.*yy-2.*xx.^2-2.*xx.*yy-2.*yy.^2;
surf(x,y,z)
hold on
plot3(r(:,1),r(:,2),r(:,3),'*','color','red')
求函数值及其梯度的函数如下
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)];
下图便是该题中通过梯度法找到的最高点。

牛顿法
Newton 法的优点是收敛速度快;缺点是有时不好用而需采取改进措施,此外,当
维数较高时,计算−[∇
2
_{2}
2 f (x
k
_{k}
k )]
−
1
_{-1}
−1的工作量很大。
其基本步骤如下:

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];

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