**Mise en garde! Cet article ne contient pas plus d'informations que ce que j'ai essayé. ** **
En réponse à la situation récente du COVID 19, je pense que divers modèles mathématiques de maladies infectieuses ont été évoqués, mais résolvons-le avec Python odeint et visualisons-le tel quel avec matplotlib. Cela semble gênant, mais vous ne devriez pas exprimer de sentiments à propos de COVID 19 à la suite de la mise en œuvre correcte de quelque chose dans cet article.
Alors, disons que le modèle SIR le plus simple à résoudre est
\begin{align}
\frac{\mathrm{d} S}{\mathrm{d} t} & = - \beta I S\\
\frac{\mathrm{d} I}{\mathrm{d} t} & = \beta I S - \gamma I\\
\frac{\mathrm{d} R}{\mathrm{d} t} & = \gamma I
\end{align}
Je vais le laisser tel quel. $ \ Beta $ est le taux d'infection (/ (personne x heures)), le nombre de personnes non transmises qui peuvent être infectées par unité de temps par personne malade, $ \ gamma $ est le taux de guérison ( / Heure), qui est l'inverse du temps nécessaire pour guérir. $ S $ est le nombre de personnes qui n'ont pas été infectées et ne sont pas capables d'infecter, $ I $ est le nombre de personnes qui sont infectées et ont la capacité d'en infecter d'autres, $ R $ est l'isolement, la guérison, la mort, etc. Le nombre de personnes qui ont été infectées ou qui ont perdu la capacité d'en infecter d'autres.
Python code Comme c'est gênant, j'ai mis un code solide sans aucune explication.
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button
def solve(value, t, foi, rr):
# fio = force of infection (beta)
# rr = recovery rate
S, I, R = value
dSdt = - foi * I * S
dIdt = foi * I * S - rr * I
dRdt = rr * I
return [dSdt, dIdt, dRdt]
span = 100
t = np.linspace(0, span, 256)
initial_value = [0.9, 0.1, 0] # initial values for S, I, R
solution = odeint(solve, initial_value, t, args = (0.5, 0.5))
fig, ax = plt.subplots(figsize=(12, 6))
plt.xlim(0, span)
plt.ylim(0, 1)
plt.subplots_adjust(bottom = 0.2)
data_S, = plt.plot(t, solution[:, 0], "blue", label = "Susceptible")
data_I, = plt.plot(t, solution[:, 1], "red", label = "Infectious")
data_R, = plt.plot(t, solution[:, 2], "orange", label = "Removed")
plt.legend(loc = "best")
rr_slider = Slider(plt.axes([0.2, 0.02, 0.65, 0.02]), "recovery rate", 0, 1, valinit = 0.5, valstep = 0.1)
foi_slider = Slider(plt.axes([0.2, 0.05, 0.65, 0.02]), "force of inf.", 0, 1, valinit = 0.5, valstep = 0.1)
def update(val):
rr = rr_slider.val
foi = foi_slider.val
solution = odeint(solve, initial_value, t, args=(foi, rr))
data_S.set_ydata(solution[:, 0])
data_I.set_ydata(solution[:, 1])
data_R.set_ydata(solution[:, 2])
fig.canvas.draw_idle()
rr_slider.on_changed(update)
foi_slider.on_changed(update)
plt.show()
Bien jouer. Si vous souhaitez résoudre l'équation différentielle en ondulant les paramètres, n'hésitez pas à nous contacter.
Recommended Posts