等式约束的二次规划问题
等式约束的二次规划问题一般形式是
其中
应用直接消去法求解:将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