12.7    DGL-System mit drei Unbekannten

Es gibt auch Problemstellungen, bei denen drei oder mehr Unbekannte als Ableitungen in einem Differenzialgleichungssystem vorkommen können. Das ist z. B. der Fall, wenn der Verlauf einer Epidemie innerhalb einer Population N untersucht werden soll. Gesunde, also Ansteckbare y1 (engl. susceptible), werden zu Infizierten y2 (engl. infected), wenn sie sich anstecken. Nach überstandener Infektion werden die Genesenen y3 aus dem Infektionsgeschehen entfernt (engl. removed). Für jede Gruppe wird eine DGL aufgestellt. Die einzelnen Differenzialgleichungen sind miteinander gekoppelt. Die drei Differenzialgleichungen mit den Parametern b und g

formula
formula
formula

beschreiben das Infektionsgeschehen. Dieses DGL-System wird als SIR-Modell bezeichnet. Es wurde 1927 von William Ogilvy Kermack und Anderson Gray McKendrick aufgestellt.

Der Parameter b steht für die Infektionsrate. Sein Wert liegt zwischen 0 und 1. Der Parameter g beschreibt die Genesungsrate. Dieser Wert liegt ebenfalls zwischen 0 und 1.

Folgende idealisierten Voraussetzungen sollen gelten:

Listing 12.10 simuliert den Infektionsverlauf für eine Population von N = 1000 Individuen über einen Zeitraum von 120 Tagen. Für die Infektionsrate wird b = 0.4 und für die Genesungsrate wird g = 0.04 angenommen.

01  #10_plot_epidemie.py
02 import numpy as np
03 import matplotlib.pyplot as plt
04 b=0.4 #Infektionsrate
05 g=0.04 #Genesungsrate
06 #DGL für SIR-Modell
07 def dgl(t,y1,y2,y3,N):
08 dy1_dt=-b*y1*y2/N #Gesunde
09 dy2_dt=b*y1*y2/N-g*y2 #Infizierte
10 dy3_dt=g*y2 #Genesene
11 return dy1_dt,dy2_dt,dy3_dt
12 #Lösung der DGL
13 n=500 #Anzahl der Schritte
14 t1,t2=0,120
15 dt=(t2-t1)/n #Schrittweite
16 t=np.linspace(t1,t2,n+1)
17 y10=997 #Gesunde
18 y20=3 #Infizierte
19 y30=0 #Genesene
20 N=y10+y20+y30
21 y1,y2,y3=np.empty(n+1),np.empty(n+1),np.empty(n+1)
22 y1[0],y2[0],y3[0]=(y10,y20,y30) #Anfangswerte
23 for i in range(n):
24 dy1,dy2,dy3 = dgl(t,y1[i],y2[i],y3[i],N)
25 y1[i+1] = y1[i] + dy1*dt
26 y2[i+1] = y2[i] + dy2*dt
27 y3[i+1] = y3[i] + dy3*dt
28 #Grafikbereich
29 fig,ax = plt.subplots()
30 ax.plot(t,y1,'b--',label='Gesunde')
31 ax.plot(t,y2,'r-.',label='Infizierte')
32 ax.plot(t,y3,'g-', label='Genesene')
33 ax.set_xlabel('Zeit')
34 ax.legend(loc='best')
35 ax.grid(True)
36 plt.show()

Listing 12.10     Simulation einer Epidemie mit dem SIR-Modell

Ausgabe

Verlauf einer Epidemie

Abbildung 12.11     Verlauf einer Epidemie

Analyse

In den Zeilen 07 bis 11 wird die Python-Funktion für das DGL-System definiert. Zurückgegeben wird ein Tupel aus den 1. Ableitungen für die Gesunden dy1_dt, die Infizierten dy2_dt und die Genesenen dy3_dt.

Die Zeilen 17 bis 19 legen die Anfangswerte fest.

In Zeile 21 werden drei leere NumPy-Arrays y1, y2 und y3 initialisiert.

In Zeile 22 werden die Anfangswerte y10, y20 und y30 in die ersten Positionen (Index 0) der Arrays y1[0], y2[0] und y2[0] gespeichert. In den Zeilen 23 bis 27 wird das DGL-System innerhalb einer for-Schleife mit dem Summenalgorithmus (Zeile 25 bis 27) gelöst. Auf der linken Seite des rekursiven Gleichungssystems stehen die aktualisierten Werte y1[i+1], und auf der rechten Seite stehen die Vorgänger y1[i].