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. ** **
"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;
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;
En utilisant le cl_SIRreinfect créé, créez un modèle mdl_SIRmodel_reinfect et simulez-le. Aucun vaccin n'est utilisé ici.
Pour plus de clarté, nous allons fixer le taux de mortalité à 20% assez élevé et simuler.
En conséquence, le nombre de décès a convergé vers environ 18% du total.
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%.
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.
Essayez de régler les deux paramètres ci-dessus en même temps.
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.
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