Python-Simulation des Epidemiemodells (Kermack-McKendrick-Modell)

Epidemie

Zitat: https://kotobank.jp/word/%E3%82%A8%E3%83%94%E3%83%87%E3%83%9F%E3%83%83%E3%82%AF-683127

> Epidemie In der medizinischen und öffentlichen Gesundheit machen Menschen mit einer bestimmten Krankheit in einem bestimmten Bereich oder einer bestimmten Gruppe normale Vorhersagen.
> Eine große Menge überschreiten. Eine Infektionskrankheit wie Influenza ist in einem bestimmten Gebiet weit verbreitet.
> Der Zustand, in dem dies gleichzeitig in verschiedenen Teilen der Welt geschieht, wird als Pandemie bezeichnet.

Kermack-McKendrick-Modell

http://mathworld.wolfram.com/Kermack-McKendrickModel.html

Ein Modell, das Veränderungen in der Anzahl der mit Infektionskrankheiten infizierten Menschen in einer geschlossenen Population darstellt. Im Folgenden wird es durch eine simultane Differentialgleichung dargestellt.

\begin{eqnarray}
\frac{dx(x)}{dt}&=&-kx(t)y(t)\\
\frac{dy(t)}{dt}&=&kx(t)y(t)-ly(t)\\
\frac{dz(t)}{dt}&=&ly(t)
\end{eqnarray}

$ x (t) ≥ 0 $: Anzahl gesunder Menschen, $ y (t) ≥ 0 $: Anzahl kranker Menschen, $ z (t) ≥ 0 $: Anzahl wiedergefundener Menschen, $ k ≥ 0 $ : Infektionsrate, $ l ≥ 0 $: Wiederherstellungsrate

Als Interpretation · Set 1: Die Änderungsrate der Anzahl gesunder Menschen $ x $ ist proportional zur Anzahl gesunder Menschen x der Anzahl kranker Menschen. Der Proportionalitätskoeffizient beträgt $ -k $. Da $ k, x, y ≥ 0 $ ist, wird die Anzahl gesunder Menschen nicht zunehmen. Wenn die Anzahl der Kranken 0 wird, wird die Anzahl der Gesunden konstant gehalten. · Typ 2: Die Änderungsrate der Anzahl der Kranken $ y $ wird durch die Änderungsrate der Anzahl der gesunden Menschen und den Beitrag der Anzahl der Kranken bestimmt. Je größer die Änderungsrate der Anzahl gesunder Menschen oder je größer die Anzahl der Kranken ist, desto geringer ist die Änderungsrate der Anzahl der Kranken. Wenn das Vorzeichen von $ kx (t) -l $ positiv ist, nimmt die Anzahl der Kranken zu, und wenn es negativ ist, nimmt es ab. ・ Typ 3: Die Änderungsrate der Anzahl der Personen, die $ z $ wiedererlangt haben, ist proportional zur Anzahl der Kranken. Die Proportionalitätskonstante ist $ l $. Je mehr Kranke es gibt, desto schneller steigt die Zahl der Menschen, die sich erholen.

Fixpunkt

\begin{eqnarray}
\frac{dx(x)}{dt}&=&-kx(t)y(t)=0…①\\
\frac{dy(t)}{dt}&=&kx(t)y(t)-ly(t)=0…②\\
\frac{dz(t)}{dt}&=&ly(t)=0…③
\end{eqnarray}

Der Punkt, der wird.

Von ② $ x $ = $ \ frac {l} {k} $ Von ① und ③ $ y = 0 $

Lagermenge

\begin{eqnarray}
\frac{dx(x)}{dy(t)}&=&\frac{-kx(t)y(t)}{kx(t)y(t)-ly(t)}\\
&=&\frac{-kx(t)}{kx(t)-l}\\
(\frac{l}{k}\frac{1}{x}-1)dx(t)&=&dy(t)\\
\int{(\frac{l}{k}\frac{1}{x}-1)dx(t)}&=&\int{dy(t)}\\
\frac{l}{k}logx(t)-x(t)&=&y(t)+E
\end{eqnarray}

