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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:12:36