CVXPY添加两类约束求解可行性问题返回None的求助
为什么同时加入constraintsA和constraintsB后CVXPY返回None?
看起来你遇到的问题是整个约束系统完全不可行——也就是不存在同时满足constraintsA和constraintsB的X向量,这也是CVXPY返回None的核心原因。咱们一步步拆解来看:
第一步:简化constraintsA的实际约束
你的Ms全是零矩阵,所以原本的二次约束X.T * M * X + B * X + C == 0会直接退化成线性等式(二次项消失了):
B @ X + C == 0
展开后就是三个线性方程:
-18x₁ + 18x₄ + 270 = 0→ 简化为x₄ = x₁ - 15-36x₅ + 540 = 0→ 直接算出x₅ = 15-18x₃ -18x₆ +810 =0→ 简化为x₆ = 45 - x₃
第二步:代入constraintsB的约束找矛盾
现在把上面的结果代入constraintsB的线性约束,就能发现明显的矛盾:
- 从
As[0]的第二个约束-x₅ + x₆ =10:代入x₅=15和x₆=45-x₃,得到-15 + (45 -x₃)=10→ 算出x₃=20,进而x₂=x₃=20,x₆=25 - 从
As[1]的第一个约束-x₁ +x₂=20:代入x₂=20,得到x₁=0,进而x₄=0-15=-15 - 现在看
As[1]的第二个约束-x₄ +x₅=10:代入x₄=-15和x₅=15,得到15+15=30≠10——这里直接矛盾了! - 再看
As[2]的第一个约束-x₁ +x₃=-20:代入x₁=0和x₃=20,得到0+20=20≠-20,又是一个矛盾!
解决建议
- 先验证约束系统的可行性:可以把所有线性约束整理成
Ax = b的形式,用numpy的np.linalg.lstsq或者检查系数矩阵和增广矩阵的秩是否相等,如果不等就说明无解。 - 查看CVXPY的求解状态:不要只看
X.value,一定要打印prob.status,它会明确告诉你问题是INFEASIBLE(不可行)、OPTIMAL(最优)还是其他状态,比如:result = prob.solve() print("Problem status:", prob.status) print("X value:", X.value) - 规范矩阵乘法写法:在CVXPY中,矩阵乘法建议用
@而不是*(*是元素-wise乘法),虽然这里Ms全零不影响,但养成好习惯能避免后续二次约束的错误,比如把X.T * M * X改成X.T @ M @ X。
内容的提问来源于stack exchange,提问作者jnm
相关产品推荐
相关产品推荐

