传递参数给fsolve

18

我正在解决一个有许多常量的非线性方程。
我创建了一个用于解决的函数,如下所示:

def terminalV(Vt, data):
    from numpy import sqrt
    ro_p, ro, D_p, mi, g = (i for i in data)
    y = sqrt((4*g*(ro_p - ro)*D_p)/(3*C_d(Re(data, Vt))*ro)) - Vt
    return y

然后我想要做:

data = (1800, 994.6, 0.208e-3, 8.931e-4, 9.80665)
Vt0 = 1
Vt = fsolve(terminalV, Vt0, args=data)

但是fsolve解包了data,并将太多的参数传递给terminalV函数,因此我会得到以下错误:

TypeError: terminalV()接受2个参数,但提供了6个

所以,我的问题是:我能否以某种方式向fsolve()调用的函数传递一个元组?

2个回答

24
问题在于您需要使用星号告诉函数重新封装元组。将参数作为元组传递的标准方法如下:
from numpy import sqrt   # leave this outside the function
from scipy.optimize import fsolve

#  here it is     V
def terminalV(Vt, *data):
    ro_p, ro, D_p, mi, g = data   # automatic unpacking, no need for the 'i for i'
    return sqrt((4*g*(ro_p - ro)*D_p)/(3*C_d(Re(data, Vt))*ro)) - Vt

data = (1800, 994.6, 0.208e-3, 8.931e-4, 9.80665)
Vt0 = 1
Vt = fsolve(terminalV, Vt0, args=data)

如果没有使用fsolve,例如您只想单独调用terminalV,例如您想在Vt0处查看其值,则必须使用星号解包data

data = (1800, 994.6, 0.208e-3, 8.931e-4, 9.80665)
Vt0 = 1
terminalV(Vt0, *data)

或者逐个传递值:

terminalV(Vt0, 1800, 994.6, 0.208e-3, 8.931e-4, 9.80665)

自动解包非常方便。此外,使用星号也很棒,解决了我的问题。非常感谢。 - Ricevind
我如何给broyden1函数传递额外的参数? - eduardosufan

0

就像这样:

Vt = fsolve(terminalV, Vt0, args=[data])

是的,那很有帮助,谢谢您。但我不得不在 ro_p、ro、D_p、mi、g = (i for i in data) 中添加 data[0],我能避免吗? - Ricevind
1
问题在于你只是添加了另一个容器层,因此你传递的是一个包含元组的列表,而不是使用正确的解包语法。@user2965967,请查看我的答案以获得更好的解释。 - askewchan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接