Реализация scipy.integrate.RK45 для модели SIR - PullRequest
0 голосов
/ 11 июля 2020

Я просмотрел документы для scipy.integrate.RK45, но не смог найти хороших примеров.

Я пытаюсь реализовать ODE для инфекционного заболевания с заранее заданными параметрами beta, f, gamma и начальными значения для групп населения (восприимчивые, подверженные воздействию, инфекционные, выздоровевшие) S0, E0, I0, R0. (Я опубликую эти значения, если мне нужно, но я думаю, что они не имеют отношения к моему вопросу.)

Я знаю, как реализовать scipy.integrate.odeint:

def SIR_model(y, t, f, beta, gamma):
    S, E, I, R = y
    dS = -beta*S*I 
    dE = beta*S*I - f*E 
    dI = f*E - gamma*I 
    dR = gamma*I
    return [dS, dE, dI, dR]

sol = scipy.integrate.odeint(SIR_model, [S0,E0,I0,R0], t, args=(f, beta,gamma))



выполняет свою работу. Моя цель прямо сейчас - использовать метод RK45. Я понял, что этот метод нужно реализовать по-другому, но у меня возникла ошибка, когда я попробовал следующее:

scipy.integrate.RK45(fun=SIR_model, t0 = t[0], y0 = [S0,E0,I0,R0],t_bound=t[-1])

# raised TypeError: SIR_model() missing 3 required positional arguments: 'f', 'beta', and 'gamma'
scipy.integrate.RK45(fun=SIR_model(y,t,f,beta,gamma), t0 = t[0], y0 = [S0,E0,I0,R0],t_bound=t[-1])

# raised TypeError: cannot unpack non-iterable NoneType object
y0 = [S0,E0,I0,R0]
scipy.integrate.RK45(fun=SIR_model(y0,t,f,beta,gamma), t0 = t[0], y0 = [S0,E0,I0,R0],t_bound=t[-1])

# raised TypeError: 'list' object is not callable

Любые предложения приветствуются.

1 Ответ

2 голосов
/ 11 июля 2020

Используйте solve_ivp с method="RK45", это в основном похоже на odeint с точки зрения автоматизации. Позаботьтесь о том, чтобы функции ODE в качестве первого аргумента требовалось t.

RK45 сам по себе является классом шагового двигателя, вам придется реализовать основное время l oop самостоятельно, что иногда обеспечивает большую гибкость.

См. Невозможно импортировать проблему X. Жесткий решатель ODE для модели Oregonator для более длинного примера с шаговым двигателем Radau.

...