scipy.optimize.root_scalar多数组参数传参报错,求正确传参方式
问题分析与解决
错误原因
- 参数传递冲突:
scipy.optimize.root_scalar的位置参数中,第二个参数是args,你直接把初始猜测值guess作为位置参数放在f后面,又显式传递了args=(m_l,m_B),导致args被重复赋值,触发multiple values错误。 - 函数参数顺序错误:
root_scalar会将待求解的变量(即你的y)作为第一个参数传递给目标函数f和导函数df,但你定义的函数把y放在了最后一位,导致参数匹配失败。
修正方案
步骤1:调整函数参数顺序
把待求解的y放在函数的第一个参数位置:
import numpy as np from scipy import optimize def f(y, m_l, m_B): value = -1.0 + np.sum(m_l * np.exp(-m_B * y)) return value def df(y, m_l, m_B): value = -np.sum(m_B * m_l * np.exp(-m_B * y)) return value
步骤2:正确调用root_scalar
用关键字参数x0传递初始猜测值,避免和args的位置参数冲突:
m_l = np.array([0.0036132256153053369, 0.95110068028445593]) m_B = np.array([0.48884897299905006, 0.95605658765269563]) guess = -0.048557088449677460 root = optimize.root_scalar( f, x0=guess, fprime=df, args=(m_l, m_B), method='newton', rtol=1e-9, maxiter=1000 ) # 查看求解结果 print(root)
关键说明
x0是root_scalar中指定初始猜测值的关键字参数,必须显式指定,不能用位置参数传递,否则会和args的位置冲突。- 目标函数和导函数的第一个参数必须是待求解的变量,后续参数通过
args传递,root_scalar会自动将args中的参数依次传递给函数的后续位置。
内容的提问来源于stack exchange,提问作者user1612986
相关产品推荐
相关产品推荐