$ \ Frac {l} {k} logx (t) -x (t) -y (t) $ ist die Speichermenge (sie nimmt einen konstanten Wert an, auch wenn sich die Zeit ändert).

Simulation durch numerische Berechnung

Berechnungsmethode

http://qiita.com/popondeli/items/391810fd727cefb190e7 Die in beschriebene Rungecutta-Methode wird erweitert und für simultane Differentialgleichungen verwendet.

·Quellcode

import numpy as np
import matplotlib.pyplot as plt
import math

k = 1.0
l = 1.0

DELTA_T = 0.001
MAX_T = 100.0

def dx(x, y, z, t):
    return -k * x * y
    
def dy(x, y, z, t):
    return k * x * y - l * y
    
def dz(x, y, z, t):
    return l * y
    
def calc_conceved_quantity(x, y, z, t):
    return (l/k)*math.log(x) - x - y
    
def runge_kutta(init_x, init_y, init_z, init_t):
    x, y, z, t = init_x, init_y, init_z, init_t
    history = [[x, y, z, t, calc_conceved_quantity(x, y, z, t)]]
    cnt = 0
    while t < MAX_T:
        cnt += 1
        k1_x = DELTA_T*dx(x, y, z, t)
        k1_y = DELTA_T*dy(x, y, z, t)
        k1_z = DELTA_T*dz(x, y, z, t)
        
        k2_x = DELTA_T*dx(x + k1_x/2, y + k1_y/2, z + k1_z/2, t + DELTA_T/2)
        k2_y = DELTA_T*dy(x + k1_x/2, y + k1_y/2, z + k1_z/2, t + DELTA_T/2)
        k2_z = DELTA_T*dz(x + k1_x/2, y + k1_y/2, z + k1_z/2, t + DELTA_T/2)
        
        k3_x = DELTA_T*dx(x + k2_x/2, y + k2_y/2, z + k2_z/2, t + DELTA_T/2)
        k3_y = DELTA_T*dy(x + k2_x/2, y + k2_y/2, z + k2_z/2, t + DELTA_T/2)
        k3_z = DELTA_T*dz(x + k2_x/2, y + k2_y/2, z + k2_z/2, t + DELTA_T/2)
        
        k4_x = DELTA_T*dx(x + k3_x, y + k3_y, z + k3_z, t + DELTA_T)
        k4_y = DELTA_T*dy(x + k3_x, y + k3_y, z + k3_z, t + DELTA_T)
        k4_z = DELTA_T*dz(x + k3_x, y + k3_y, z + k3_z, t + DELTA_T)
        
        x += (k1_x + 2*k2_x + 2*k3_x + k4_x)/6
        y += (k1_y + 2*k2_y + 2*k3_y + k4_y)/6
        z += (k1_z + 2*k2_z + 2*k3_z + k4_z)/6
        t += DELTA_T
        x = max(0, x)
        y = max(0, y)
        z = max(0, z)
        if cnt % 100 == 0:
            history.append([x, y, z, t, calc_conceved_quantity(x, y, z, t)])
    return history
    
if __name__ == '__main__':
    #Numerische Berechnung nach der Rungekutta-Methode
    history = np.array(runge_kutta(init_x = 1, init_y = 0.1, init_z = 0, init_t = 0))
    
    x_min, x_max = min(history[:,0]), max(history[:,0])
    y_min, y_max = min(history[:,1]), max(history[:,1])
    z_min, z_max = min(history[:,2]), max(history[:,2])
    t_min, t_max = 0, MAX_T
    
    #Zeichnen Sie das x gegen y-Phasendiagramm
    plt.subplot(4, 1, 1)
    plt.title("x vs y")
    plt.xlim(x_min, x_max)
    plt.ylim(y_min, y_max)
    plt.scatter(history[:,0], history[:,1])
    
    # x(Anzahl gesunder Menschen)Zeichnen Sie die Zeitänderung von
    plt.subplot(4, 1, 2)
    plt.title("t vs x")
    plt.xlim(t_min, t_max)
    plt.ylim(0, x_max)
    plt.scatter(history[:,3], history[:,0])
    
    # y(Anzahl der Kranken)Zeichnen Sie die Zeitänderung von
    plt.subplot(4, 1, 3)
    plt.title("t vs y")
    plt.xlim(t_min, t_max)
    plt.ylim(0, y_max)
    plt.scatter(history[:,3], history[:,1])
    
    #Zeichnen Sie die zeitliche Änderung der Speichermenge
    plt.subplot(4, 1, 4)
    plt.title(u"t vs conserved quantity")
    plt.xlim(t_min, t_max)
    plt.scatter(history[:,3], history[:,4])
    plt.show()

