求解隐式方程:如何正确编写scipy.optimize.fsolve调用代码?
正确调用scipy.fsolve的写法
原代码的问题
原调用语句chii = sp.optimize.fsolve(chiht(chi,3,1,1,1,1), 1)存在两个核心错误:
- 直接执行了
chiht(chi,...),但chi并未定义,会触发NameError;同时fsolve要求第一个参数是函数对象,而非函数执行后的返回值。 chiht函数除了待求解的chi,还有多个固定参数,需要通过正确方式传递给fsolve,不能直接在函数调用里硬塞。
两种正确写法
方法1:用lambda表达式包装函数
通过lambda绑定固定参数,只将chi作为fsolve的求解变量暴露出来:
chii = sp.optimize.fsolve(lambda chi: chiht(chi, 3, 1, 1, 1, 1), 1)
方法2:利用fsolve的args参数传递额外参数
fsolve支持通过args参数传入函数的固定参数,参数顺序要和chiht定义中除chi外的参数顺序一致:
chii = sp.optimize.fsolve(chiht, 1, args=(3, 1, 1, 1, 1))
修正后的完整代码示例
import scipy as sp import numpy as np TC=315 H=1000 def chiht(chi, T, a, b, gamma, beta): global H, TC return a*(T-TC)*chi**(1/gamma)+b*chi**(1/gamma)*chi**(1/beta)*H**(1/beta)-1 # 两种写法二选一即可 # chii = sp.optimize.fsolve(lambda chi: chiht(chi, 3, 1, 1, 1, 1), 1) chii = sp.optimize.fsolve(chiht, 1, args=(3, 1, 1, 1, 1)) print(chii) print(chiht(chii,3,1,1,1,1))
内容的提问来源于stack exchange,提问作者Mam Mam
相关产品推荐
相关产品推荐

