Как решить дифференциальное уравнение? - PullRequest
1 голос
/ 11 июля 2020

Я хочу решить дифференциальное уравнение

dydt = r * (Y ** p) * (1 - (Y / K) ** alpha) 

Я пытался написать такой код:

def func(Y, r, p, K, alpha):
    dydt = r * (Y ** p) * (1 - (Y / K) ** alpha)
    return dydt
t = np.linspace(0, len(df), len(df))

# I used 1 to initialize my parameters ( is there a better way ?)
r = 1; p = 1; K = 1; alpha = 1 

y0 = r,p,K,alpha
ret = odeint(func, y0, t)

, но когда я пытаюсь выполнить третье block Я получаю

TypeError: fun c () отсутствуют 3 обязательных позиционных аргумента: 'p', 'K' и 'alpha'

Однако я пытался использовать ret = odeint(func, y0, t, args=(p,K, alpha)), но это привело к трем прямым линиям, тогда как уравнение должно возвращать кривую logisti c. как я могу попытаться ввести r в аргумент и почему мне нужно указать аргументы? как я могу получить окончательную форму (логистика c кривая)

Примечание: чтобы понять параметры: Y представляет совокупное количество случаев во время t, r - скорость роста на ранней стадии, а K - конечная эпидемия c размер. ∈ [0,1] - это параметр, который позволяет модели фиксировать различные профили роста, включая постоянную заболеваемость (? = 0), субэкспоненциальный рост (0 <? <1) и экспоненциальный рост (? = 1). </p>

1 Ответ

1 голос
/ 11 июля 2020
def func(Y, t, r, p, K, alpha):
    return r * (Y ** p) * (1 - (Y / K) ** alpha)

Вы должны добавить параметр t в метод ODEINT.

y0 = 0.5 # Your initial condition.
params = (1, 1, 1, 1) # r, p, K, alpha
sol = odeint(func, y0, t, args=params)

Из источника! Сципион ODEINT

...