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

Mathcad最小化代码转SciPy报错:keep_feasible形状错误排查

问题分析与修复

报错ValueError: keep_feasible has a wrong shape的核心原因是**LinearConstraint的参数传递错误**。

LinearConstraint的正确调用格式为:

LinearConstraint(A, lb, ub, keep_feasible=None)

其中:

  • A是约束系数矩阵(每行对应一个线性约束)
  • lb是所有约束下限组成的一维数组(每个元素对应A中一行的约束下限)
  • ub是所有约束上限组成的一维数组(每个元素对应A中一行的约束上限)
  • keep_feasible是可选参数,仅用于指定是否保持约束可行性,默认值为None

你的代码错误地传入了三个数组V[0], V[1], V[2],第三个参数被误识别为keep_feasible,但它的形状不符合该参数的要求(需为布尔数组或None),因此触发了形状不匹配的报错。

修复后的代码

根据你提供的V结构,推测每个子列表的第一个元素是约束下限,第二个是约束上限(所有约束均为等式约束),修复后的代码如下:

from scipy.optimize import minimize
from scipy.optimize import LinearConstraint
import numpy as np

A = [[1, 1, 0, 1], [-1, -1, 1, 0], [0, 0, -1, -1]] 
V = [[1000, 1000], [0, 0], [-1000, -1000]]

# 提取每个约束的下限和上限
lb = [v[0] for v in V]
ub = [v[1] for v in V]

linear_constraint = LinearConstraint(A, lb, ub)
# 调整初始点到可行域内,避免算法收敛困难
x0 = np.array([500, 300, 800, 200])
f = [5e-9, 2e-9, 6e-8, 2e-8]

def func(x):
    return sum(f[i] * x[i]**3 for i in range(len(f)))

res = minimize(func, x0, method='SLSQP', constraints=[linear_constraint])

print(res.x)

额外提示

原代码中的初始点x0 = np.array([0.1,0.1,0.1,0.1])完全不满足约束条件(例如第一个约束计算结果为0.3,远小于1000),SLSQP算法可能因初始点离可行域过远而收敛失败。修复后的代码调整了初始点,确保其满足所有约束,能提升算法的收敛效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:57:28