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
相关产品推荐
相关产品推荐

