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

