将参数传递给fsolve

时间:2013-11-07 17:52:26

标签: python python-2.7 numpy scipy

我正在解决一个有很多常数的非线性方程 我创建了一个解决方案,如:

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 个答案:

答案 0 :(得分:7)

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

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看到它的值,那么您必须解包{{1}有一个明星:

data

或单独传递值:

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

答案 1 :(得分:0)

像这样: Vt = fsolve(terminalV, Vt0, args=[data])