[PYTHON] Mettre en œuvre le modèle mathématique «modèle SIR» des maladies infectieuses dans OpenModelica (reflétant le taux de mortalité et de réinfection)

Essayez d'ajouter les taux de mortalité et de réinfection au modèle SIR de base

Mortalité et réinfection dans la classe cl_SIRbetaInput créée dans l'article précédent, "Implémentation d'un modèle mathématique" modèle SIR "de maladies infectieuses avec OpenModelica" Créons une version complète avec le taux ajouté.

Prérequis pour ce modèle ――Un certain pourcentage de personnes meurent d'être infectées pour guérir

** Veuillez noter que toutes les simulations suivantes ne sont que la vérification du modèle avec des paramètres temporaires et ne reflètent ni n'anticipent les valeurs réelles. ** **

Créez la classe cl_SIRreinfect avec la mortalité ajoutée à la classe cl_SIRbetaInput.

"Dying_rate = taux de mortalité" peut être défini comme paramètre. La valeur par défaut est 0,01 (1%).

parameter Real dying_rate = 0.01 "Dying rate";

La partie d'équation supplémentaire est la suivante Lors de la transition de I (personne infectée) à R (personne de rétablissement), le nombre de guérisseurs devient la mort proportionnellement au taux de mortalité, et les autres deviennent des «personnes de rétablissement de survie».

equation
  der(Rdead) = Iy * gamma_const * dying_rate;
//  der(Rdead) = der(Ry) * dying_rate;
  Rlive = Ry - Rdead;

Ajouter plus de taux de réinfection

Pour la formule envisageant la réinfection, reportez-vous à «Étude du nouveau virus Corona du modèle mathématique R et pandémique (COVID-19) comme exemple». J'ai fait. Si ρ est le taux de réinfection, la formule suivante est obtenue.

\begin{align}

\frac{dS}{dt} &= -\beta SI + ρ R\\
\frac{dI}{dt} &=  \beta SI -\gamma I \\
\frac{dR}{dt} &=  \gamma I - ρ R\\

\end{align}

Vous permet de définir "reinfect_rate = taux de réinfection" comme paramètre. La valeur par défaut est 0,001 (0,1%).

parameter Real reinfect_rate = 0.001 "Reinfection rate";

La partie d'équation supplémentaire est la suivante Lors de la transition de I (personne infectée) à R (personne de rétablissement), le nombre de guérisseurs devient la mort proportionnellement au taux de mortalité, et les autres deviennent des «personnes de rétablissement de survie». Parmi les «récupérateurs de survie», S (potentiellement infectieux) se déplace proportionnellement au taux de réinfection, et R (récupération) diminue en conséquence.

equation
  der(Sy) = (-contact_rate * Sy * Iy) + Rlive * reinfect_rate;
  der(Iy) = contact_rate * Sy * Iy - Iy * gamma_const;
  der(Ry) = Iy * gamma_const - Rlive * reinfect_rate;
  Inew = contact_rate * Sy * Iy;

Le code entier ressemble à ceci.