$ k $ und $ l $ sind 1.0.

figure_1-1.png

Ergebnisse aufgrund unterschiedlicher x- und y-Anfangswerte

X-gegen-y-Phasendiagramm, wenn die Simulation 100 Mal wiederholt wird, wobei die Anfangswerte von $ x und y $ einen zufälligen Wert von 0 bis 1 erhalten.

Quellcode

import numpy as np
import matplotlib.pyplot as plt
import math
import random

k = 1.0
l = 1.0

DELTA_T = 0.001
MAX_T = 100.0

def dx(x, y, z, t):
    return -k * x * y
    
def dy(x, y, z, t):
    return k * x * y - l * y
    
def dz(x, y, z, t):
    return l * y
    
def calc_conceved_quantity(x, y, z, t):
    return (l/k)*math.log(x) - x - y
    
def runge_kutta(init_x, init_y, init_z, init_t):
    x, y, z, t = init_x, init_y, init_z, init_t
    history = [[x, y, z, t, calc_conceved_quantity(x, y, z, t)]]
    cnt = 0
    while t < MAX_T:
        cnt += 1
        k1_x = DELTA_T*dx(x, y, z, t)
        k1_y = DELTA_T*dy(x, y, z, t)
        k1_z = DELTA_T*dz(x, y, z, t)
        
        k2_x = DELTA_T*dx(x + k1_x/2, y + k1_y/2, z + k1_z/2, t + DELTA_T/2)
        k2_y = DELTA_T*dy(x + k1_x/2, y + k1_y/2, z + k1_z/2, t + DELTA_T/2)
        k2_z = DELTA_T*dz(x + k1_x/2, y + k1_y/2, z + k1_z/2, t + DELTA_T/2)
        
        k3_x = DELTA_T*dx(x + k2_x/2, y + k2_y/2, z + k2_z/2, t + DELTA_T/2)
        k3_y = DELTA_T*dy(x + k2_x/2, y + k2_y/2, z + k2_z/2, t + DELTA_T/2)
        k3_z = DELTA_T*dz(x + k2_x/2, y + k2_y/2, z + k2_z/2, t + DELTA_T/2)
        
        k4_x = DELTA_T*dx(x + k3_x, y + k3_y, z + k3_z, t + DELTA_T)
        k4_y = DELTA_T*dy(x + k3_x, y + k3_y, z + k3_z, t + DELTA_T)
        k4_z = DELTA_T*dz(x + k3_x, y + k3_y, z + k3_z, t + DELTA_T)
        
        x += (k1_x + 2*k2_x + 2*k3_x + k4_x)/6
        y += (k1_y + 2*k2_y + 2*k3_y + k4_y)/6
        z += (k1_z + 2*k2_z + 2*k3_z + k4_z)/6
        t += DELTA_T
        x = max(0, x)
        y = max(0, y)
        z = max(0, z)
        if cnt % 100 == 0:
            history.append([x, y, z, t, calc_conceved_quantity(x, y, z, t)])
    return history
    
