【问题标题】:Passing arguments to fsolve将参数传递给 fsolve
【发布时间】:2013-11-19 12:31:39
【问题描述】:

我正在求解一个包含许多常数的非线性方程。
我创建了一个解决问题的函数:

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() 调用的函数吗?

【问题讨论】:

    标签: python python-2.7 numpy scipy


    【解决方案1】:

    问题是您需要使用星号来告诉您的函数重新打包元组。将参数作为元组传递的标准方法如下:

    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)
    

    【讨论】:

    • 自动解包非常方便。使用星号也很棒,可以解决我的问题。非常感谢
    • 我怎样才能给 broyden1 函数额外的参数?
    【解决方案2】:

    像这样:

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

    【讨论】:

    • 是的,这有帮助,谢谢。但我必须在ro_p, ro, D_p, mi, g = (i for i in data) 中添加data[0] 我可以避免吗?
    • 这里的问题是您只是添加了另一层容器,因此您传递的是一个包含元组的列表,而不是使用正确的解包语法。 @user2965967,请参阅我的答案以获得更好的解释。
    猜你喜欢
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2011-01-06
    • 2013-07-19
    • 2020-05-02
    相关资源
    最近更新 更多