1.概念
定义:如果目标函数或约束条件中至少有一个是非线性函数时的最优化问题就叫做非线性规划问题.
其它情况: 求目标函数的最大值或约束条件为小于等于零的情况,都可通过取其相反数化为上述一般形式.
(1)二次规划
用MATLAB软件求解,其输入格式如下:
- x=quadprog(H,C,A,b);
- x=quadprog(H,C,A,b,Aeq,beq);
- x=quadprog(H,C,A,b,Aeq,beq,VLB,VUB);
- x=quadprog(H,C,A,b, Aeq,beq ,VLB,VUB,X0);
- x=quadprog(H,C,A,b, Aeq,beq ,VLB,VUB,X0,options);
- [x,fval]=quadprog(…);
- [x,fval,exitflag]=quaprog(…);
实例:
Matlab命令
H=[1 -1; -1 2];
c=[-2 ;-6];
A=[1 1; -1 2];
b=[2;2];
Aeq=[];
beq=[];
VLB=[0;0];
VUB=[];
[x,z]=quadprog(H,c,A,b,Aeq,beq,VLB,VUB)
运算结果为:x =0.6667 1.3333 z = -8.2222
(2)一般非线性规划
标准型为:
其中X为n维变元向量,G(X)与Ceq(X)均为非线性函数组成的向量,其它变量的含义与线性规划、二次规划中相同.
非线性规划求解的函数是fmincon,命令的基本格式如下:
x=fmincon(‘fun’,X0,A,b)
x=fmincon(‘fun’,X0,A,b,Aeq,beq)
x=fmincon(‘fun’,X0,A,b, Aeq,beq,VLB,VUB)
x=fmincon(‘fun’,X0,A,b,Aeq,beq,VLB,VUB,’nonlcon’)
x=fmincon(‘fun’,X0,A,b,Aeq,beq,VLB,VUB,’nonlcon’,options)
[x,fval]= fmincon(…)
[x,fval,exitflag]= fmincon(…)
[x,fval,exitflag,output]= fmincon(…)
1.fun为目标函数
2.x0为初始值
3.A是不等式约束AX<=b的系数矩阵
4.b是不等式约束AX<=b的常数项
4.Aeq是等式约束AeqX=beq的系数矩阵,
5.beq是等式约束AeqX=beq的常数项,
6.lb是X的下限,
7.ub是X的上限,
8.nonlcon为非线性不等式约束
9.option为设置fmincon的参数
注意:
fmincon函数提供了大型优化算法和中型优化算法。默认时,若在fun函数中提供了梯度(options参数的GradObj设置为’on’),并且只有上下界存在或只有等式约束,fmincon函数将选择大型算法。当既有等式约束又有梯度约束时,使用中型算法。
fmincon函数的中型算法使用的是序列二次规划法。在每一步迭代中求解二次规划子问题,并用BFGS法更新拉格朗日Hessian矩阵。
fmincon函数可能会给出局部最优解,这与初值X0的选取有关。
实例2
先建立M-文件 ex2.m:
function f=ex2(x);
f=-x(1)-2*x(2)+(1/2)*x(1)^2+(1/2)*x(2)^2
再建立主程序main2.m:
x0=[1;1];
A=[2 3 ;1 4]; b=[6;5];
Aeq=[];beq=[];
VLB=[0;0]; VUB=[];
[x,fval]=fmincon('ex2',x0,A,b,Aeq,beq,VLB,VUB)
运算结果为: x = 0.7647 1.0588 fval = -2.0294
实例3:
先建立M文件 ex3.m,定义目标函数:
function f=ex3(x);
f=exp(x(1)) *(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
再建立M文件ex31.m定义非线性约束:
function [g,ceq]=ex31(x)
g=[x(1)+x(2);1.5+x(1)*x(2)-x(1)-x(2);-x(1)*x(2)-10];
主程序main3.m为:
x0=[-1;1];
A=[];b=[];
Aeq=[1 1];beq=[0];
vlb=[];vub=[];
[x,fval]=fmincon('ex3',x0,A,b,Aeq,beq,vlb,vub,'ex31')
运算结果为:
x = -1.2250 1.2250 fval = 1.8951
实例4
function f=ex4(x)
f=x(1)^2+x(2)^2+10;
function [g,h]=ex40(x)
g=-x(1)^2+x(2);
h=-x(1)-x(2)^2+5; %约束等式
options=optimset;
[x,y]=fmincon('ex4',rand(2,1),[],[],[],[],zeros(2,1),[],'ex40',options)
输出结果:
x = 1.3794 1.9028 y = 15.5234