if __name__ == '__main__':

    for i in range(0, 100):
        init_x = random.random()
        init_y = random.random()
    
        #Numerische Berechnung nach der Rungekutta-Methode
        history = np.array(runge_kutta(init_x, init_y, init_z = 0, init_t = 0))
        
        x_min, x_max = min(history[:,0]), max(history[:,0])
        y_min, y_max = min(history[:,1]), max(history[:,1])
        z_min, z_max = min(history[:,2]), max(history[:,2])
        t_min, t_max = 0, MAX_T
        
        #Zeichnen Sie das x gegen y-Phasendiagramm
        plt.title("x vs y")
        plt.xlim(0, 1)
        plt.ylim(0, 1)
        plt.scatter(history[:,0], history[:,1])
    plt.show()

figure_1-2.png

Beim Zeichnen einer Kurve fällt sie auf $ y = 0 $ (= Anzahl der infizierten Personen 0).

Ergebnisse aufgrund unterschiedlicher Parameter k und l (Infektionsrate, Wiederherstellungsrate)

Höhere Wiederherstellungsrate

l = 3.0k = 1.0

figure_1-3_l-3.png

Der Abfall auf $ y = 0 $ wird steil

Erhöhte Infektionsrate

l = 1.0k = 5.0

figure_1-4_k-5.png

Einmal infiziert, steigt und sinkt die Anzahl der infizierten Personen auf 0

Recommended Posts

Python-Simulation des Epidemiemodells (Kermack-McKendrick-Modell)
GUI-Simulation des neuen Koronavirus (SEIR-Modell)
Geben Sie das Beleuchtungsmodell für SCN-Material in Pythonista an
Die Bedeutung des Selbst
Zählen Sie die Anzahl der Parameter im Deep-Learning-Modell
der Zen von Python
Die Geschichte von sys.path.append ()
Rache der Typen: Rache der Typen
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Regression zu bewerten
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
Implementieren Sie mit Open Modelica das mathematische Modell "SIR-Modell" von Infektionskrankheiten
Die Geschichte des Django-Modellfeldes verschwindet aus der Klasse
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Analysieren Sie das Themenmodell, mit GensimPy3 Romanautor zu werden
Richten Sie die Version von chromedriver_binary aus
Scraping das Ergebnis von "Schedule-Kun"
10. Zählen der Anzahl der Zeilen
Auf dem Weg zum Ruhestand von Python2
Vorteile der Verfeinerung des Django-Modells
Holen Sie sich die Anzahl der Ziffern
Erläutern Sie den Code von Tensorflow_in_ROS
Verwenden Sie die Clustering-Ergebnisse erneut
GoPiGo3 des alten Mannes
Berechnen Sie die Anzahl der Änderungen
Ändern Sie das Thema von Jupyter
Die Popularität von Programmiersprachen
Ändern Sie den Stil von matplotlib
Kalibrieren Sie das Modell mit PyCaret
Visualisieren Sie die Flugbahn von Hayabusa 2
Über die Komponenten von Luigi
Verknüpfte Komponenten des Diagramms
Filtern Sie die Ausgabe von tracemalloc
Über die Funktionen von Python
Simulation des Inhalts der Brieftasche
Die Kraft der Pandas: Python
[Pytorch] Ich möchte die Trainingsparameter des Modells manuell zuweisen
Übersetzte die Erklärung des oberen Modells des Kaggle-Wettbewerbs zur Erkennung von Gehirnwellen
[Django] Korrigieren Sie die Pluralform des Modellnamens auf dem Verwaltungsbildschirm
Versuchen Sie, die kumulierte Rendite des Rollovers im Futures-Handel zu modellieren
[Übersetzung] scikit-learn 0.18 Benutzerhandbuch 3.3. Modellbewertung: Quantifizieren Sie die Qualität der Vorhersage
Bewerten Sie die Leistung eines einfachen Regressionsmodells mithilfe der LeaveOneOut-Schnittstellenvalidierung
[Einführung in das SIR-Modell] Betrachten Sie das passende Ergebnis von Diamond Princess ♬
Bewerten Sie die Genauigkeit des Lernmodells durch einen Kreuztest von scikit learn