【例】求如下二次规划问题。
【分析】首先应该把目标函数表示成如下矩阵形式:
这里要细说一下如何写成矩阵形式。
首先,向量x是很容易写出的,因为f(x)包含两个变量x1和x2,因此
其次,向量f只与两个变量x1和x2的一次项有关,所以fTx=-2x1-6x2,因此
最后,矩阵H只与两个变量x1和x2的二次项有关,所以,这里要注意的是不同于二次型,这里有个系数1/2,所以矩阵H的元素是二次型中的矩阵元素大小的两倍。给出一个规律:设矩阵H第i行第j列的元素大小为H(i,j),二次项xixj的系数为a(i,j),则
本例中,,这是由于x1的平方项(即x1x1)系数为1/2,所以第1行第1列的元素为1=2*(1/2),x2的平方项(即x2x2)系数为1,所以第2行第2列的元素为2=2*1,x1x2项(即x2x1)的系数为-1,所以第1行第2列和第2行第1列的元素均为-1。
目标函数搞定之后,下面来看约束条件部分,约束条件应该写成如下形式:
本例中约束条件只有不等式约束,因此Aeq和beq为空,对于A和b很容易就可以得出来:
而约束条件中对变量x1和x2只给出下限,没有给上限,因此ub为空,
得到了所有的参数,将参数输入MATLAB,编程如下:(代码是直接在Command Window中一行一行录入的,所以每行前面有符号“>>”)
>> H = [1 -1; -1 2];
>> f = [-2; -6];
>> A = [1 1; -1 2; 2 1];
>> b = [2; 2; 3];
>> lb = [0; 0];
>> [x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb)
输出以下结果:
Warning: Large-scale algorithm does not currently solve this problem formulation,
using medium-scale algorithm instead.
> In quadprog at 291
Optimization terminated.
x =
0.6667
1.3333
fval =
-8.2222
exitflag =
1
output =
iterations: 3
constrviolation: 0
algorithm: 'medium-scale: active-set'
firstorderopt: []
cgiterations: []
message: 'Optimization terminated.'
lambda =
lower: [2x1 double]
upper: [2x1 double]
eqlin: [0x1 double]
ineqlin: [3x1 double]
参考文献:
【1】孙文瑜, 徐成贤,朱德通.最优化方法(第二版)[M]. 北京:高等教育出版社, 2010.
【2】龚纯,王正林. 精通MATLAB最优化计算[M].北京: 电子工业出版社,2009.
【3】lnsunqingshen, 464518439.什么是凸二次规划, 百度知道,2011-06-20.
【4】李明强.几类特殊凸二次规划问题的求解算法研究[D].山东科技大学,2013 .
【5】于绍慧.边界约束凸二次规划的求解[D].南京航空航天大学,2005.
参考:https://blog.csdn.net/jbb0523/article/details/50598641
https://blog.csdn.net/tianzy16/article/details/87916128