请告诉我如何用以下变量解决我的问题
哪个解算器更好
目标函数=x^T Q x + C^T x
Q
是带有Q(i,i)>=0
的对角矩阵x.shape=(n,1)
相等约束:Aeq.x =beq
Aeq.shape=(n,n)
和beq.shape=(n,1)
下限和上限:lb <= x <= ub
import random
import numpy as np
lb.shape=(n,1) and ub.shape=(n,1)
I=np.eye(24)
Z=np.zeros((24,24))
a=0.012
b=1.1
gamma1=0.9/80
gamma2=1.1/80
MM=np.eye(24)
for i in range (22):
MM[i+1,i]=-1
MM[0,23]=-1
M=random.randint(200,300, size=(24,1))
max_pch=30.0
max_pdch=30.0
ppp=random.randint(150,200, size=(24,))
Q=np.asarray(np.bmat([[a*I,Z,Z,Z],[Z,a*I,Z,Z],[Z,Z,0.00001*I,Z],[Z,Z,Z,0.00001*I] ]))
C=np.asarray(np.bmat([[b*np.ones(24),b*np.ones(24),0*np.ones(24),ppp]]))
Aeq=np.asarray(np.bmat([[-I,I,Z,I], [-gamma1*I, gamma2*I,MM,Z],[Z,Z,Z,Z],[Z,Z,Z,Z]]))
beq=np.asarray(np.bmat([[M],[np.zeros((72,1))]]))
lb=np.asarray(np.bmat([[0*np.ones(24),0*np.ones(24),[0.1],0.1*np.ones(22),[0.9],0.0*np.ones(24)]]))
ub=np.asarray(np.bmat([[max_pch*np.ones(24),max_pdch*np.ones(24),[0.9],0.9*np.ones(22),[0.9],500*np.ones(24)]]))
x = solve_qp(P=Q, q=C.T.reshape((96,)),
G=None , h=None,
A=Aeq , b=beq.reshape(96,),
lb=lb.T.reshape((96,)) , ub=ub.T.reshape((96,)))
print("QP solution: x = {}".format(x))
有什么问题
x = None
Matlab中的相同代码(带有fmincon
)给出了正确的结果。然而,在Python中,我无法得到这个结果
似乎您正在使用来自qpsolvers的
solve_qp
函数。从软件包自述文件的常见问题:我用OSQP尝试了你的问题,解算器以“原始不可行”的状态退出。这意味着解算器能够解决您的问题,并找到一个证书,证明它没有解决方案。(我不知道
fmincon
返回了什么,但您需要检查它的结果是否满足所有约束Aeq * x == beq
和lb <= x <= ub
。)其他建议/您可以尝试的事项:
Aeq
和beq
的最后一行是零。在这种情况下,最好不要将这些行添加到问题中。有些解算器不能很好地处理0 * x == 0
行李>Aeq * x == beq
引起的(很可能是后者,因为lb
的问题似乎不可行)李>weight * || Aeq * x - beq ||^2
来放松硬等式约束。这样,问题始终是可行的,您可以使用权重参数来理解此约束的效果李>祝你学习顺利
如果您打印Q,您将看到它的行和列都是零。这使得矩阵Q不再严格正定(PD)。您可以使用允许半正定(PSD)矩阵的解算器(大多数QP解算器都允许,但不是您现在使用的解算器),也可以向所有零对角项添加一个小数字(例如1e-6)
相关问题 更多 >
编程相关推荐