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

使用scipy.optimize.minimize(SLSQP)时遇ValueError问题求助

解决Scipy minimize(SLSQP)的ValueError问题

错误根源

问题出在变量边界的定义上:

  • Scipy的minimize函数要求bounds参数的每个元素必须是二元组(下限, 上限),用来限定单个变量的取值范围
  • 你代码里的b = (1, 0, 5, 0)是四元组,bnds = (b,b,b,b)相当于给每个变量传递了四元组,SLSQP解析边界时试图拆成2个值(下限和上限),因此触发ValueError: too many values to unpack (expected 2)

结合书中预期结果里变量的取值范围,推测你原本想设置每个变量的下限为1、上限为5,所以需要修正边界定义。

修正后的完整代码

from scipy.optimize import minimize

def objective(x):
    x1 = x[0]
    x2 = x[1]
    x3 = x[2]
    x4 = x[3]
    return x1*x4*(x1+x2+x3)+x3

def constraint1(x):
    return x[0]*x[1]*x[2]*x[3]-25.0

def constraint2(x):
    sum_sq = 40
    for i in range(4):
        sum_sq = sum_sq - x[i]**2
    return sum_sq

x0 = [1, 5, 5, 1]

print(objective(x0))

# 修正:每个变量的边界为(下限1, 上限5)
b = (1, 5)
bnds = (b, b, b, b)
con1 = {'type':'ineq', 'fun':constraint1}
con2 = {'type':'ineq', 'fun':constraint2}
cons = [con1, con2]

sol = minimize(objective, x0, method='SLSQP', bounds=bnds, constraints=cons)

print(sol)

运行结果

执行修正后的代码,将得到与书中一致的优化结果:

fun: 17.01401724549506
jac: array([14.57234096,  1.37924648,  2.37924648,  9.56414363])
message: 'Optimization terminated successfully.'
nfev: 30
nit: 5
njev: 5
status: 0
success: True
x: array([1.        , 4.74299607, 3.82115466, 1.37940765])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:45:48