scipy.optimize.minimize多参数函数优化报错的排查与修复
问题分析与解决:scipy.optimize.minimize触发TypeError(缺少参数)
错误原因
scipy.optimize.minimize要求目标函数必须接受单个一维数组参数,数组元素对应各个待优化变量。若目标函数定义为dchi(a,b,c,d)(多个独立位置参数),调用minimize(dchi, first_guess)时,minimize会把first_guess数组整体传给第一个参数a,b、c、d无传入值,直接触发TypeError。
修复方法
将目标函数的参数改为单个数组,在函数内部解构出a、b、c、d;若需传递固定非优化参数,可配合minimize的args参数使用。
错误代码示例
import scipy as sp def dchi(a, b, c, d): # 示例:平方和函数,替换为你的实际计算逻辑 return (a-1)**2 + (b-2)**2 + (c-3)**2 + (d-4)**2 first_guess = [0, 0, 0, 0] result = sp.optimize.minimize(dchi, first_guess)
报错栈信息
TypeError Traceback (most recent call last) Cell In[1], line 9 6 return (a-1)**2 + (b-2)**2 + (c-3)**2 + (d-4)**2 8 first_guess = [0, 0, 0, 0] ----> 9 result = sp.optimize.minimize(dchi, first_guess) File ~/miniconda3/lib/python3.10/site-packages/scipy/optimize/_minimize.py:708, in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options) 705 res = _minimize_cg(fun, x0, args, jac, callback, **options) 706 elif meth == 'bfgs': 707 res = _minimize_bfgs(fun, x0, args, jac, callback, **options) --> 708 elif meth == 'nelder-mead': 709 res = _minimize_neldermead(fun, x0, args, callback, **options) 710 elif meth == 'powell': File ~/miniconda3/lib/python3.10/site-packages/scipy/optimize/_optimize.py:1055, in _minimize_neldermead(func, x0, args, callback, maxiter, maxfev, disp, return_all, initial_simplex, xatol, fatol, adaptive, **unknown_options) 1052 for k in range(N): 1053 sim[k][k] = nonzdelt -> 1055 fsim = np.array([func(x) for x in sim]) 1056 ind = np.argsort(fsim) 1057 fsim = np.take(fsim, ind, 0) File ~/miniconda3/lib/python3.10/site-packages/scipy/optimize/_optimize.py:1055, in <listcomp>(.0) 1052 for k in range(N): 1053 sim[k][k] = nonzdelt -> 1055 fsim = np.array([func(x) for x in sim]) 1056 ind = np.argsort(fsim) 1057 fsim = np.take(fsim, ind, 0) TypeError: dchi() missing 3 required positional arguments: 'b', 'c', and 'd'
修复后的代码
import scipy as sp def dchi(x): # 解构数组为单个参数 a, b, c, d = x return (a-1)**2 + (b-2)**2 + (c-3)**2 + (d-4)**2 first_guess = [0, 0, 0, 0] result = sp.optimize.minimize(dchi, first_guess) print("优化结果:") print(result.x) # 输出接近[1,2,3,4]的数组
带固定参数的扩展示例
若目标函数需传入固定非优化参数,可通过args传递:
def dchi(x, fixed_p1, fixed_p2): a, b, c, d = x return (a-fixed_p1)**2 + (b-2)**2 + (c-fixed_p2)**2 + (d-4)**2 # 传递固定参数(1,3) result = sp.optimize.minimize(dchi, first_guess, args=(1, 3))
内容的提问来源于stack exchange,提问作者Cansu
相关产品推荐
相关产品推荐

