我在解一个有很多常数的非线性方程
我创建了一个用于解决以下问题的函数:
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
正在解包数据
并向terminalV
函数传递太多参数,因此我得到:
TypeError:terminalV()正好接受2个参数(给定6个)
那么,我的问题是,我是否可以通过某种方式将元组传递给fsolve()
调用的函数?
问题是需要使用星号来告诉函数重新打包元组。将参数作为元组传递的标准方法如下:
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 = (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)
像这样:
Vt = fsolve(terminalV, Vt0, args=[data])