Я реализовал модель SIR с Python, и результат кажется правильным:
import scipy.integrate
import numpy
import matplotlib.pyplot as plt
def SIR_model(y,t,N,beta,gamma):
S,I,R=y
dS_dt=-beta*S*I/N
dI_dt=beta*S*I/N-gamma*I
dR_dt=gamma*I
return([dS_dt,dI_dt,dR_dt])
N=1000
I0=1
R0=0.0
S0=N-I0-R0
beta=0.2
gamma=0.1
t=numpy.linspace(0,160,160)
sol=scipy.integrate.odeint(SIR_model,[S0,I0,R0],t,args=(N, beta,gamma))
sol=numpy.array(sol)
plt.figure(figsize=[6,4])
plt.plot(t,sol[:,0],label="S(t)")
plt.plot(t,sol[:,1],label="I(t)")
plt.plot(t,sol[:,2],label="R(t)")
plt.grid()
plt.legend()
plt.xlabel("Time")
plt.ylabel("Number")
plt.title("SIR model")
plt.show()
Теперь я хочу согласовать реальные данные с моделью (https://github.com/pcm-dpc/COVID-19). Я знаю N0
, S0
, I0
, R0
, и мне нужно найти лучшие значения для beta
и gamma
. В моих предыдущих проектах я использовал данные о четко определенных функциях (я знал аналитическое выражение), но теперь я не знаю, как это сделать с результатами интегрированной системы. Я обычно использую функцию Numpy curve_fit
:
popt, pcov = curve_fit(f, x_list, y_list, sigma=y_err)
Как лучше всего это сделать? Несколько дней на github был хороший проект go, но теперь автор удалил его.