等式約束的二次規划問題一般形式是
其中
應用直接消去法求解:將A分塊,使其包含一個m×m非奇異矩陣AB,x,g做對應的分塊
帶入到等式約束條件中,可解得xB,再帶入q(x),於是二次規划問題轉化為無約束規划問題
這個二次規划問題有解析解
廣義消去法是消去法的一個推廣,將Rn划分成兩個空間:一個A的列的像空間V,一個AT的零空間K
設Y是V的一組基構成的n×m矩陣,Z是K的一組基構成的n×(n-m)矩陣,並且[Y Z]是正交矩陣
選取Y,Z滿足
令
根據約束條件,有
因此有
帶入一般形式,原問題轉化為無約束優化問題
可得到該無約束優化問題的解,從而得到原問題的解
下面給出代碼實現:
直接消去法
1 from numpy import * 2 3 def equation_constraint(G,g,A,b): 4 m=min(A.shape) 5 n=max(A.shape) 6 M = range(0, n) 7 E = range(0, m) 8 A_B = A[E,:] 9 I = setdiff1d(M, E) 10 A_N = A[I,:] 11 i=0 12 x = arange(0, n).astype(float) 13 while True: 14 if linalg.matrix_rank(A_B)==m: 15 break 16 else: 17 i+=1 18 E[m-i]+=1 19 I = setdiff1d(M, E) 20 A_B = A[E, :] 21 A_N = A[I, :] 22 G_BB=G[E,:][:,E] 23 G_AA=G[I,:][:,I] 24 G_AB=G[I,:][:,E] 25 G_BA=G[E,:][:,I] 26 g_B=g[E] 27 g_A=g[I] 28 invABAN=dot(A_N,linalg.inv(A_B)) 29 invABb=dot(linalg.inv(A_B).T,b) 30 G_hat=G_AA-dot(G_AB,invABAN.T)-dot(invABAN,G_BA)+dot(invABAN,dot(G_BB,invABAN.T)) 31 g_hat=g_A-dot(invABAN,g_B)+dot(G_AB-dot(invABAN,G_BB),-invABb) 32 x[E]=invABb+dot(dot(invABAN.T,linalg.inv(G_hat)),g_hat) 33 x[I]=-dot(linalg.inv(G_hat),g_hat) 34 return x