本系列教程来源于出版书籍《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968@qq.com。 出版社:人民邮电出版社, 页数:525。
本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:156204968@qq.com
11.2.4 二次规划问题
二次规划问题在Matlab优化工具箱中可以表示为:
标准的二次规划问题形式要求目标函数是关于优化变量的二次函数,而约束条件只包含线性等式不等式约束和优化变量自身的上下限约束。对于二次规划问题,如果将目标函数看着非线性函数,那么二次规划问题则可以使用fmincon
函数来进行求解。在Matlab优化工具箱中,提供了quadprog
函数,求解具有标准二次规划形式的问题。quadprog
函数的调用格式如下:
x = quadprog(H,f,A,b)
x = quadprog(H,f,A,b,Aeq,beq)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval] = quadprog(...)
[x,fval,exitflag] = quadprog(...)
[x,fval,exitflag,output] = quadprog(...)
[x,fval,exitflag,output,lambda] = quadprog(...)
在quadprog
函数输入变量中,H和f分别为二次项系数矩阵和一次项系数向量。在对二次规划问题求解时,首先需要将目标函数转化为二次规划问题标准形式,得到系数矩阵H和系数向量f。quadprog函数退出标志exitflag及相应含义描述如表11.8所示。
表11.8 quadprog函数退出标志exitflag及相应含义描述
exitflag标志 | 含义描述 |
---|---|
1 | 目标函数收敛于最优解 |
3 | 目标函数的变化小于给定的容差TolFcn |
4 | 找到局部极小值点 |
0 | 迭代次数超过最大迭代次数MaxIter |
-2 | 求解问题无可行解 |
-3 | 求解问题无边界 |
-4 | 当前搜索方向不是下降方向,搜索过程结束 |
-7 | 搜索方向幅值太小,搜索过程结束 |
【例11.8】求解二次规划问题:
对于二次规划问题,首先必须将目标函数转化为标准形式,得到二次项系数矩阵和一次项系数向量。
然后在Matlab命令窗口中输入以下程序段:
H=[2 -1;-1 2]; %标准变换后的H矩阵
f=[-10;4]; %标准变换后的f向量
lb=zeros(2,1); %下限约束
A=[-1 -1]; %线性不等式系数矩阵
b=-8; %线性不等式右侧常数向量
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[ ],[ ],lb) %二次规划求解
返回结果如下:
x =
6.3333
1.6667
fval =
-24.3333
exitflag =
1
退出标志exitflag表明函数收敛与极值点。同样,将目标函数看着是非线性函数时,可以使用fmincon函数对二次规划问题进行求解,程序代码如下:
A=[-1 -1];
b=[-8];
lb=[0 0];
x0=[0;0];
fun=@(x)(x(1)^2-10*x(1)-x(1)*x(2)+x(2)^2-4*x(2)); %@函数句柄
options=optimset('Display','iter','MaxFunEvals',1e5);
[x,fval,exitflag,output,lambda,grad,hessian]=fmincon(fun,x0,A,b,[],[],lb,[],[],options)
返回结果,显示的迭代过程如下:
max Line search Directional First-order
Iter F-count f(x) constraint steplength derivative optimality Procedure
0 3 0 8 Infeasible
1 6 -40 -4 1 36 6 start point
2 10 -50.7721 -6.9 0.5 0.864 1.57
3 13 -51.9816 -5.743 1 0.337 0.204
4 16 -52 -6 1 4.26e-008 4.45e-006
经过4代迭代后,方向导数为4.26e-8,因此搜索方向导数过小导致搜索过程结束,退出标志exitflag=5。输出结果如下:
x =
8.0000
6.0000
fval =
-52.0000
exitflag =
5
由于fmincon函数退出标志exitflag=5,因此无法判断此求解结果是否为全局极值点,但是比较fmincon函数和quadprog函数二者求解结果可以看出,fmincon函数的求解结果比quadprog函数要好。
【例11.9】求解二次规划问题
该二次规划问题中,约束条件同时包含了线性等式约束和线性不等式约束。首先同样需要将目标函数转化为标准形式,得到系数矩阵和向量,通过变换,很容易得到:
使用quadprog函数求解二次规划问题程序代码如下:
H=[4 -1 0;-1 2 0;0 0 2]; %二次规划标准变换后的H矩阵
f=zeros(3,1); %二次规划标准变换后的f矩阵
lb=zeros(3,1); %优化变量的下限约束
A=[1 1 0]; %线性不等式的系数矩阵
b=4; %线性不等式右侧常数向量
Aeq=[5 0 1]; %等式约束的系数矩阵
beq=[10]; %等式约束右侧常数向量
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,Aeq,beq,lb)
返回结果为:
x =
1.8692
0.9346
0.6542
fval =
6.5421
exitflag =
1
使用fmincon函数同样可以对二次规划问题进行求解,只需要在命令行窗口中输入以下程序段即可:
A=[1 1 0];
b=4;
Aeq=[5 0 1];
beq=[10];
lb=zeros(3,1);
x0=[1;1;1];
fun=@(x)(2*x(1)^2-x(1)*x(2)+x(2)^2+x(3)^2); %@函数
options=optimset('Display','iter','MaxFunEvals',1e5); %优化过程属性选项的设置
[x,fval,exitflag,output,lambda,grad,hessian]=fmincon(fun,x0,A,b,Aeq,beq,lb,[],[],options)
返回结果为:
x =
1.8691
0.9347
0.6543
fval =
6.5421
exitflag =
5
对比quadprog函数求解结果和fmincon函数的求解结果,可以看出对于例11.9所示的二次规划问题,两个函数的求解结果完全相同。
作者:德特数据
联系方式:156204968@qq.com