You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

展开后就是三个线性方程:

  1. -18x₁ + 18x₄ + 270 = 0 → 简化为 x₄ = x₁ - 15
  2. -36x₅ + 540 = 0 → 直接算出 x₅ = 15
  3. -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,又是一个矛盾!

解决建议

  1. 先验证约束系统的可行性:可以把所有线性约束整理成Ax = b的形式,用numpy的np.linalg.lstsq或者检查系数矩阵和增广矩阵的秩是否相等,如果不等就说明无解。
  2. 查看CVXPY的求解状态:不要只看X.value,一定要打印prob.status,它会明确告诉你问题是INFEASIBLE(不可行)、OPTIMAL(最优)还是其他状态,比如:
    result = prob.solve()
    print("Problem status:", prob.status)
    print("X value:", X.value)
    
  3. 规范矩阵乘法写法:在CVXPY中,矩阵乘法建议用@而不是*(*是元素-wise乘法),虽然这里Ms全零不影响,但养成好习惯能避免后续二次约束的错误,比如把X.T * M * X改成X.T @ M @ X。

内容的提问来源于stack exchange,提问作者jnm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:00:49