Model SEJR¶
Jeden z možných způsobů využití technik matematického modelování je simulace vývoje epidemie. Takový vývoj samozřejmě nelze popsat nikdy přesně a na efektivní popis by bylo potřeba odvodit mnohem sofistikovanější model. Nicméně pojďme si ukázat, že i za jistých zjednodušujících předpokladů lze odvodit relativně jednoduchý model, který sám o sobě není marný. Podíváme se na model SEIR.
Nejprve si představíme topologii modelu a jeho jednotlivé funkce. Předpokládejme, že se epidemie šíří tím způsobem, že se jednotlivec nejprve nakazí, ale ještě není infekční. Po určité době se nemoc rozjede a jednotlivec se stane infekčním (chcete-li, tak plně nakaženým). Poté buď skoná nebo se uzdraví. Budeme tedy operovat se čtveřicí skupin: S, E, I a R.
- Susceptibles $S(t)$ – skupina lidí, kteří nejsou nakaženi, ale jsou náchylní k nakažení
- Exposed $E(t)$ – Nakažení, ale ještě neinfekční lidí
- Infected $I(t)$ – Lidé, u kterých epidemi propukla naplno a jsou nakažliví
- Removed $R(t)$ – Skupina skonalých nebo vyléčených
Ke správnému popisu je nutné definovat míry s kterou dochází k přesunu jednotlivců z jedné skupiny do druhé. Nejefektivnější je definovat je jako procentuální změnu za jednotku času, chcete-li rychlost přechodu mezi skupinami. Při takém popisu dostaneme soustavu řídících rovnic
kde $\xi$ je míra změny z S do I (nakažlivost), $a$ je rychlost propuknutí infekčnosti a $\nu$ je míra s kterou se lidé zbavují infekce. Je dobré připomenout, že modelu je jedno, zda lidé ze skupiny R umírají nebo se vyléčí a stávají se již nenakazitelní. Na levé straně jsou časové derivace jednotlivých veličin, protože ty představují časovou změnu veličin. Např. rovnice $\frac{\partial E}{\partial t}=\xi S – aE$ říká, že skupina $E$ se zvětšuje nakažením lidí s mírou $\xi$ a $E$ se zmenšuje o ty, kteří se přesunou do skupiny $I$ s mírou $a$.
Model ještě doplníme o míru čerstvě se rodících $\mu_r$ a přirozeně umírajících $\mu_u$. Pro jednoduchost předpokládejme $\mu_r=\mu_u=\mu$. Přirozeně mohou umírat lidé z jakékoliv skupiny $S, E, I, R$, ale nově narozený se vždy stává členem skupiny $S$. Navíc ještě uvažujme, že míra $\xi$ je daná počtem kontaktů mezi lidmi a tedy pravděpodobnost nakažení roste, když se zvětšuje skupina $I$. Uvažujme tedy $\xi=\beta\frac{I}{N}$, kde $\beta$ je míra přenosu infekce vázaná právě na podíl $I/N$. Po úpravě a dosazení dostáváme
Implementace¶
Numericky vyčíslit řešení takové soustavy je v dnešní doba velmi lehká záležitost. Využijme nástroj ‚odeint‘, který je součásti balíku SciPy. Ten je přímo určen na řešení soustavy diferenciálních rovnic 1.řádu ve tvaru $\frac{\partial f}{\partial t}=g(t)$, tedy rovnic, kde první derivace je převedena na levou stranu, zbytek na pravou.
Nejprve importujeme příslušnou knihovnu a definujeme naši soustavu
import scipy.integrate as si
import numpy as np
import matplotlib.pyplot as plt
def evolution_equation(y, t, a, nu, N):
S, E, I, R = y
dydt = [-beta*S*I/N, beta*S*I/N - a*E, a*E - nu*I, nu*I]
return dydt
kde pole ‚y‘ představuje pole našich funkcí $S,E,I,R$ a ‚dydt‘ je pole pravých stran. Pokud je funkce zavedena přesně tímto způsobem, může být využit řešič ‚odeint‘ a jedním řádkem kódu vyřešena naše soustava.
R0 = 1.5
N = 1.0e7
nu = 1.0/3.0
beta = R0 * nu
a = 1.0 / 2.0
t_start = -5.0
t_end = 200.0
t_i = np.linspace(t_start, t_end, 10000)
dt = t_i[1] - t_i[0]
# Pocatecni podminka
y0 = [N, 0.0, 3.0, 0.0]
sol = si.odeint(evolution_equation, y0, t_i, args=(a, nu, N))
plt.title("Epidemiologicky vyvoj, N=1.0e7")
plt.plot(t_i, sol[:, 0], label="S")
plt.plot(t_i, sol[:, 1], label="E")
plt.plot(t_i, sol[:, 2], label="I")
plt.plot(t_i, sol[:, 3], label="R")
#plt.plot(t, sol[:, 0]+sol[:, 1]+sol[:, 2]+sol[:, 3], label="Tot")
plt.legend()
plt.show()