Передача аргументов в fsolve

Я решаю нелинейное уравнение со многими константами.
Я создал функцию для решения таких задач, как:

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 и передавая слишком много аргументов

2 ответов


проблема в том, что вам нужно использовать звездочку, чтобы сообщить вашей функции, чтобы переупаковать кортеж. Стандартный способ передачи аргументов в виде кортежа следующий:

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)

вот так: Vt = fsolve(terminalV, Vt0, args=[data])