class cl_SIRreinfect
  extends Modelica.Blocks.Icons.Block;
  parameter Real gamma_const = 0.2 "Recovery rate (1/day)";
  parameter Real reinfect_rate = 0.001 "Reinfection rate";
  parameter Real dying_rate = 0.01 "Dying rate";
  Modelica.Blocks.Interfaces.RealInput Si "Connector of initial S(Susceptible)" annotation(
    Placement(visible = true, transformation(origin = {-120, 60}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-120, 62}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
  Modelica.Blocks.Interfaces.RealInput Ii "Connector of initial I (Infectious)" annotation(
    Placement(visible = true, transformation(origin = {-120, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-120, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
  Modelica.Blocks.Interfaces.RealInput Ri "Connector of initial R (Removed)" annotation(
    Placement(visible = true, transformation(origin = {-120, -60}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-120, -62}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
  Modelica.Blocks.Interfaces.RealOutput Sy "Output connector of S(Susceptible)" annotation(
    Placement(visible = true, transformation(origin = {110, 60}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, 62}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Blocks.Interfaces.RealOutput Iy "Output connector of I (Infectious)" annotation(
    Placement(visible = true, transformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Blocks.Interfaces.RealOutput Ry "Output connector of R (Removed)" annotation(
    Placement(visible = true, transformation(origin = {110, -60}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, -60}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Blocks.Interfaces.RealInput contact_rate "Connector of infectious rate" annotation(
    Placement(visible = true, transformation(origin = {0, 120}, extent = {{-20, -20}, {20, 20}}, rotation = -90), iconTransformation(origin = {0, 120}, extent = {{-20, -20}, {20, 20}}, rotation = -90)));
  Modelica.Blocks.Interfaces.RealOutput Inew "Output connector of New I(Infectious)" annotation(
    Placement(visible = true, transformation(origin = {-60, -110}, extent = {{-10, -10}, {10, 10}}, rotation = -90), iconTransformation(origin = {-60, -110}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
  Modelica.Blocks.Interfaces.RealOutput Rlive "Output connector of R (Live)" annotation(
    Placement(visible = true, transformation(origin = {60, -110}, extent = {{-10, -10}, {10, 10}}, rotation = -90), iconTransformation(origin = {60, -110}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
  Modelica.Blocks.Interfaces.RealOutput Rdead "Output connector of R (Dead)" annotation(
    Placement(visible = true, transformation(origin = {0, -110}, extent = {{-10, -10}, {10, 10}}, rotation = -90), iconTransformation(origin = {0, -110}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
initial equation
  Sy = Si;
  Iy = Ii;
  Ry = Ri;
  Rdead = 0;
equation
  der(Sy) = (-contact_rate * Sy * Iy) + Rlive * reinfect_rate;
  der(Iy) = contact_rate * Sy * Iy - Iy * gamma_const;
  der(Ry) = Iy * gamma_const - Rlive * reinfect_rate;
  Inew = contact_rate * Sy * Iy;
  der(Rdead) = Iy * gamma_const * dying_rate;
//  der(Rdead) = der(Ry) * dying_rate;
  Rlive = Ry - Rdead;
  annotation(
    Diagram,
    Icon(coordinateSystem(initialScale = 0.1), graphics = {Text(origin = {-62, 53}, extent = {{-52, 29}, {174, -133}}, textString = "SIR\nReI")}));
end cl_SIRreinfect;

Résultats de la simulation, y compris le taux de mortalité et le taux de réinfection

Simulation avec seulement la mortalité

En utilisant le cl_SIRreinfect créé, créez un modèle mdl_SIRmodel_reinfect et simulez-le. Aucun vaccin n'est utilisé ici. 20_SIR_full_model.png

Pour plus de clarté, nous allons fixer le taux de mortalité à 20% assez élevé et simuler. 21_SIR_full_model_prm.png

En conséquence, le nombre de décès a convergé vers environ 18% du total. 22_SIR_full_dead_graph.png

Simulation en définissant uniquement le taux de réinfection

Ensuite, simulons avec un modèle dans lequel seul le taux de réinfection est défini. Essayez un taux de réinfection supérieur de 1%. 23_SIR_full_model_prm.png

24_SIR_full_reinfect_graph.png

Dans la simulation jusqu'à 100 jours, le nombre de personnes infectieuses continue d'augmenter et il n'est pas possible de voir ce qui se passera à l'avenir. Si vous essayez de simuler jusqu'à 500 jours, tous les S, I et R convergeront progressivement tout en vibrant. En regardant I (nombre de personnes infectées), vous pouvez voir qu'il y a des 2e et 3e vagues. 25_SIR_full_reinfect_graph.png

Essayez de définir les taux de mortalité et de réinfection

Essayez de régler les deux paramètres ci-dessus en même temps. 28_SIR_full_model_prm.png

29_SIR_full_reinfect_graph.png

Résumé

En modélisant avec OpenModelica, je pense qu'il était facile d'ajouter petit à petit des éléments au modèle SIR de base et de le simuler. En fait, il semble que le taux de mortalité et le taux de réinfection soient inférieurs de plus d'un ordre de grandeur à cette simulation, mais si des données réelles plus précises peuvent être obtenues, il peut être possible d'identifier les paramètres.

Article associé

Implémentation du modèle mathématique "modèle SIR" des maladies infectieuses dans Open Modelica Implémenter un modèle mathématique "modèle SIR" de maladies infectieuses dans Open Modelica (voir l'effet du vaccin) Introduction d'un modèle de prédiction mathématique pour les maladies infectieuses (modèle SIR)

Recommended Posts

Mettre en œuvre le modèle mathématique «modèle SIR» des maladies infectieuses dans OpenModelica (reflétant le taux de mortalité et de réinfection)
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses avec Open Modelica
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses dans OpenModelica (voir l'effet du vaccin)
Introduction d'un modèle de prédiction mathématique pour les maladies infectieuses (modèle SIR)
Modèle de prédiction mathématique des maladies infectieuses (modèle SIR): étude de cas (1)
[Analyse du modèle SIR] Pic du nombre d'infections au Japon et dans le monde ♬
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses avec Open Modelica
Mettre en œuvre le modèle mathématique «modèle SIR» des maladies infectieuses dans OpenModelica (reflétant le taux de mortalité et de réinfection)
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses dans OpenModelica (voir l'effet du vaccin)
Introduction d'un modèle de prédiction mathématique pour les maladies infectieuses (modèle SIR)
Implémenter un modèle avec état et comportement (3) - Exemple d'implémentation par décorateur
Modèle de prédiction mathématique des maladies infectieuses (modèle SIR): étude de cas (1)
Modèle mathématique des épidémies de maladies infectieuses
Implémenter un modèle avec état et comportement
Prédire les épidémies de maladies infectieuses avec le modèle SIR
Résolution du modèle Lorenz 96 avec Julia et Python
Exemple de lecture et d'écriture de CSV avec Python
[Analyse du modèle SIR] Pic du nombre d'infections au Japon et dans le monde ♬
Racler le calendrier de Hinatazaka 46 et le refléter dans Google Agenda
Vérifier le taux de compression et le temps de PIXZ utilisé en pratique
Modèle mathématique des épidémies de maladies infectieuses
Implémenter une partie du processus en C ++
Somme des variables dans un modèle mathématique
[Analyse du modèle SIR] Pic du nombre d'infections au Japon et dans le monde ♬
[Analyse du modèle SIR] Détermination de γ * (R-1) et pic du nombre d'infections ♬ World Edition
[Analyse du modèle SIR] Pic du nombre d'infections dans diverses régions du Japon ♬
Mettre en œuvre le modèle mathématique «modèle SIR» des maladies infectieuses dans OpenModelica (reflétant le taux de mortalité et de réinfection)
Ouvrez un fichier Excel en Python et coloriez la carte du Japon
Afficher le statut de l'infection COVID 19 au Japon avec Splunk (version GitHub)
Implémenter une partie du processus en C ++
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses dans OpenModelica (voir l'effet du vaccin)
[Analyse du modèle SIR] Transformez la formule pour déterminer γ et le nombre de reproduction effectif R ♬
J'ai utilisé Python pour découvrir les choix de rôle des 51 "Yachts" dans le monde.