二次規劃問題和MATLAB函數quadprog的使用

二次規劃(Quadratic Programming,QP)問題的一般形式爲:

其中,c=\left(c_{1}, c_{2},\dots, c_{n}\right)^{\mathbf{T}}b爲純量,Gn\times n階對稱矩陣。易知二次規劃的Hesse矩陣等於G。如果爲半正定矩陣,則稱此規劃爲凸二次規劃,否則爲非凸規劃。對於凸二次規劃,目標函數q(x)是一個凸函數。如果有至少一個向量x滿足約束而且q(x)在可行域有下界,二次規劃問題就有一個全局最小值x。 如果G是正定矩陣,則稱此規劃爲嚴格凸二次規劃,此時全局最小值就是唯一的。如果G=0,二次規劃問題就變成線性規劃問題。根據優化理論,一個點x 成爲全局最小值的必要條件是滿足Karush-Kuhn-Tucker(KKT)條件。當q(x)是凸函數時,KKT條件也是充分條件。


根據約束條件的不同,二次規劃可分爲等式約束二次規劃問題和不等式約束二次規劃問題。等式約束二次規劃問題即只含有等式約束,常見的解法有直接消去法、廣義消去法、拉格朗日(Lagrange)法;對於不等式約束二次規劃問題,其基本思想是把不等式約束轉化爲等式約束再求解,常見解法有有效集(active set)方法,有效集方法在每步迭代中把有效約束作爲等式約束,然後可以用拉格朗日法求解,重複直到求得最優解。

        很多學者專門研究各類二次規劃的求解方法,如文獻[4][5],對於非數學專業的的人來講更重要的是怎麼把二次規劃當作一個工具去使用它。

【例】求如下二次規劃問題。

\min f(x)=\frac{1}{2} x^{2}+x_{2}^{2}-x_{1} x_{2}-2 x_{1}-6 x_{2},st\left\{\begin{array}{l}{x_{1}+x_{2} \leq 2} \\ {-x_{1}+2 x_{2} \leq 2} \\ {2 x_{1}+x_{2} \leq 3} \\ {x_{1}, x_{2} \geq 0}\end{array}\right.

【分析】首先應該把目標函數表示成如下矩陣形式:

                                                              f(x)=\frac{1}{2} x^{T} H x+g^{T} x

這裏細說一下如何寫成矩陣形式。(根據規劃問題求解H矩陣可以用hessian函數直接求得,後面會說)

        首先,向量x是很容易寫出的,因爲f(x)包含兩個變量x1和x2,因此

                                                                 \boldsymbol{x}=\left[ \begin{array}{l}{x_{1}} \\ {x_{2}}\end{array}\right]

       其次,向量f只與兩個變量x1和x2的一次項有關,所以g^{T} x=-2 x_{1}-6 x_{2},因此

                                                              g=\left[ \begin{array}{l}{-2} \\ {-6}\end{array}\right]

最後,矩陣H只與兩個變量x1和x2的二次項有關,所以\frac{1}{2} x^{x} H x=\frac{1}{2} x_{1}^{2}+x_{2}^{2}-x_{1} x_{2}​​​​​​​,這裏要注意的是不同於二次型,這裏有個係數1/2,所以矩陣H的元素是二次型中的矩陣元素大小的兩倍。給出一個規律:設矩陣H第i行第j列的元素大小爲H(i,j),二次項xixj的係數爲a(i,j),則

                                                          H(i, j)=\left\{\begin{array}{ll}{2 a(i, j)} & {, i=j} \\ {a(i, j)} & {, i \neq j}\end{array}\right.

本例中,,這是由於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。

        目標函數搞定之後,下面來看約束條件部分,約束條件應該寫成如下形式:

                                                          \left\{\begin{matrix}A \bullet x \leq b \\ A_{\mathrm{eq}} \bullet x=b_{\mathrm{eq}} \\ lb \leq x \leq ub \end{matrix}\right.

本例中約束條件只有不等式約束,因此Aeq和beq爲空,對於A和b很容易就可以得出來:

                                               A=\left[ \begin{array}{cc}{1} & {1} \\ {-1} & {2} \\ {2} & {1}\end{array}\right], b=\left[ \begin{array}{c}{2} \\ {2} \\ {3}\end{array}\right]

 而約束條件中對變量x1和x2只給出下限,沒有給上限,因此ub爲空,\boldsymbol{b}=\left[ \begin{array}{l}{\mathbf{0}} \\ {\mathbf{0}}\end{array}\right]

得到了所有的參數,將參數輸入MATLAB,編程如下:(代碼是直接在Command Window中一行一行錄入的,所以每行前面有符號“>>”)

>> H = [1 -1; -1 2];
>> g= [-2; -6];
>> A = [1 1; -1 2; 2 1];
>> b = [2; 2; 3];
>> lb = [0; 0];
>> [x,fval,exitflag,output,lambda] = quadprog(H,g,A,b,[],[],lb)

輸出結果,此處只展示x;x = 0.6667 1.3333

取H的簡單方法

H = hessian(f,[x,y]);其中f爲求解方程,[x,y]爲變量,

注意需要轉換爲double類型:H = double(H);

求解一次項係數 F 
% fexp = expand(f); 
fcol = collect(f,{‘x’,’y’}); % x^2 - 4*x + y^2 - 6*y + 18 
disp(fcol); 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章