Gruppenseite - (EGL)

Bearbeiten

Diese Seite enthält die gesammelten Materialien der Gruppe 16 für die Portfolioprüfung.

Teilnehmer-innen

Bearbeiten
  • Ellerwald, Jonas
  • von Gerichten, Marco
  • Lapport, Felix

Diskrete Modellierung

Bearbeiten

Infektionsepidemiologie

Bearbeiten

Unter der Infektionsepidemiologie versteht man eine medizinische Fachdisziplin und ein Teilgebiet der Epidemiologie, welche sich mit der Ausbreitung und der Eindämmung von Infektions- und parasitären Krankheiten, unter Einbezug ihres räumlichen und zeitlichen Auftreten, beschäftigt. Dabei können die meisten Infektionskrankheiten mathematisch modelliert werden, um eben das bereits angesprochene zeitliche und räumliche Verhalten zu untersuchen und zu prognostizieren.

Zyklus 1: SIR-Modell

Bearbeiten

Erste Gedankenspiele

Bearbeiten

Wir wollten eine Graphische Darstellung des SIR Modells anhand der Zahlen der Stadt Kaiserslautern. Die Einwohnerzahl von Kaiserslautern beträgt ca. 100.000. Zusätlich haben wir die Infektionsrate auf 30% täglich festgelegt.

Um uns die Funktionen der Infizierten, Empfänglichen und Genesenen deutlich zu machen, begannen wir mit einer Exeltabelle

 

Anhand dieser Tabelle und der Bildlichen Programierung der Zellen entwickelten wir das Pendant in Octave:

S = 100885 ;  %Möglichen Infizierten
I = 0  ; %Infizierten
R = 0  ;  %Genesenen

k = 0.3 ;   %Infektionsrisiko
w = 1/14;   %Genesungszeit
Zeit = 30;  %Laufzeit des Modells in Tagen

Erstellung von Vectoren von S, I, R in der länge der zu berechnenden Zeit

Sneu = [0:Zeit];
Ineu = [0:Zeit];
Rneu = [0:Zeit];

Vectoren Nullsetzen

Sneu(2:Zeit) = 0;
Ineu(2:Zeit) = 0;
Rneu(1:Zeit) = 0;
 

Eintragung des Startwerts an der ersten Stelle des Vectors

Sneu(1) = S;
Ineu(1) = I;
Rneu(1) = R;

Da uns die Genesungsrate von 1/14 nicht zusagte, da dies nicht wirklich der konkreten Darstellung des Genesungsprozesses abbildet, entschieden wir uns für die Genesung nach 14 Tagen. Wegen der Genesungszeit von 14 Tagen, mussten wir für den Zähler eine if Abfrage einbauen, um den Fehler des Programms bezüglich der Vectoren abfrage zu vermeiden.

for t = 1:Zeit
 
 if t >= 15
   Rneu(t+1) = Ineu(t-14);
 else
   Rneu(t+1) = 0; 
 endif

 Ineu(t+1) = k*(Sneu(t))+Ineu(t);
 Sneu(t+1) = Sneu(1) - Ineu(t+1); 
 
endfor


 

Die ersten Gedankenspiele unserer weiteren epidemiologischen Untersuchung haben wir nun zunächst unabhängig von Wechselwirkungen der Orte für die Ortschaften Kaiserlautern, Neustadt an der Weinstraße, Landau, Pirmasens, Impflingen und Rumbach ausgeweitet Dementsprechend haben wir die Excel-Programmierung bzw. die Libre Office-Programmierung auch durch diese Orte erweitert.

 

Fazit & weitere Optimierungsmöglichkeiten

Bearbeiten

Der Zyklus 1 ist eine zunächst noch sehr einfaches Modell, das das Infektionsgeschehen in unseren gewählten Knoten ohne Bewegung der Bevölkerung modelliert. Die Knoten selbst liegen zumindest in Form der Städte Kaiserlautern, Neustadt, Landau und Pirmasens entlang der Schnell- und Kraftfahrtstraßen und bilden somit die Knotenpunkte eines Wegenetzes. Die Modellierung in Excel und Octave des SIR-Modells können für unsere weiteren Zyklen erneut genutzt werden und bilden die Basis für das weitere Vorgehen. Letztendlich fehlt es dem Zyklus jedoch an den Verbindungen zwischen den Knoten und somit auch an Personenverkehr zwischen unseren gewählten Orten. Somit ergeben sich bereits weitere Möglichkeiten einer Optimierung des Modells. So werden im nächsten Schritt und dementsprechend im zweiten Zyklus die Verbindungen zwischen den Knoten ergänzt und der Personenverkehr könnte anhand einer Transportmatrix simuliert werden.

Zyklus 2: SIR-Modell mit Transportmatrix

Bearbeiten
 
 

In Zyklus zwei wurde dann der von uns ausgewählte Raum durch eine endliche Menge von Knoten und Verbindungen mittels eines ungerichteten Graphen diskretisiert. Der Graph kodiert dabei das Wegenetz von Impflingen über Landau, Neustadt, Kaiserslautern, Pirmasens nach Rumbach. Es ergibt sich ein ungerichteter Graph mit 6 Knoten wie der Abbildung zu entnehmen ist. Mit der Menge der Knoten   und der Menge   der ungerichteten Knotenverbindungen:  

Anzahl_Orte = 6
vec_u0 = [100000 53148 46677 40403 805 472]  ;
Matrix_Tag_0 = [100000 1 0; 53148 0 0; 46677 0 0; 40403 0 0; 805 0 0; 472 0 0];
r = 0.03 ;
Tage = 5;
w = 1/14;

Die Verbindungen und Übergänge zwischen den jeweiligen Ortsbewohnern haben wir mit Hilfe sogenannter Übergangsmatrizen in Octave modelliert. Unter Beachtung der vorhandenen Verbindungen aus Menge   haben wir eine Transportmatrix erstellt.

#Implementieren der Transportmatrix für 6 Orte
Transportmatrix = [0.6 0.3 0.3 0.3 0 0; 0.2 0.5 0.2 0 0 0; 0.1 0.2 0.3 0.2 0.2 0; 0.1 0 0.18 0.48 0 0.15; 0 0 0.02 0 0.8 0; 0 0 0 0.02 0 0.85 ]

Transportmatrix

Ort/Stadt             Kaiserslautern| Neustadt a. d. W. | Landau i. d. P. | Pirmasens | Impflingen | Rumbach 
---------------------------------------------------------------------------------------------------------------
Kaiserslautern    |       0.6       |        0.3        |       0.3       |     0.3   |      0     |    0 
Neustadt a. d. W. |       0.2       |        0.5        |       0.2       |      0    |      0     |    0
Landau i. d. P.   |       0.1       |        0.2        |       0.3       |     0.2   |     0.2    |    0
Pirmasens         |       0.1       |         0         |       0.18      |     0.48  |      0     |   0.15
Impflingen        |        0        |         0         |       0.02      |      0    |     0.8    |    0
Rumbach           |        0        |         0         |         0       |     0.02  |      0     |   0.85

Grundsätzlich gibt diese uns Auskunft über den Personenverkehr zwischen den jeweiligen Verbindungen. Die Einträge mit Null kennzeichnen die nicht vorhandenen Verbindungen zwischen den Knoten. Somit kann aus epidemiologischer Sicht kein Austausch von Personen stattfinden, da diese keine epidemiologischen Nachbarn sind. Mit einer for-Schleife haben wir die täglichen Bewegungen zwischen den Knoten simuliert und für eine endliche Anzahl von Tagen laufen lassen.

 for i = 1:Tage
   %Impffaktor wird festgelegt
   Impffaktor = 0;
   %Ab 4tem Tag wird geimpft (mit dem Faktor 0.0005)
   if i >= 4
     Impffaktor = 0.005;
   endif
   %Iteration läuft über alle Orte
   for j = 1:Anzahl_Orte
     %Epidemiologischer Prozess
     Ergebnismatrix(j,:) = SIR_Impf_Vector(Ergebnismatrix(j,1),Ergebnismatrix(j,2),Ergebnismatrix(j,3),r,w,Impffaktor);
     %Räumlicher Prozess
     %if j == 1 || j == 3 
       %Die Infizierten bleiben an ihrem Ort (j=1 -> S ; j=3 -> R) für die die Transportmatrix angewendet wird
       %Ergebnismatrix(:,j) = Transportmatrix*Ergebnismatrix(:,j);
     %endif
 
   endfor
 Ergebnismatrix
 endfor

Fazit & Ausblick

Bearbeiten

Durch das Bilden eines ungerichteten Graphen konnten wir unsere Knoten verbinden und das Wegenetz und somit die Transportprozesse zwischen den jeweiligen Knoten darstellen. Über den Transport und das Anwenden des SIR-Modells kann das Pandemiegeschehen in den jeweiligen Orten modelliert werden. Dies zeigt wie stark der Einfluss der Mobilität auf das jeweilige Geschehen ist. Für den weiteren Zyklus wäre es nun eine Optimierung das SIR-Modell durch das modifizierte SIR-Modell zu ersetzen.

Zyklus 3: Modifiziertes SIR-Modell mit Transportmatrix

Bearbeiten

Zunächst haben wir wieder unseren ungerichteten Graphen mit unseren 6 Knoten bzw. unseren 6 gewählten Orten in Octave implementiert. Der Vektor vec_u0 gibt die jeweilige Bevölkerungszahl der Orte und beschreibt somit die für das modifizierte SIR-Modell wichtige Bevölkerungskapazität in jedem gewählten Knoten aus der Menge  . Die Matrix   gibt uns die Startwerte im Zeitpunkt   für unsere Kompartimente. Für die Vereinfachung des Modells haben wir in jedem Knoten einen Infizierten gewählt, der das Infektionsgeschehen in jedem Ort in Gang bringt. Die weiteren wichtigen Variablen für das modifizierte SIR-Modell haben wir anhand unserer Modellierung im Tutorium 3 gewählt.

 
 
 
 
 
 
vec_u0 = [100000 53148 46677 40403 805 472];  
Matrix_Tag_0 = [100000 1 0 0 ; 53148 1 0 0; 46677 1 0 0; 40403 1 0 0; 805 1 0 0 ; 472 1 0 0];
Anzahl_Orte = length(vec_u0)
r = 1 ;
c = 0.3435;
d = 0.03;
T = 100;
w = 1/14;
B = [100000 53148 46677 40403 805 472];

Im nächsten Schritt haben wir in einer Funktion das modifizierte SIR-Modell implementiert.

function wert = SIR_Vec_mod (S, I, R, T,w,c,d,r,B)
 Rneu = w*I - d*I +R  ;
 Ineu =(c/B)*S*I+I - w*I;
 Sneu = S-c*S*I/(r*B) ;
 Tneu = d*I+T ;
 wert=[Sneu Ineu Rneu Tneu];
endfunction
Ergebnismatrix=Matrix_Tag_0;
SIRmatrix = ones(length(vec_u0),4);
Transportmatrix = [0.6 0.3 0.3 0.3 0 0; 0.2 0.5 0.2 0 0 0; 0.1 0.2 0.3 0.2 0.2 0; 0.1 0 0.18 0.498 0 0.15; 0 0 0.02 0 0.8 0; 0 0 0 0.002 0 0.85 ];

Mittels der for-Schleife wird das SIR-Modell für jeden Tag einmal durchgeführt. Die zweite for-Schleife gibt uns die Berechnung der Ergebnisse für jeden Ort.

for i = 1:T
   for j = 1:Anzahl_Orte
     %Epidemiologischer Prozess
      Ergebnismatrix(j,:) = SIR_Vec_mod (Ergebnismatrix(j,1),Ergebnismatrix(j,2),Ergebnismatrix(j,3),Ergebnismatrix(j,4),w,c,d,r,B(1,j));%Räumlicher Prozess
       for k = 1:4  
           if k == 1
             Ergebnismatrix(:,k) = Transportmatrix*Ergebnismatrix(:,k);
           else if k == 2
             Ergebnismatrix(:,k) = Transportmatrix*Ergebnismatrix(:,k);
           else if k == 3 
             Ergebnismatrix(:,k) = Transportmatrix*Ergebnismatrix(:,k);
           else if k == 4
             Ergebnismatrix(:,k) = Ergebnismatrix(:,k); 
           endif
           endif
           endif
           endif 
       endfor
   endfor 
Ergebnismatrix
endfor


Das sich die Transportmatrix lediglich in den ersten paar Zeitschritten bemerkbar macht, liegt daran, dass sich das System durch die Transportmatrix sehr schnell stabilisiert und sich, nach kurzer Zeit, keine weiteren Veränderungen mehr ergeben.

Fazit und weitere Optimierungsmöglichkeiten

Bearbeiten

Weitere Optimierungsmöglichkeiten wäre die Darstellung in Säulen in den jeweiligen Knoten, um den Verlauf der Pandemie auf unserer diskretisierten Fläche von Rheinland-Pfalz in den Knoten deutlicher darstellen zu können.

Zyklus 4: SIR-Modell Darstellung in 3D

Bearbeiten

Im ersten Schritt des vierten Zyklus haben wir mit GeoGebra gearbeitet. Zunächst haben wir unsere Karte mit den markierten Knoten in ein 2D-Koordinatensystem eingefügt. Danach haben wir die Karte bzw. die Grafik der Karte so gelegt, dass sie im ersten Quadranten des Koordinatensystem liegt. Dies erleichtert uns im Endeffekt die Bestimmung der Koordinaten. Dementsprechend wurde die Grafik auf der linken Seite auf die y-Achse gelegt und mit dem unteren Rand auf die x-Achse. Daraufhin haben wir durch einfaches Einfügen von Punkten die Koordinaten unserer Knoten erzeugt. Durch Darstellen dieser Punkte in der 3D-Ansicht ergibt sich zumindest der rechteckige Bereich, auf welchem die gewählten Knoten liegen. Anhand unserer somit gefunden Koordinaten konnten wir nun weiterarbeiten.  

Einlesen der Koordinaten in Octave

Bearbeiten
 

Zunächst haben wir das Gebiet in x- und y-Richtung definiert:

step=0.1;
X=[0:step:7];
Y=[0:step:7.5];
[x,y]=meshgrid(X,Y);
 

function wert= hallo_funktion(x,y,z1,z2,z3,z4,z5,z6)
 
  if sqrt((x.-3.9).^2+(y.-7.2).^2)<=0.3 wert=z1;
   elseif sqrt((x.-6.7).^2+(y.-6).^2)<=0.28  wert=z2;
   elseif sqrt((x.-6.8).^2+(y.-4.1).^2)<=0.24 wert=z3;
   elseif sqrt((x.-2.7).^2+(y.-4).^2)<=0.2 wert=z4;
   elseif sqrt((x.-6.8).^2+(y.-3.5).^2)<=0.06 wert=z5;
   elseif sqrt((x.-4.1).^2+(y.-2.6).^2)<=0.1 wert=z6;
  else wert=0;
  endif 
endfunction
 

Fazit & weitere Optimierungsmöglichkeiten

Bearbeiten

Weiter Optimierungsmöglichkeit wäre das Hinzufügen weiterer Orte. Auch das Impfen als weiterer Faktor für das SIR-Modell könnte hinzugefügt werden. Nach dem Modellieren der Pandemie in den 6 Knoten ergeben sich viele weitere Modellierungsmöglichkeiten. Interessant wäre die Untersuchung und Modellierung der Lockdowns auf das Infektionsgeschehen, ebenso wie der Einfluss der Impfkampagne (angepasst an den realen Verlauf der Impfkampagne). Auch die Entstehung weiterer Varianten des Corona-Virus haben einen großen Einfluss auf den Fortlauf der Pandemie. Auch der Einfluss des Wetters bzw. der Jahreszeit auf die Verbreitung des Virus könnte in einem Modell erarbeitet werden.

Ausblick: Modellierung mit der Impfkampagne. Durch Erstellen einer Funktion, die die Impfquote zu verschiedenen Zeitpunkten abbildet, könnte die vorhergehende Modellierung in Octave angepasst werden.

Verbindung der Werte mit dem SIR-Modell

Bearbeiten

for p=1:(length(X))
  for q=1:(length(Y))
    Koordinaten_S(q,p)=1*hallo_funktion(x(q,p),y(q,p),Ergebnismatrix(1,1),Ergebnismatrix(2,1),Ergebnismatrix(3,1),Ergebnismatrix(4,1),Ergebnismatrix(5,1),Ergebnismatrix(6,1));
    Koordinaten_I(q,p)=1*hallo_funktion(x(q,p),y(q,p),Ergebnismatrix(1,2),Ergebnismatrix(2,2),Ergebnismatrix(3,2),Ergebnismatrix(4,2),Ergebnismatrix(5,2),Ergebnismatrix(6,2));
    Koordinaten_R(q,p)=1*hallo_funktion(x(q,p),y(q,p),Ergebnismatrix(1,3),Ergebnismatrix(2,3),Ergebnismatrix(3,3),Ergebnismatrix(4,3),Ergebnismatrix(5,3),Ergebnismatrix(6,3));
  endfor
endfor

 

Kontinuierliche Modellierung

Bearbeiten

Tutorium 1 - Kontaktmodell

Bearbeiten

In der ersten Tutoriumsaufgabe soll ein einfaches Kontaktmodell entwickelt werden. Dazu befindet sich unter einer gewissen Anzahl von Individuen ein infiziertes. Nun bewegen sich die alle Individuen. Kommen sie einem Infiziertem zu nahe, infizieren sie sich selbst und tragen so zu einer Verbreitung der Infektionen bei, denn im nächsten Zeitschritt können auch diese die Infektion weitergeben.

Folgende Aufgaben waren zu bearbeiten:

1. Geschwindigkeit, finale Simulationszeit ändern und analysieren, wie sich das auf die Infektionsverbreitung auswirkt.

2. Die Punkte sollen im Verlauf der Simulation die Richtung mehrfach ändern, der Code soll entsprechend angepasst werden.

Umsetzung der Aufgaben

Bearbeiten

Als erstes muss ein Mashgrid erzeugt werden, wo sich die Induvidien am Anfang der Simulation befinden. Ein Infizierter wird so gewählt, dass er sich im Zentrum aller Individuen befindet.

 Nx=12;% Anzahl der Vektorkomponenten 
 Ny=18;% Anzahl der Vektorkomponenten
 Zeitschritte=3;% pro T=1
 radiusInf=0.55;% Ansteckungsradius
 T=4 ;% Zeiteinheit 
 g=0.90;% Geschwindigkeit der Teilchen/Personen
 % Abstand am Anfang=1
 %------------------------
 x=[1:Nx];%Zeilenvektor mit Nx - Zeilen
 y=[1:Ny];%Spaltenvektor mit Ny - Spalten
 dt=1/Zeitschritte;% Unterteilung der Zeiteinheit in oben genannte Zeitschritte
[x,y]=meshgrid (x,y);% Aufspannung der Koordinatengitter von x und y 
 neuPosX=x.+g*rand(Ny,Nx)-0.5*g;#x-Koordinaten der Teilchen/Passanten
 neuPosY=y.+g*rand(Ny,Nx)-0.5*g;#y-Koordinaten der Teilchen/Passanten
 %erste Infizierte 
 xInf=x(1, Nx/2);%x-Position des ersten Infizierten im Mittelpunkt 
 yInf=y(Ny/2);%y-Position des ersten Infizierten im Mittelpunkt 
 IndInf2=Nx/2;
 IndInf1=Ny/2;
 IndInf1neu=IndInf1;
 IndInf2neu=IndInf2;

Die Laufrichtung der Induvidien wird in einer For-Schleife mit Zufallszahlen generiert. So bewegen sich alle Punkte im Laufe der Simulation in eine unterschiedliche Richtung.


Kritik: Ein Individuum kann nach einer Infektion nicht genesen, ist es einmal infiziert, bleibt es infiziert.

Tutorium 2 - Fundamentallösungen der Diffusionsgleichung

Bearbeiten

Physikalische Herleitung

Bearbeiten
Für die Herleitung relevante Funktionen und Größen
Bearbeiten

  ||Raumveränderliche

  ||Zeitveränderliche

  ||Dichtefunktion der Konzentration der Corona-Infizierten und nach Definition ist die Abbildung auch ein Vektorfeld auf   ´siehe [1] und wird im Fall der Diffusion als Strömungsfeld interpretiert.

  ||Divergenz: Quellen und Senken eines Vektorfelds oder auch Quelldichte genannt. Besagt grundsätzlich wie sehr Vektoren in einer kleinen Umgebung auseinanderstreben.

  ||Gradient: Richtung des steilsten Anstiegs

  ||Laplace-Operator: Ordnet einem zweimal differenzierbaren Skalarfeld die Divergenz seines Gradienten zu. Ist für skalare Funktionen allgemein definiert als   [2]

  ||Laplace-Gleichung oder auch homogene Poisson-Gleichung.

  ||Poisson-Gleichung

  ||Diffusionsflussrate oder auch Teilchenstromdichte, die angibt wie viele Teilchen links nach rechts strömen.

  ||Ortsabhängiger Diffusionkoeffizient = Maß der Beweglichkeit von Teilchen [3]

Herleitung stationäre Diffusion in räumlicher Dimension
Bearbeiten

Für die Herleitung der räumlichen Diffusion wird ein dünner horizontaler Stab der Länge   betrachtet. Dementsprechend wird mathematisch gesehen die Konzentration der Teilchen in einer räumlichen Dimension auf dem Intervall   untersucht. Die Konzentration in vertikaler Richtung wird im System als homogen betrachtet, wodurch nur die Konzentrationsdichte in horizontaler Richtung von Bedeutung ist. Für die Herleitung der Diffusionsgleichung nutzt man nun zwei physikalische Gesetze. Das Fick´sche Gesetz und das Massenerhaltungsgesetz. Zunächst betrachten wir die Herleitung der Diffusionsgleichung in einem von der Zeit   unabhängigen System. Also ein System, dass sich bereits im Gleichgewicht befindet. Dies nennt man auch stationäre Diffusion. Bei der Diffusion werden Teilchen bewegt, präziser gefasst werden sollen sich Teilchen des einen Stoffes in einem zweiten Stoff verteilen. Diese Bewegung ist nicht ungeordnet, sondern besitzt eine konkrete Richtung. Diese Richtung nennt man Transportrichtung. Die Teilchen strömen nach dem zweiten Fick'schen Gesetz vom Ort mit höherer Konzentration in Orte mit niedriger Konzentration. Daraus ergibt sich ein Fluss bzw. eine Größe für den Fluss der Teilchen. Diese Größe nennt man auch die Teilchenstromdichte  . Nach dem ersten Fick'schen Gesetz ist diese Teilchenstromdichte proportional zum Konzentrationsgradienten  , der entgegen der Diffusionsrichtung, also der Teilchentransportrichtung verläuft. Die Teilchenstromdichte setzt sich nach dem ersten Fick'schen Gesetz aus dem Konzentrationsgradienten und dem Diffusionskoeffizienten zusammen:

 

Das zweite bereits oben angesprochene Gesetz ist das Erhaltungsgesetz bzw. Massenerhaltungsgesetz. Dieses besagt grundsätzlich, dass der Stoff in einem Volumen nicht verschwinden kann, noch das zusätzlich Stoff entstehen kann (sofern keine externe Zugabe oder Abnahme erfolgt). Dieser Stoff bleibt also in diesem Volumen erhalten. Nach dem Massenerhaltungsgesetz kann sich die Teilchenanzahl gegeben durch   in unserem horizontalen Stab, also zwischen den Rändern des Stabes   und   nicht ändern. Durch die Brownsche Bewegung kommt es allerdings zum Austausch der Teilchen an den Rändern des Stababschnnittes  . Der Zufluss wird durch die Teilchenstromdichte am linken Rand   und der Ausfluss durch die Teilchenstromdichte am rechten Rand   gegeben. Aus dem Erhaltungsgesetz folgt nun, dass sich Zufluss und Ausfluss ausgleichen müssen, d.h.:

 

Durch Bilden des Differentialquotienten durch das Teilen durch   und den Grenzübergang   ergibt sich  . Durch Anwendung des ersten Fick'schen Diffusionsgesetz, erhält man die Diffusionsgleichung  . Bei konstantem Diffusionskoeffizient erhält man nun die Laplace-Gleichung in einer räumlichen Dimension:

 
Verallgemeinerung in  [4]
Bearbeiten

Die Gesammtzahl von Teilchen in einem beliebigen Volumen lässt sich auf folgenderweise berechnen:  :  

Der Massenfluss durch den Rand   ergibt sich für Volumen  : , wobei   der äußeren Normalenvektor zum Rand von V und die Verknüpfung ' ' das Skalarprodukt bezeichnet.

Für das Fick'sche Gesetz in   wird die Ableitung von   nach   wieder durch den Konzentrationsgradienten   ersetzt.

Für den Massenfluss ergibt sich aus obiger Rechnung ebenfalls die Erhaltungsgleichung  : 

Im   wird nun anstelle der Bildung des Differentialquotients der Satz von Stokes und die Lemma Integralmittelwert angewendet. So ergibt sich folgendes:

 

Durch einsetzen des ersten Fick'schen Gesetz bekommt man dann die stationäre (homogene) Diffusionsgleichung in  . Diese lautet

  
Herleitung zeitabhängige Diffusion in räumlicher Dimension
Bearbeiten

Für die zeitabhängige Diffusion ist das System, welches betrachtet wird, in keinem Gleichgewichtszustand. Dementsprechend ist die gesuchte Dichtefunktion zeitabhängig. Es ergibt sich für die Dichtefunktion der Konzentration  . Die Gesamtzahl der Teilchen im Stababschnitt mit der Länge   wird nun als zeitabhängiges Integral angegeben   Das Erhaltungsgesetz besagt auch in diesem Fall mit einer zeitlichen Veränderungen, dass die zeitliche Veränderung der Gesamtanzahl der Teilchen durch den Austausch bzw. Zufluss und Ausfluss ausbalanciert sein muss.  


Nach dem Teilen durch   und dem Grenzübergang   erhält man mithilfe des Lemma Integralmittelwert die Erhaltungsgleichung

 

Durch erneute Anwendung des ersten Fick'schen Gesetz lässt sich die Teilchenstromdichte   ersetzen und man erhält folgende zeitabhängige (homogene) Diffusionsgleichung für die räumliche Dimension:

 
Verallgemeinerung in  
Bearbeiten

Wird für die Ableitung nach   der Gradient gesetzt. Wendet man erneut den Satz von Stokes bzw. den Gaußschen Intergalsatz erneut auf den zeitabhängigen Massenfluss an ergibt sich insgesamt folgende (homogene) Diffusionsgleichung:

  bzw.  
Herleitung Diffusion mit Quellterm
Bearbeiten

Bei der Diffusion mit Quellterm wird dem System eine externe oder interne Teilchenquelle hinzugefügt. Somit entsteht im System neue Masse. Diese Massenquelle trägt ebenfalls zum Massenerhaltungsgesetz bei und soll mathematisch durch die Dichtefunktion der Materialflussrate   beschrieben werden. Diese kennzeichnet die hinzugefügte oder entstandene Masse pro Volumen. Der Quellterm also   trägt ebenfalls zur zeitlichen Veränderung der Gesamtzahl von Teilchen im Intervallabschnitt bei, ebenso wie es auch der Austausch an den Rändern tut. Es ergibt sich also folgende Gleichung:

 

Diese lässt sich nach bekanntem Schema der zeitabhängigen Diffusion über das Teilen durch  , den Grenzübergang von   in folgende (inhomogene) Diffusionsgleichung in der räumlichen Dimension umformen:

 
Verallgemeinerung in  
Bearbeiten

Und durch das verallgemeinern in   ergibt sich über das Ersetzen der Ableitung nach   von   und die Anwendung des Satz von Stokes folgende inhomogene Diffusionsgleichung:

 
Herleitung Diffusion mit Reaktionsterm
Bearbeiten

Die Diffusion mit Reaktionsterm oder auch die Reaktionsdiffusion wird durch die Reaktionsdiffusionsgleichung beschrieben. Diese ist eine inhomogene zeitabhängige Diffusionsgleichung mit einer Quelldichtefunktion auf der rechten Seite, welche von der Stoffkonzentration abhängig ist. Ähnlich wie bei der Diffusion mit Quellterm wird auch hier auf der rechten Seite der Gleichung eine Quelldichte   hinzugefügt. Der Unterschied liegt jedoch darin, dass der Quellterm von der Dichtefunktion der Stoffkonzentration abhängig ist. Dementsprechend wird die Diffusionsgleichung nicht durch   sondern durch   oder auch   ergänzt. Diese partiellen Differentialgleichungen werden zum Beispiel auch in der Populationsdynamik genutzt.

 

Der Reaktionsterm hat eine bzw. die logistische Form und ist dementsprechend beschränkt. In unserem Fall orientiert sich der Reaktionsterm an Fishers-Gleichung der Populationsdynamik. Diese ist eine Sonderform der Kolmogorov-Petrovsky-Piscounov-Gleichung (KPP-Gleichung) ähnlich der logistischen Funktion, welche den Zusammenhang zwischen vertreichender Zeit und Wachstum beschreibt und durch eine obere Schranke beschränkt wird. In unserem Fall wäre dies die Bevölkerungdichte bzw. die Gesamtanzahl von Personen an einem festen Ort  . Der Reaktionsterm hat also folgende Form:

 

Woraus sich auch die folgende Reaktionsdiffusionsgleichung ergibt:

 

Analytische Lösung

Bearbeiten
Stationäre Diffusion: Laplace Gleichung
Bearbeiten

Die sogennanten Fundamentallösung der Laplace Gleichung   auf   (Cauchy-Problem) lässt sich anhand der Rotationsinvarianz des Laplace-Operators finden, da sich der selbst durch das Tauschen der Variablen x nicht verändert. Somit ergibt sich die rotationssymmetrische Lösung der Laplace-Gleichung. Formel der Fundamentallösung für  

  

wobei   den Volumen der Einheitskugel in   beschreibt und   die Vektornorm in   ist, vergleiche [5].

Für n=3 ist  .

Sowohl für   aber auch   gilt, dass die Fundamentallösung singulär ist.

   
Stationäre Diffusion: Poisson Gleichung
Bearbeiten

Ist die Fundamentallösung für einen Differentialoperator bereits gegeben, so erhält man die Lösung der Gleichung   bzw. der der Poissongleichung   auf     durch Faltung der Fundamentallösung mit der Funktion der rechten Seite. (Poissonformel) [6]:

  

Für eine Funktion   mit kompaktem Träger, siehe Definition Kompaktheit gilt,

  

(für Beweis siehe [6])

Zeitabhängige Diffusion
Bearbeiten

Für die homogene (instationäre) Diffusionsgeichung existieren spezielle Lösungsformel für konstanten Diffusionskoeffizient  .

Die Fundamentallösung für  ,   lautet

 

wobei   das Quadrat der euklidischen Norm von   ist, siehe [7].

Die Diffusiongleichung ergänzt durch eine Anfangsbedingung :

 

die im Anfangszeitpunkt   die Konzentrationsdichte /Dichte der Infizierten beschreibt heißt Anfangswertproblem.

Die Lösung   des (homogenen) Anfangswertproblem für   ist durch die Faltung der Fundamentallösung   mit der Anfangsfunktion gegeben  :

 

siehe [7]. Siehe auch Lösungsformel für das inhomogene Cauchyproblem.

 

Tutoriumsaufgaben

Bearbeiten
Implementierung der Funktion Φ in Octave
Bearbeiten

 

 
Grafische Darstellung der Funktion Ψ für n=2
 
Grafische Darstellung der Funktion Ψ für n≥3
for n=2:3
    if n=2
      x=[-400:1:400];
      phi=(-1/(2*pi))*log(sqrt((x).^2))
      figure(1)
      plot(x, phi,'-')
      axis=('auto')
      grid on 
      xlabel('x-Achse')
      ylabel('y-Achse')
      title("Phi(x)für n=2")
      saveas( 1, "Phix.jpg")
    endif
    if n=3
     for x=-10:0.1:10;
       phi=(3/(4*pi))*(1/(sqrt((x)^2))^(n-2))
       figure (2)
       hold on 
       plot (x, phi,'*b')
       grid on 
       xlabel('x-Achse')
       ylabel('y-Achse')
       title("Phi(x) für n>=2")
       saveas(2, "Phi2x.jpg")
     endfor
    endif
 endfor
Implementierung der Funktion Ψ in Octave
Bearbeiten

 

 
Grafische Darstellung der Funktion Φ
 for t = 1:5;
   x=-10:10;
   psi=(1/(4*0.02*t))*exp(-sqrt((x).^2)/(4*0.02*t))
   hf= figure(t) 
   plot(x,psi)
   title('Grafische Darstellung Psi(x,t)')
   xlabel('x-Achse')
   ylabel('y-Achse')
   axis([-10 10 0 13])
   test=["Figure_", num2str(t),".jpg"]
   saveas(t, test);
 endfor
Zeitabhängige Diffusion als Anfangswertproblem
Bearbeiten

Bei der zeitabhängigen Diffusion als Anfangswertproblem wird die Diffusionsgleichung durch eine Anfangsbedingung ergänzt, die die Konzentrationsdichte/ Dichte der Infizierten zum Anfangszeitpunkt   beschreibt.

Anfangswertfunktion
Bearbeiten
 
Anfangswertfunktion u0

Zum Beginn haben wir eine abwechslungsreiche Angfangswertfunktion implementiert

function wert=Anfangswertfunktion(x,y)
  if sqrt((x.-0.0).^2+(y.-2.5).^2)<=0.5 wert=0.5;
  elseif sqrt((x.-2).^2+(y.-0.0).^2)<=0.5 wert=1;
  %elseif sqrt((x.-0.8).^2+(y.-1).^2)<=0.15 wert=3;
  else wert=0;
  endif
endfunction


Implementierung der Formel Psi
Bearbeiten
 
Diffusion der Anfangswertfunktion zum Zeitpunkt t = 0.2
 
Animation der Diffusion über das Zeitintervall [0.2, 1] mit   = 0.05
   for i=1:(length(X)) 
       for j=1:(length(Y))
       xstar=x(j,i)*ones(length(Y),length(X));
       ystar=y(j,i)*ones(length(Y),length(X));
       % Psi
       psi=(1/(4*pi*a*(t0+k*(1/Zeitschritte))))*(exp(-((xstar.-x).^2+(ystar.-y).^2))/(4*a*(t0+k*(1/Zeitschritte))));
       endfor
   endfor
Integration
Bearbeiten
       %numerische Integration, alles funktioniert
       I(j,i) = trapz(Y,trapz(X,psi.*u0),2);


Nach dem schon die Integration vonstatten ging, wird nun mit Hilfe der folgenden Schleife die Grafik ausgegeben

%Graphische Ausgaben  
Schritte = k*Zeitschritte+1;
figure (k+1)
meshc(x,y,I)
grid on
title (['Loesung von Poissongleichung zum Zeitpunkt t = ', num2str(k*(1/Zeitschritte))])
xlabel('x - Achse')
ylabel ('y - Achse')
zlabel('z - Achse')
zlim([0 9])


Zum Zeitpunkt t = 0 wird eine Singularität erreicht, wodurch das erste Bild in unserer Animation keine Bedeutung zuzuweisen ist, da die Werte viel zu groß werden.

Tutorium 3 - Modifiziertes SIR Modell

Bearbeiten

SIR Modell

Bearbeiten

Für die Bearbeitung der dritten Aufgabe im Rahmen der Tutorien rückten die Modelle Populationsdynamik, präziser gefasst das modifzierte SIR Modell in den Fokus der Vorlesungsinhalte. Ähnlich wie das logistische (SI) Modell gehört auch das SIR Modell zu den Kompartimentmodellen für die Infektionsverbreitung. Das Modell selbst teilt die Gesamtpopulation in drei Gruppen bzw. Kompartimente ein: Susceptibles (Gruppe der Empfänglichen), Infected (Gruppe der Infizierten) und Removed (Gruppe der Genesenen) so wird die Diffusion als Austausch zwischen den Kompartimenten betrachtet.  

Die Änderungsraten der jeweiligen Kompartimente werden mittels eines Systems von drei gekoppelten Differentialgleichungen berechnet:

 
 
 

wobei die   die Regenerationsrate bzw. Wechsel- oder Genesensrate und   die Infektionsrate ist. Die Wechselrate selbst ergibt sich durch den Umkehrwert der Genesungszeit  . Daraus folgt letztendlich:  . Für COVID 19 ergibt sich somit eine Wechselrate von  , da laut Studien die Inkubationszeit zwischen 2 und 14 Tagen beträgt und 95% aller Befragten auch in diesem Zeitraum Symptome der Viruserkrankung entwickelt haben. Beachtet man nun die Tatsache, dass die Anzahl der Personen in den jeweiligen Gruppen die Gesamtpopulation nicht übersteigen kann, ergibt sich folgende Erhaltungsgleichung:

 

die im grundlegenden nur besagt, dass die Gesamtpopulation   konstant erhalten bleibt, dementsprechend findet kein räumlicher Austausch statt, weswegen das Modell auf eine feste Ortskoordinate   angewendet wird und es sich somit um ein rein dynamisches, also zeitabhängiges Modell handelt.

Modifiziertes SIR Modell

Bearbeiten

Das modifizierte SIR Modell wird angewendet, wenn die Toten nicht im Kompartiment der Genesenen erfasst werden sollen. Hinzukommend geht man im modifizierten SIR Modell davon aus, dass nur ein gewisser Prozentsatz der Infizierten auch Symptome entwickelt und somit von den Gesundheitsämtern erfasst wird. Unter Betrachtung dieser Modifikationen muss das Modell angepasst werden. So wird das Modell zusätzlich um eine konstante Sterberate  , ein konstanter Prozentsatz der durch Tests erfassten Infizierten   und durch eine von   und   abhängige Wachstumsrate   mit   ergänzt. Somit ergibt sich folgendes System von ebenfalls drei gekoppelten Differentialgleichungen:

 
 
 

Hinzukommt die Anfangsbedingung der jeweiligen Differentialgleichung:

 

Durch die oben getroffene Anpassung des Modells verändert sich auch die Erhaltungsgleichung aus dem SIR Modell folgendermaßen:

 

Diese besagt letztendlich nur, dass die Gesamtpopulation   um die verstorbenen Infizierten verringert.

Implementierung des modifizierten SIR-Modells in Octave

Bearbeiten
 B=55000; % Kapazitätsgrenze, 2/3 der deutschen Bevölkerung (In T) 
 c=0.3545; %Basisinfektionsrate- die Rate des exponentiellen Wachstums am Anfang der Pandemie
 w=1/14; % Wechselrate zu den Genesenen
 d=0.003; % Todesrate
 r=0.1;%Erfassungsfaktor, der besagt, dass 10 Prozent aller Infektionen entdeckt werden
 yo=[B-16/1000;16/1000;0]%Anfangsbedingungen

 %SIR-Modifiziert ohne Slowdown 
 f=@(y,x) [-c*y(1)*y(2)/(r*B);c*y(1)*y(2)/B-w*y(2);w*y(2)-d*y(2)];System von 3 gekoppelten Differentialgleichungen 
 y = lsode (f, yo, timesWHO) %y(1)=S(t) & y(2)=I(t)
 figure(13)%Grafische Darstellung des modifizierten SIR Modells 
 plot (timesWHO, y(:,1), timesWHO, y (:,2), '-.', timesWHO, y (:,3),'-.', timesWHO, y (:,3)+y(:,2))%Darstellung der Lösungen des DGL 
 hold on
 title("SIR modifiziert ohne SLOWDOWN")
 legend ("Susceptible", "Infected", "Removed", " Infected+Removed")%,"German data I+R" ,"German data I ","German data R" ,"location", "west")
 axis([0,n, 0 ,4000])

 

Aufgabe 1

Bearbeiten
Erweiterung der Funktion "coronaData"
Bearbeiten

Die erste Aufgabe war es nun die jeweiligen Zahlen des Infektionsgeschehens in die bereits von Frau Hundertmark vorgefertigte Funktion "coronaData" zu implementieren. Dazu sollten wir die jeweiligen Infektionszahlen in dieser Funktion ergänzen. Die jeweiligen Werte konnte man sehr gut im Internet wiederfinden und so werden bereits auf Wikipedia Tabellen und Datenbanken gepflegt, in welche die neuesten Zahlen direkt eingetragen und aktualisiert werden. Siehe [[1]]


 %Implementierung der gesammelten Corona-Daten 
 A=coronaData_Mai2021();
 inf_falleWHO=A(1,:);%Kumulierten Infektionen 
 inf_falleWHOrecovered=A(3,:);%Kumulierten Genesenen 
 inf_falleWHOtoten=A(2,:);%Kumulierte Gestorbene
 inf_falleWHOaktuell=inf_falleWHO-inf_falleWHOrecovered;%Tägliche Neuinfektionen 
 n=length(inf_falleWHO)
 timesWHO=[0:1:n-1];
 figure(1)
 plot(A(1,:),'-r',A(2,:),'-b', A(3,:),'-g' )
 axis([0 456 0 4000000])
 xlabel ('Tage')
 ylabel ('Zahlen')
 legend('Inizierte','Tote','Genesene')
 saveas(figure(1),"Corona_Daten.jpg")

 

Anpassung der Infektionsrate mittels einer Slowdown-Funktion
Bearbeiten
 function val=SIR_slowdown_verbessert(x)
 % Ab Tag t (Argument der Funktion) wird die Infektionsrate in mehrere Schritten sinken:
 if x < 20 
   val=1;
   else if x < 43
     val=0.6;
   else if x < 100%24.05.2020 Infektionsgeschehen hat sich wieder beruhigt
     val=0.095;
   else if x < 220%30.09.2020 die zweite Welle beginnt 
     val=0.0025*(x-100)+0.095;
   else if x < 276
     val=0.27;
   else if x < 310
     val=0.25;
   else if x < 355  
     val=0.15;
   else if x < 385
     val=0.23;
   else if x < 420
     val=0.26;
   else if x < 455 
     val=0.19;
 else  
   val=0.75;
   endif
   endif
   endif 
   endif 
   endif
   endif
   endif
   endif
   endif
 endif
 endfunction

Nachdem wir gemerkt haben, dass die Anpassung der Slowdown-Funktion an das damalige Infektionsgeschehen und nicht nur an die Infektionsrate erfolgen muss, haben wir uns anhand der gesammelten Daten eine neue Slowdown-Funktion gebastelt. Die Ergebnisse sehen sie auf der rechten Seite.  

Implementierung der Slowdown-Funktion in Octave
Bearbeiten
 
 
 %Slowdown-Funktion
 for i=1:(length(timesWHO))
   c_funktion(i)=SIR_slowdown_verbessert (timesWHO (i), 0);
 endfor
 T=1;
 c_real(1)=c_funktion(1);
 for i=T+1:n
   c_real(i-T)=(inf_falleWHO(i)-inf_falleWHO(i-T))/(inf_falleWHO(i-T));
 endfor
 c_real_durchschnitt=c_real;
 for i=4:n-4
   c_real_durchschnitt(i)=(c_real(i-3)+ c_real(i-2)+c_real(i-1)+c_real(i)+ c_real(i+1) + c_real(i+2)+c_real(i+3) )/7;
 endfor 
 figure(111)
 plot (timesWHO(1: n-1),c_funktion(1: n-1), timesWHO(1:n-1),c_real_durchschnitt(1:n-1))%,timesWHO(1: n-1), c_real_durchschnitt),timesWHO(1: n-1),c_beschraenkt_durchschnitt)
 grid on
 title ('Tatsächtliche Infektionsrate als 7-Tage Duchschnitt  und slow-down-Funktion')
 legend ('slow-down Funktion',  '7-Tage Durchschnitt', '7-Tage Durchschnitt beschr. Modell')
Bestimmung des relativen Fehlers
Bearbeiten
 
 
 %Berechnung der relativen Fehler und absoluten Fehler 
 aF1=y(:,2)'-(inf_falleWHOaktuell/1000)%Absoluter Fehler der aktuell Infizierten
 aF2=y (:,3)'-(inf_falleWHOrecovered/1000)%Absoluter Fehler der Genesenen 
 aF3=(y (:,3)'+y(:,2)')-(inf_falleWHO./1000)%Absoluter Fehler der kumulierten Infizierten + Genesenen 
 rF1=aF1./(inf_falleWHOaktuell/1000)%Relativer Fehler der aktuell Infizierten
 rF2=aF2./(inf_falleWHOrecovered/1000)%Relativer Fehler der Genesenen 
 rF3=aF3./(inf_falleWHO/1000)%Relativer Fehler der kumulierten Infizierten + Genesenen 
 figure(16)
 plot(timesWHO, rF1*100,'.-.r',timesWHO, rF2*100,'.-.b',timesWHO,rF3*100,'.-.g')
 title('Relativer Fehler Modell und Daten')
 xlabel('Tage ab 27. januar')
 ylabel('Abweichung in Prozent')
 legend('Aktuelle Corona-Infektionen','Genesene','Kumulierte Infektionen und Genesene')
 figure(17) 
 plot(timesWHO, aF1,'.-.r',timesWHO,aF2,'.-.b',timesWHO,aF3,'.-.g')
 title('Absoluter Fehler Modell und Daten')
 xlabel('Tage ab 27. januar')
 ylabel('Abweichung in absoluten Zahlen')
 legend('Aktuelle Corona-Infektionen','Genesene','Kumulierte Infektionen und Genesene')
Anpassung des Erfassungsfaktors durch eine Erfassungsfunktion
Bearbeiten

Zur Anpassung Erfassungsfunktion haben wir uns zunächst die Zahl der jeweiligen Testungen zur Hand genommen. Dazu haben wir uns auf die Zahlen des RKIs berufen. Diese geben für jede Kalenderwoche die Zahl der jeweils durchgeführten Tests aus und bieten somit die Möglichkeit die Testungen und die Testverfahren für die Bevölkerung transparenter zu gestalten. Grundannahme unserer Anpassung war, dass mit steigenden Testzahlen auch mehr Corona-Infektionen erkannt werden. Dabei haben wir angenommen, dass der Anteil der Infektionen, die vom Gesundheitssystem registriert werden, linear zur Anzahl der Tests steigt. Die Daten des RKIs zeigen, dass die Zahlen bis in Kalenderwoche 17/2020 auf einen durchschnittlichen Wert von ungefähr 300.000 Tests pro Woche angestiegen sind. Wir haben angenommen, dass bei 300.000 Testungen pro Woche 10% der wirklichen Infektionen auch durch das Gesundheitssystem erfasst werden. Aufbauend auf dieser Zahl haben wir unsere Funktion in Orientierung an den RKI-Zahlen angepasst. Dazu haben wir die Tage zwischen den Kalenderwochen gezählt und über den Differenzenquotient  , wobei   also den Tagen ab dem 27. Januar jeweils genau ein   (Erfasste Infektionen in Prozent) zugeordnet wird.

 

function val=SIR_erfassungsfunktion(x,t)

 % t gibt die Tage an, an denen die Erfassung der Infizierten besser wird.
 % Durch zum Beispiel Tests
 % Annahme bei 300.000 Tests Erfassung von 10% der Fälle 
   if x < t + 147%Signifikant steigende Zahlen der landesweiten Testungen in KW27/2020
     val=0.1 ;
     else if x < t + 196%Erstmalige Zahlen über 1 Mio. Testungen pro Woche 
       val=0.0014*(x-147)+0.1;
     else if x < t + 322%Maximale Testungen in KW 50/2020  
       val= 0.0018*(x-196)+0.3;
     else if x < t + 336%Testungen sinken über Weihnachten und Silvester
       val= -0.02*(x-322)+0.53;
     else if x < t + 455%Testungen steigen auf Mittel von 1.2 Mio pro Woche also ungefähr 40% 
       val= 0.0013*(x-336)+0.25;
   else 
     val= 0.4;
     endif 
     endif 
     endif 
     endif 
   endif 
 endfunction
Implementierung der Erfassungsfunktion
Bearbeiten
 
 
 %Erfassungs-Funktion
 for i=1:length(timesWHO)
   rr(i)=SIR_erfassungsfunktion (timesWHO (i),0);% r 
 endfor
 %Modell mit Erfassungsfunktion
 r=SIR_erfassungsfunktion(timesWHO,0);
 g=@(y,x) [-c*SIR_slowdown_verbessert(x)*y(1)*y(2)/(r*B);c*SIR_slowdown_verbessert(x)*y(1)*y(2)/B-w*y(2);w*y(2)-d*y(2)];
 y = lsode (g, yo, timesWHO);%y(1)= S(t) y(2) = I(t)
 figure(18)
 plot (timesWHO, y (:,2), '-.r', timesWHO, y (:,3),'-.b', timesWHO, y (:,3)+y(:,2),'-.g')
 hold on
 plot (timesWHO, inf_falleWHO./1000, 'sg', "linewidth",4,timesWHO,inf_falleWHOaktuell/1000, '*r' , timesWHO,inf_falleWHOrecovered/1000, '*b' )
 legend ( "Infected", "Removed", " Infected+Removed","German data I+R" ,"German data I ","German data R" ,"location", "west")
 axis([0,n, 0 ,3600])
 title('Vergleich Modell mit Erfassungsfunktion und CoronaDaten ')
 hold off
Bestimmung des relativen Fehlers
Bearbeiten
 
 
 %Berechnung relativer Fehler und absoluter Fehler 
 AF1=y(:,2)'-(inf_falleWHOaktuell/1000)
 AF2=y (:,3)'-(inf_falleWHOrecovered/1000)
 AF3=(y (:,3)'+y(:,2)')-(inf_falleWHO/1000)
 RF1=AF1./(inf_falleWHOaktuell/1000)
 RF2=AF2./(inf_falleWHOrecovered/1000)
 RF3=AF3./(inf_falleWHO/1000)
 
 %Grafische Darstellung 
 figure(19)
 plot(timesWHO, RF1*100,'.-.r',timesWHO, RF2*100,'.-.b',timesWHO,RF3*100,'.-.g')
 title('Relativer Fehler Modell mit Erfassungsfunktion und Daten')
 xlabel('Tage ab 27. januar')
 ylabel('Abweichung in Prozent')
 legend('Aktuelle Corona-Infektionen','Genesene','Kumulierte Infektionen und Genesene')
 figure(20) 
 plot(timesWHO, AF1,'.-.r',timesWHO,AF2,'.-.b',timesWHO,AF3,'.-.g')
 title('Absoluter Fehler Modell mit Erfassungsfunktion und Daten')
 xlabel('Tage ab 27. januar')
 ylabel('Abweichung in absoluten Zahlen')
 legend('Aktuelle Corona-Infektionen','Genesene','Kumulierte Infektionen und Genesene')

Nach der Anpassung der Erfassungsfunktion folgte natürlich auch das Implementieren dieser in unser Modell des modifizierten SIR Modells. Dazu wurden erstmal die Werte der Funktion implementiert und das System der Differentialgleichungen dementsprechend verändert.

Tutorium 4: Finite-Differenzen-Methode (Dirichlet- und Neumann-Randbedingung)

Bearbeiten
Randwertprobleme
Bearbeiten

Die genutzten elliptischen Differentialoperatoren wie der Laplace-Operator führen immer auf Randwertprobleme. Dementsprechend werden diese im weiteren Verfahren gelöst. Das Randwertproblem für Diffusionsgleichungen beschreibt ein Diffusionsproblem auf einem beschränkten Gebiet D. Über eine Randwertbedingung wird das Verhalten der approximierten Funktion   am Rand des Gebietes festgelegt. Nun gibt es verschiedene Typen von Randwertproblemen für partielle Differentialgleichungen. Für unsere Programmierung in Octave werden das Dirichlet- und das Neumann-Problem betrachtet.

Dirichlet-Problem
Bearbeiten

Beim Dirichlet-Problem werden die Randwertbedingungen als Funktionswerte vorgegeben.

 
 
Neumann-Problem
Bearbeiten

Beim Neumann-Problem werden anstatt Funktionswerten Ableitungswerte vorgeschrieben. Präziser gefasst, erfüllt die Funktion   die Neumann-Randbedingungen wenn die Richtungsableitungen von   in der Richtung des äußeren Normalenvektors gegeben sind.

 
 
Finite Differenzen: Grundidee
Bearbeiten

Aufgabe im vierten Tutorium der Veranstaltung war die Implementierung der Finiten-Differenzen-Methode. Einer der wohl bekanntesten numerischen Diskretisierungsverfahren für partielle Differentialgleichungen. Dabei handelt es sich um ein gitter-basiertes Verfahren, das eine unbekannte Funktion   auf endlich vielen Gitterpunkten   approximiert. Dazu werden die Differentialoperatoren der Differentialgleichung durch Punktauswertung des Differenzenquotienten approximiert, wodurch aus (nicht-)linearen Differentialgleichungen Systeme (nicht-) linearer Gleichungen werden. Die Differenzenquotienten ergeben sich als Approximation der Ableitungen von   nach dem Abbruch der Taylorreihe bzw. aus der Taylorformel mit Lagrangeschem Restglied

Taylorreihe
Bearbeiten
  .
Taylorformel mit lagrangeschem Restglied
Bearbeiten

Sei Funktion   hinreichend oft differenzierbar.

 
Erste Differenzenquotienten
Bearbeiten

Damit ergibt sich

  • für den ersten (vorwärts-) Differenzenquotient
 ,
  • für den ersten (rückwärts-) Differenzenquotient mit Anwendung von   anstatt von   in der obigen Taylorformel
 ,
  • für den ersten zentralen Differenzenquotient durch aus der Summe  ,
 

Alle drei, also der vorwärts, rückwärts und zentrale Differenzenquotient approximieren die erste Ableitung   für   falls   hinreichend oft differenzierbar auf einem Intervall   ist mit  .

Zweite Differenzenquotienten
Bearbeiten

Der zweite Differenzenquotient approximiert die zweite Ableitung   an der Stelle  , falls   hinreichend oft differenzierbar ist.

Die Formel für   ergibt sich aus der Differenz der ersten Differenzenquotienten   mithilfe der Taylorentwicklung bis zur vierten Ableitung:

 
Beispiel eines Dirichlet-Problems in einer Raumdimension
Bearbeiten

Grundidee ist also die Differentialoperatoren durch finite Differenzen zu approximieren. Dazu suchen wir eine Funktion  , die für einen Quellterm   sowohl die Differentialgleichung   (auf dem gesamten Rechengebiet), als auch die Randwertbedingungen   erfüllt. Gegeben ist also folgendes Randwertproblem:

  für  
 

Zur Lösung mit der Finiten Differenzen Methode wird das Intervall   durch die Gitterpunkte   mit der Gitterweite   diskretisiert. Die zweite Ableitung wird nun durch den oben gezeigten zentralen Differenzenquotient der zweiten Ableitung diskretisiert   für jedes  .Hier bezeichnet  .

Dies ergibt an den inneren Gitterpunkten die Differenzengleichungen

  für  

für die numerischen Näherungswerte   der Lösungswerte  . Unter Verwendung der gegebenen Randwerte   entsteht ein lineares Gleichungssystem mit   Gleichungen für die   Unbekannten  .

  mit der tridiagonalen Systemmatrix  

In Matrixform ergibt sich also folgendes zu lösendes System:

 
Beispiel eines Neumann-Randwertproblem in einer Raumdimension
Bearbeiten

Wie oben bereits beschrieben, werden beim Neumann-Randwertproblem die Richtungsableitungen der Funktion   in Richtung der äußeren Normalenvektoren gegeben. Seien die Randbedingungen in den Normalrichtungen   gegeben:

 

Um die Ableitungen in den Randpunkten zu approximieren führen wir neue Unbekannte Funktionswerte in den Randpunkten   und   mit   ein. Das Gitter geht ebenfalls wie bereits im LGS beim Dirichlet-Randwertproblem von  . Nun bieten sich zwei Approximationsmöglichkeiten. Die Approximation erster Ordnung über die einseitigen Differenzenquotienten, also den Vorwärts- und Rückwärtsdifferenzenquotient oder die Approximation zweiter Ordnung über den ersten zentralen Differenzenquotient. Gerade die zweite Möglichkeit bietet wohl genauere Lösungen.

Approximation erster Ordnung
Bearbeiten

Ersetzt man die Ableitung der Funktion   am Punkt   durch den Vorwärtsdifferenzenquotient, erlauben wir uns einen Fehler  , der sich durch eine Konstante mal den Wert h nach oben abschätzen lässt.

* den vorwärts -Differenzenquotient  

Ersetzt man die Ableitung der Funktion   am Punkt   durch den Rückwärtsdifferenzenquotient, erlauben wir uns einen Fehler  , der sich durch eine Konstante mal den Wert h nach oben abschätzen lässt.

* den rückwärts -Differenzenquotient  

So erhalten wir letztendlich zwei neue Gleichungen. Die Gleichung für   und  , also die 0-te und  -te Gleichung.

 ,
 
Systemmatrix
Bearbeiten

So ergibt sich in Matrixform folgende Systemmatrix   mit   und Vektor u  .

Lineares Gleichungssystem für Neumann-Problem mit Approximation erster Ordnung
Bearbeiten

 

Approximation zweiter Ordnung
Bearbeiten

Ersetzt man die Ableitung in den Randpunkten   durch den ersten zentralen Differenzenquotienten, approximiert man die Ableitung   in   bzw.   und   in   bzw.   durch:

  mit    

  mit  . 

Dazu werden erneute neue unbekannte Funktionswerte   und   festgelegt. Dabei liegt   links vom Randpunkt   und   rechts vom Randpunkt  . Durch Umformen erhalten wir nun erneut zwei neue Gleichungen des LGS. DIe  -te Gleichung und die  -te Gleichung mit

 ,
 .

Nun möchten wir aber unser System nicht wieder um zwei weitere neue unbekannte ergänzen, weswegen wir auf einen anderen Ansatz zurückgreifen. Dementsprechend ersetzen wir die neuen Unbekannten in den ersten zentralen Differenzenquotienten durch die Approximation der zweiten Ableitung in den Randpunkten, also durch den zweiten Differenzenquotienten an den Randpunkten  :

  und   
  und   

Nun setzen wir in die Approximation der zweiten Ableitung ein:

  und  

Durch Umformen gelangt man letztendlich zu   bzw.   und   bzw.  

Systemmatrix
Bearbeiten

So ergibt sich in Matrixform folgende Systemmatrix   mit   und Vektor u  

Lineares Gleichungssystem für Neumann-Problem für Approximation zweiter Ordnung
Bearbeiten

 

Regularität der Systemmatrizen
Bearbeiten

Das somit entstehende LGS wäre nun nur eindeutig lösbar, wenn die Systemmatrizen regulär wären. Das heißt:

Eine  -Matrix   mit Einträgen aus einem Körper  , zum Beispiel die reellen oder komplexen Zahlen, ist genau dann invertierbar, wenn eine der folgenden äquivalenten Bedingungen erfüllt ist:

  • Es gibt eine Matrix   mit  .
  • Die Determinante von   ist ungleich null.
  • Die Eigenwerte von   sind alle ungleich null.
  • Für alle   existiert mindestens eine Lösung   des linearen Gleichungssystems  .
  • Für alle   existiert höchstens eine Lösung   des linearen Gleichungssystems  .
  • Das lineare Gleichungssystem   besitzt nur die triviale Lösung  .
  • Die Zeilenvektoren sind linear unabhängig.
  • Die Zeilenvektoren erzeugen  .
  • Die Spaltenvektoren sind linear unabhängig.
  • Die Spaltenvektoren erzeugen  .
  • Der Rang der Matrix   ist gleich  .

Berechnet man nun die Determinante der Matrizen   und   so ist diese sowohl für die Systemmatrix der Approximation erster Ordnung, als auch für die Approximation zweiter Ordnung  . Ebenso gut könnte man allerdings auch zum Beispiel den Rang der Matrix über das Gauß Verfahren bestimmen. Siehe Beispiel   für  .   Des Weiteren sind die Vektoren linear abhängig. Multipliziert man die Systemmatrizen von rechts mit dem Einsvektor erhält man den Nullvektor und somit lässt sich der Nullvektor nicht nur durch die triviale Lösung erzeugen. Daraus folgt aus oben gegebenen äquivalenten Bedingungen, dass die Matrix nicht regulär ist und somit existiert keine eindeutige Lösung für das LGS.

Dirichlet-Randwertproblem in zwei Raumdimensionen
Bearbeiten
Homogene Randbedingungen
Bearbeiten

Gegeben ist nun folgendes Dirichlet-Randwertproblem mit homogenen Randbedingungen auf dem rechteckigen Gebiet   mit  :

  in  
        auf  
 
 %----------------------------------
 %Implementierung der Quellfunktion 
 %----------------------------------
 function wert=Quellfunktion_FDM(x,y)
   if sqrt((x.-3.25).^2+(y.-3).^2)<=0.35 wert=1;
     elseif
       sqrt((x.-6).^2+(y.-1).^2)<=0.45 wert=1.5;
  else wert=0;
  endif
 endfunction
%------------------------------------------------
 %Eingabe der homogenen Dirichlet-Randbedingungen
 %------------------------------------------------
 funktion_unten  = @(x) [0];
 funktion_oben   = @(x) [0];
 funktion_links  = @(x) [0];
 funktion_rechts = @(x) [0];

Gesucht wird nun die Funktion   mit  

Nun überziehen wir unser rechteckiges Gebiet   mit einem äquidistanten Netz aus Gitterpunkten. Da wir uns im zweidimensionalen Bereich befinden benötigen wir Gitterpunkte in   und  Richtung mit konstanter Gittergröße  .

 
 
 
 %--------------------------------------
 %Aufspannen des rechteckigen Gebiets D
 %--------------------------------------
 %definiere Gebiet D
 xend=8;
 yend=5.0; 
 %--------------------------------------
 %Implementierung des Gitters in Octave
 %--------------------------------------
 %Anzahl von X-Punkten, verkleinern Sie diese um die Struktur der Matrix in weiteren Zellen besser zu erkennen.
 N=60
 %Berechnung der konstanten Gittergröße
 hx=xend/(N+1)
 hy=hx;
 M=floor((yend/hy))-1;
 %Koordinatenmatrix der Gitterpunkte
 [x,y]=meshgrid(hx:hx:xend-hx,hy:hy:yend-hy);

Man bezeichne nun die Approximation der Lösung in den jeweiligen Gitterpunkten  :

 

Die Differenzenquotienten mit welchen die Funktionswerte in den Gitterpunkten approximiert werden, müssen nun ebenfalls wie unsere Gitterpunkte an die zweite Raumdimension angepasst werden. Dabei werden die zweiten Differenzenquotienten   genutzt, um die partiellen Ableitungen von der gesuchten Funktion   nach x und y zu approximieren:

 
 

Ersetzt man nun die zweite Ableitung durch dieses Schema in jedem Gitterpunkt   ersetzen, bekommen wir unser Approximationsschema. So erhalten wir als Approximation des Laplace-Operators, die Summe dieser zwei Differenzenquotienten:

 

Diese Approximation führen wir für jeden Gitterpunkt durch, wodurch wir  - Gleichungen, die durch die Nachbarpunkte des Punktes   verbunden sind. Dieses Schema nennt man auch das 5-Punkt-Sternschema. Dieses ergibt sich nach dem Approximationsschema, indem man 4-mal den zentralen Punkt   nimmt und jeweils einmal den oberen, unteren, rechten und linken Nachbar hinzu addiert. Die Randwerte werden nun approximiert, indem man die Nachbarpunkte im Rand durch die gegebenen Randwertbedingungen ersetzt. In den Randgitterpunkten   werden die Werte von   nach der Dirichlet-Randbedingung folgend ersetzt:

 , 
 .

Nun werden die unbekannten Approximationen der Lösung in der Gitterpunkten in einem langen Vektor eingeordnet. Dabei werden diese Werte in einer bestimmten Reihenfolge in den Vektor eingeordnet. Siehe [8]. Diese Assemblierung findet ebenfalls für den Vektor der rechten Seite statt. Nach der oben beschriebenen numerischen Diskretisierung und Assemblierung des unbekannten Vektors ergibt sich nun ein LGS der Form   mit der Blocktridiagonalmatrix  

size (f);
 %reshape funktioniert Spaltenmässig: es wird Spalte1, dann Spalte2, usw eingeordnet, wobei wir die Matrix f nach Reihen/Zeilen einordnen.
 %Daher soll die Matrix f' mit N(Zeilen)x M(Spalten) in ein langern Vektor eingeordnet.
 b=-1*reshape(f',(N*M),1);
 
 
 %----------------------------------------------------------------------------
 %Aufstellen der Systemmatrix durch Zusammensetzen aus verschiedenen Blöcken
 %----------------------------------------------------------------------------
 %Funktion zur Anpassung des Zwischenblocks der Matrix 
 %-----------------------------------------------------
 function wert = Zwischenblock(N,B1,B,C1,zeilennummer)
   wert = [repmat(C1,[1,zeilennummer-2]),B1,B,B1,repmat(C1,[1,N-(zeilennummer+1)])];
 endfunction
 %-----------------------------
 %Erstellen der Blockmatrix
 %-----------------------------
 function wert = Blockmatrix(N,M,h)
   %---------------------------------
   %Erstellen der einzelnen Matrizen
   %---------------------------------
   B = diag(-4*ones(N,1),0)+diag(ones(N-1,1),-1)+diag(ones(N-1,1),1);%Matrix B
   I=diag(ones(N,1),0);%Einheitsmatrix
   C1=diag(zeros(N,1),0);%Nullmatrix
   %---------------------------------
   %Anfang der Blockmatrix 
   %--------------------------------- 
   Ah=[B,I,repmat(C1,[1,M-2]); %1.Zeile
       I,B,I,repmat(C1,[1,M-3])]; %2.Zeile 
   %----------------------------------------------------------
   %Zwischenzeilen der Blockmatrix aus oben genannter Funktion
   %----------------------------------------------------------  
   for i = 1:M-4
     Ah=[Ah;Zwischenblock(M,I,B,C1,i+2)];
   endfor
   %----------------------------------
   %Abschließende Zeilen 
   Ah= [Ah;repmat(C1,[1,M-3]),I,B,I;
        repmat(C1,[1,M-2]),I,B]; 
   %-------------------------------------------------  
   %Definition der oben eingeführten Variable 'Wert'
   %--------------------------------------------------
   wert = Ah;
 endfunction
 
 B=Blockmatrix(N,M,hx);
 B=B*a/hx^2;

  mit Diagonalblock  
und der Einheitsmatrix   auf der Nebendiagonale.

 %------------------------------------------------------------------
 %Anpassung der rechten Seite auf dem Rand durch die Randbedingungen 
 %------------------------------------------------------------------
 for i=1+1:N  
 for j=1+1:M
 f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i));
 %Dirichlet Randbedingung oben und unten: 
   if j==1 
     f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i))+ funktion_unten(i*hx)*a/hx^2;  %(eine Konstante oder eine Funktion von x-also Vektor1(i)); 
   endif
   if j==M 
     f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i))+ funktion_oben(i*hx)*a/hx^2;  %(eine Konstanteoder eine Funktion von x -also Vektor2(i)); 
   endif
 %Dirichlet Randbedingung links und rechts:
   if (i==1)
     f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i))+ funktion_links(j*hx)*a/hx^2;    %(eine Konstante oder eine Funktion von y); endif
   endif
   if (i==N )
     f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i))+ funktion_rechts(j*hx)*a/hx^2;    %(eine Konstante oder eine Funktion von y); endif
   endif
 endfor
 endfor
 
 % Erneute Definition der unteren Reihe, weil es  irgendwie mit der funktion_unten, funktion_links nicht funktioniert...
 f(1,:)= 0*a/hx^2;
 f(:,1)= 0*a/hx^2;
 
 %Eckbeiträge
 f(1,1)=0;
 f(1,N)=0;
 f(M,1)=0;
 f(M,N)=0;
 % Wichtig!: Ecken-Beiträge: da in den Ecken jeweils der Differenzenquotioent in x (Wert Links oder rechts) in der Matrix schon festgelegt ist, muss Null entsprechend auf der rechten Sete stehen.
 %-------------------------------------------------
 % LOESUNGSSCHRITT
 %-------------------------------------------------
 sol=B\b;
 sol_matrix=reshape(sol,N,M);% Matrix mit N(Zeilen)x M(Spalten)
 sol_matrix=sol_matrix'; % Transponiert, wegen reshape

 

 

Inhomogene Randbedingungen
Bearbeiten

Sind die Randwertbedingungen nicht homogen, also unterschiedlich von Null, dann tragen die bekannten Randwerte der gesuchten Funktion zum Vektor der rechten Seite  .

 
 %Eingabe der inhomogenen Dirichlet-Ranbedingungen
 funktion_oben   = @(x) [0.01*x];
 funktion_unten  = @(x) [-0.25];
 funktion_rechts = @(x) [0.25];
 funktion_links  = @(x) [-0.2];

 
 %------------------------------------------------------------------
 %Anpassung der rechten Seite auf dem Rand durch die Randbedingungen 
 %------------------------------------------------------------------
 for i=1+1:N  
 for j=1+1:M
 f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i));
 %Dirichlet Randbedingung oben und unten: 
   if j==1 
     f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i))+ funktion_unten(i*hx)*a/hx^2;  
   endif
   if j==M 
     f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i))+ funktion_oben(i*hx)*a/hx^2;  
   endif
 %Dirichlet Randbedingung links und rechts:
   if (i==1)
     f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i))+ funktion_links(j*hx)*a/hx^2;    
   endif
   if (i==N )
     f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i))+ funktion_rechts(j*hx)*a/hx^2;    
   endif
 endfor
 endfor


 
 %Eckbeitraege!
 f(1,1)=1*Quellfunktion_FDM(x(1,1),y(1,1))+ (funktion_links(1*hx) + funktion_unten(1*hx))*a/hx^2;
 f(1,N)=1*Quellfunktion_FDM(x(1,N),y(1,N))+ (funktion_rechts(1*hx)+ funktion_unten(N*hx))*a/hx^2; %f(1,1);
 f(M,1)=1*Quellfunktion_FDM(x(M,1),y(M,1))+ (funktion_links(M*hx)+ funktion_oben(1*hx))*a/hx^2;
 f(M,N)=1*Quellfunktion_FDM(x(M,N),y(M,N))+ (funktion_rechts(M*hx)+ funktion_oben(N*hx))*a/hx^2; %f(M,1);

 

 

Neumann-Problem in zwei Raumdimensionen
Bearbeiten

Ähnlich wie beim Dirichlet-Problem wird die Anwendung der zweidimensionalen Differenzenquotienten in ein 5Punkt-Stern-Approximationsschema resultieren, bei dem ebenfalls in jedem Gitterpunkt der zentrale Punkte   viermal genommen wird und man jeweils den oberen, unteren, rechten und linken Nachbar hinzu addiert. Durch Behandlung der Randbedingungen werden zur Änderung einiger Blöcke der tridiagonalen Blockmatrix führen. Analog zum Neumann-Problem in einer Raumdimension wird die Matrix lediglich um die die Unbekannten   erweitert. Diese werden letztlich wieder zur Bildung der Differenzenquotienten verwendet.

Zunächst werden wieder die Randbedingungen gegeben. Das heißt, die Richtungsableitungen in die Normalenrichtung der unbekannten Funktion in den Randpunkten des Rechtecks werden gegeben:

 
* linker Rand:  
* rechter Rand:  
* unterer Rand:  
* oberer Rand:  
wobei  
Speziell   oder   am Rand eines  Rechtecks
 

Bei der Anwendung der einseitigen Differenzenquotienten, analog wie 1-dimensionalem Fall muss der Vektor der Unbekannten   um die Randwerte   erweitert werden, diese werden zur Bildung der Differenzenquotienten verwendet:

  • linker Rand: den vorwärts -Differenzenquotient  
  • rechter Rand: den rückwärts -Differenzenquotient  
  • unterer Rand: den vorwärts -Differenzenquotient  
  • oberer Rand: den rückwärts -Differenzenquotient  

(Hier wurde direkt die obige Neumann-Randbedingung für ein Rechteckgebiet   eingesetzt.)

Nach der Einordnung der unbekannter Werte in den Lösungsvektor wie obenbeschrieben (siehe Assemblierung ) ergibt sich wie zuvor eine erweiterte Blocktridiagonale Systemmatrix  :

  • erweitert um die 0-te und m+1-te Blockzeile für die Approximation der Ableitung nach y in den Gitterpunkten am oberem und unterem Rand,
  • die Blöcke der Matrix:   sind um die 0-te und n+1-te Zeile für die Approximation der Ableitung nach x in den Gitterpunkten am linkem und rechtem Rand erweitert


So ergibt sich in Matrixform folgender Block B mit   und Vektor u  .

Gemischte Randbedingungen
Bearbeiten

Aufgabe war es nun ein Programm zu schreiben, dass die Unbekannte Funktion   in den Gitterpunkten mit gemischten Randbedingungen approximiert. Linkes und rechts sollten homogene Neumann-Randbedingungen behandelten und oben und unten sollten inhomogene Dirichlet-Randbedingungen behandelt werden. Zunächst haben wir dazu unser rechteckiges Gebiet aufgespannt. Und danach das Gebiet mit dem erweiterten Gitter des Neumann-Problems überzogen. Dementsprechend mussten wir auch unsere Dimensionen der Matrizen N und M jeweils um eine Zeile oben und unten und eine Spalte rechts und links erweitern, da sonst das LGS zum Ende des Programms nicht aufgegangen wäre.

 
 %definiere Gebiet D
 xend=8;
 yend=5.0;
 %Anzahl von X-Punkten, verkleinern Sie diese um die Struktur der Matrix in weiteren Zellen besser zu erkennen.
 N=60
 %--------------------
 hx=xend/(N+1)
 hy=hx;
 M=floor((yend/hy))-1 
 %Koordinatenmatrix der Gitterpunkte
 [x,y]=meshgrid(0:hx:xend,0:hy:yend); 
 %wegen Erweiterung des Gitters bei Neumann-Problem
 N=N+2;
 M=M+2;
 %konstanter Diffusionskoeffizient
 a=0.1;
 %Dirichlet RB:
 funktion_unten  = @(x) [1];% [0.15*x];
 funktion_oben   = @(x) [-1];%[0.1*x];

Ebenfalls wie beim Dirichlet Problem haben wir dann unsere Funktion der rechten Seite implementiert.

 
 %------------------------------
 %Erstellen der Quellfunktion
 %------------------------------ 
 function wert=Quellfunktion_FDM(x,y)
   if sqrt((x.-3.25).^2+(y.-3).^2)<=0.35 wert=1;
     elseif
     sqrt((x.-6).^2+(y.-1).^2)<=0.45 wert=1.5;
   else wert=0;
   endif
 endfunction

Danach folgte der wohl wichtigste Schritt, nämlich die Anpassung der Blockmatrix, da sich die Blöcke durch die Erweiterung nach Neumann verändern. So haben wir Matrix   um die Unbekannten, siehe Neumann Problem in einer Raumdimension erweitert. Auch die Einheitsmatrix   wurde um die 0-te und  -Zeile erweitert, die jedoch mit Nullen gefüllt sind.

 
 
 %-------------------------------
 %Erstellen der Blockmatrix 
 %-------------------------------
 function wert = Blockmatrix(N,M,h)
   B = diag(-4*ones(N,1),0)+diag(ones(N-1,1),-1)+diag(ones(N-1,1),1);
     %----------------------------------------------
     %Erweiterung des B-Blocks durch die Unbekannten 
     %----------------------------------------------
     B(1,1)=-h;
     B(1,2)=+h;
     B(N,(N-1))=h;
     B(N,N)=-h;
   %---------------------------------
   %Erstellen der einzelnen Matrizen
   %---------------------------------
   I=diag(ones(N,1),0);
     %---------------------------------
     %Anpassen von 0-ter und n+1-Zeile 
     %---------------------------------
     I(1,1)=0;
     I(N,N)=0;
   C1=diag(zeros(N,1),0);
   %--------------------------
   %Anfang der Blockmatrix  
   %--------------------------
   Ah=[B,I,repmat(C1,[1,M-2]); 
       I,B,I,repmat(C1,[1,M-3])]; 
   %-------------------------------   
   %Zwischenzeilen der Blockmatrix  
   %-------------------------------
   for i = 1:M-4
     Ah=[Ah;Zwischenblock(M,I,B,C1,i+2)];
   endfor
    %-----------------------------------
    %Letzen zwei Zeilen der Blockmatrix
    %-----------------------------------
    Ah=[Ah;repmat(C1,[1,M-3]),I,B,I;
        repmat(C1,[1,M-2]),I,B]; 
   
   wert = Ah;
 endfunction

Aufgrund der inhomogenen Dirichlet-Randbedingungen muss der Vektor der rechten Seite angepasst werden. Dazu werden an den oberen und unteren Ränder die Bedingungen behandelt. Da jedoch Neumann für links und rechts gilt und diese homogen sind, verändern diese nichts am Vektor der rechten Seite. %rechte Seite des Systems

 for i=1+1:N  
 for j=1+1:M
 f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i));
   if j==1 
     f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i))+ funktion_unten(i*hx)*a/hx^2;  %(eine Konstante oder eine Funktion von x-also Vektor1(i)); 
   endif
   if j==M 
     f(j,i)=1*Quellfunktion_FDM(x(j,i),y(j,i))+ funktion_oben(i*hx)*a/hx^2;  %(eine Konstanteoder eine Funktion von x -also Vektor2(i)); 
   endif
 endfor
 endfor

Da an den Ecken jeweils die homogenen Randbedingungen gelten, müssen die Eckbeiträge nicht angepasst werden, wie es im reinen Dirichlet-Problem mit inhomogenen Randbedingungen ist. Aufgrund der

 
 
 %Eckbeiräge
 f(1,1)=0;
 f(1,N)=0;
 f(M,1)=0;
 f(M,N)=0;
 % Wichtig!: Ecken-Beiträge: da in den Ecken jeweils der Differenzenquotion in x (Wert Links oder rechts) in der Matrix schon festgelegt ist, muss Null entsprechend auf der rechten Sete stehen

Nun werden die unbekannten Approximationen der Lösung in der Gitterpunkten in einem langen Vektor eingeordnet. Dabei werden diese Werte in einer bestimmten Reihenfolge in den Vektor eingeordnet. Siehe [5]. Diese Assemblierung findet ebenfalls für den Vektor der rechten Seite statt. Nach der oben beschriebenen numerischen Diskretisierung und Assemblierung des unbekannten Vektors ergibt sich nun ein LGS der Form  

 size (f);
 %reshape funktioniert Spaltenmässig: es wird Spalte1, dann Spalte2, usw eingeordnet, wobei wir die Matrix f nach Reihen/Zeilen einordnen.
 %Daher soll die Matrix f' mit N(Zeilen)x M(Spalten) in ein langern Vektor eingeordnet.
 b=-1*reshape(f',(N*M),1);
 
 %-------------------------------------------------
 % LOESUNGSSCHRITT
 %-------------------------------------------------
 sol=B\b;
 sol_matrix=reshape(sol,N,M);% Matrix mit N(Zeilen)x M(Spalten)
 sol_matrix=sol_matrix'; % Transponiert, wegen reshape

Tutorium 5: Abschlussprojekt

Bearbeiten

Theoretischer Input

Bearbeiten

Für den Abschluss der letzten Tutoriumsaufgaben wird letztendlich sämtliche Theorie in einer letzten Modellierung zusammengebracht. Beginnend mit der Reaktionsdiffusionsgleichung, fortlaufend mit den Kompartimentmodellen und abschließend mit dem FDM-Verfahren sowie den Randwertproblemen.

Numerische Diskretisierung der Reaktionsdiffusionsgleichung
Bearbeiten

Die instationäre, inhomogene partielle Differentialgleichung der Reaktionsdiffusionsgleichung ist bereits aus Tutorium 2 und 3 bekannt, bietet sie uns die Möglichkeit über den Reaktionsterm der rechten Seite, die in Tutorium 3 behandelten Modelle, mit der Diffusion zu verbinden. Somit stellt der Reaktionsterm den Zusammenhang zwischen der räumlichen Infektionsverbreitung und den dynamischen Kompartimentmodellen her.

  

Die Funktion u sei dabei die Populationsdichte der (aktuell oder kummulierten) Infizierten Individuen, wobei der Reaktionsterm   die zeitliche Dynamik der aktuell oder der kummulierten Infizierten steuert.

Räumliche Semidiskretisierung für die Diffusiongleichung [9]

Bearbeiten

(Genommen aus Skript Frau Prof. Dr. Hundertmark)

Zuerst wird Neumann Randwertproblem für die zeitabhängige homogene Diffusionsgleichung auf einem Rechteckgebiet D betrachtet.

 
 

Im folgenden nehmen wir an, dass der Diffusionskoeffizient ist konstant,  . Somit erhalten wir die homogene Diffusionsgleichung in der Form  .

System von gewöhnlichen Differentialgleichungen

Bearbeiten

Mithilfe der räumlichen Semidiskretisierung des Laplace Operators mit Finite-Differenzenverfahren unter Beachtung der homogenen Neumann Randbedingungen   und Approximation der Richtungsableitungen erster Ordnung erhält man für ein festes   nach dem Stern-Approximationsschema

 ,

hierbei ist   der Vektor der Restriktionen der exakten Lösung an die Gitterpunkte   in Zeitpunkt   und   der Vektor der numerischen Lösung in den Gitterpunkten in Zeitpunkt  .

Die Matrix des Approximationsschema für Neumann Randbedingungen hat die Form:

 


wobei  
und der Einheitsmatrix  .


Schließlich ergibt sich nach der räumlichen Semidiskretisierung folgendes System der gewöhnlichen Differentialgleichungen:

 ,

Der Vektor der numerischen Lösung   wird hier als Funktion von Zeit betrachtet.

Räumliche Semidiskretisierung für die Reaktionsdiffusiongleichung

Bearbeiten
Diskretisierung des Reaktionsterms, Gesamtinfizierte
Bearbeiten

Der Reaktionsterm   an den Gitterpunkten wird Mithilfe der Restriktionen der exakten Lösung  formuliert, für die kumulierte Infizierte (Logistisches Wachstum):

 

wobei Vektor   der nach der Assemblierung aus der Matrix der Bevölkerungsdichte   entstanden ist und   ist komponentenweise Multiplikation.

Bemerkung: die logistische Infektionsrate  , vergleiche Modifiziertes SIR Modell berechnet sich als Rate der Infektionsverbreitung bei einer Kontaktrate: Wahrscheinlichkeit des Kontakts eines Infizierten mit einem Anfälligen.

Diskretisierung des Reaktionsterms, aktuell Infizierte
Bearbeiten

Im Falle der räumlichen Modellierung der Dichte der aktuellen Infizierten   in Wechselwirkung mit Susceptibles   nach dem Prinzip des SIR-Kompartimentmodells werden drei einander gekopelte Reaktionsdiffusionsgleichungen für die Dichtefunktionen   gelöst.

     

Diese partielle Differentialgleichungen werden durch die reche Seiten   gekoppelt. Die entsprechende Reaktionsterme   und   werden an den Gitterpunkten ausgewertet:

 
 
 

wobei   die Wechselrate zwischen den Infizierten und Genesenen ist.

Da die erste und zweite partielle Differentialgleichung für   nicht von   abhängig ist, kann man diese zwei Gleichungen separat lösen und   dann im Nachgang berechnen.)

System von gewöhnlichen Differentialgleichungen
Bearbeiten

Nach der Zunahme des diskretisierten Reaktionstern   zum System von gewöhnlichen Differentialgleichungen des räumlich diskretisierten Neumann Randwertproblems für die Diffusion ergibt sich folgendes System der gewöhnlichen Differentialgleichungen (GDGL) für die Reaktionsdiffusionsgleichung:

 

mit einem linearen Anteil   und einem nichtlinearen Anteil  .

Dieses GDGL System, ergänzt um die Anfangsbedingung gegeben durch eine bekannte Funktion  

 

definiert ein Anfangswertproblem für Reaktionsdiffusionsgleichung.

Zeitdiskretisierung der Reaktion-Diffusionsgleichung

Bearbeiten

Unter der Zeitdiskretisierung versteht man ein approximatives Vorgehen zur Bestimmung der Lösung eines Anfangswertproblems in diskreten Zeitpunkten. Der Zeitintervall   wird auf äquidistante Teilintervalle   der Länge   geteilt.

Das einfachste numerische Verfahren, das Euler- oder Polygonzugverfahren entsteht durch das Ersetzten der Zeitableitung   mit Vorwärts- oder Rückwardsdifferenzenquotienten

 .

Dieses Verfahren hat die Konvergenzordnung 1, siehe Approximationsgüte der Differenzenquotienten.

Nach dem Anwenden des ersten Differenzenquotientes im obigen System von GDL ergeben sich folgende Approximationsschemas erster Ordnung:

Unter Verwendung von   erhält man die Berechnungsformel

 

mit dem Startvektor  

 

Die numerische Lösung in einem neuen Zeitschritt   erhält man iterativ durch Einsetzen der Lösung aus dem vorherigen Zeitschritt   in die rechte Seite der obigen Formel. Dieses Verfahren hat beschränkten Bereich der zulässigen Schrittweiten   im Hinblick auf die Stabilität der numerischen Lösung, die Schrittweite   muss aus diesem Grund ausreichend klein gewählt werden, ansonsten kann die numerische Lösung nach wenigen Schritten instabil werden und 'explodieren'.

Unter Verwendung von   erhält man die implizite Berechnungsformel

 

mit dem Startvektor  

 

Die numerische Lösung im neuen Zeitschritt   erhält man nach dem Lösen des obigen Systems von nichlinearen Gleichungen für   und benötigt weitere numerische Approximationsverfahren für nichtlineare Gleichungssysteme. Dieses Verfahren hat gute Stabilitätseigenschaften in Hinblick auf die Schrittweite   (es ist A-stabil), die Schrittweite   ist stabilitätsbedingt nicht beschränkt.

Weitere Zeitdiskretisierungsverfahren für gewöhnliche Differentialgleichungen

Bearbeiten

Sei eine gewöhnliche Differentialgleichung oder ein System von DGL gegeben allgemein als

 

Unter Verwendung des zentralen Differenzenquotienten   erhält man
die explizite Mittelpunktregel (verbessertes Eulerverfahren) zweiter Ordnug:

 .

Ein weiteres Verfahren zweiter Ordnung ist die Trapezregel (Newmark scheme):

 .


Für weitere Diskretisierungsverfahren für die Anfangswertprobleme ggf. höherer Konvergenzordnungen siehe Runge-Kutta und Mehrschrittverfahren.

Raumdiskretisierung des regionaldifferenzierten Diffusionskoffizienten

Bearbeiten

Um die räumlichen Epidemieausbreitung regional zu differenzieren, nehmen wir an, dass der Diffusionskoeffizient von der Populationsdichte abhängig ist, siehe nicht-konstanter Diffusionkoeffizient

 .

Für diesen Fall muss Diffusionsmatrix (das Approximationsschema)   entsprechend angepasst werden, hierbei werden anstatt eines konstanten Faktors   vor der Matrix entsprechende Gitterwerte der Funktion   in der Matrix   figurieren.

Diskretisierung der Randbedingungen

Bearbeiten

Die homogene Neumann-Randbedingung in diesem Fall lautet:

 .

Mit Anwendung der einseitigen Differenzenquotienten und der Bezeichnung   erhält man

  • am linken und rechten Rand des Rechtecks:
 ,
  • am unteren und oberen Rand des Rechtecks:
 .

Diskretisierung des Diffusionsterms

Bearbeiten

Das Approximationsschema für den Diffusionsterm

 

kann mit zweifacher Anwendung des zentralen Differenzenquotienten im obigen Ausdruck in den inneren Gitterpunkten   hergeleitet werden:

  .

Herleitung des zweiten Differenzenquotienten bez. x:

 ,
 ,

hier bezeichnet   die Werte der Funktion zwischen den Gitterpunkten  .

Analog kann man für den zweiten Differenzenquotienten bez. y zeigen:

 .

Insgesamt gilt für den Diffusionsterm:

  •  
Approximationsschema
Bearbeiten

Unter der Anwendung der Approximation der Randbedingungen und des Diffusionsterms erhalten wir folgende Systemmatrix


 

wobei

 




 

  und  .

Bemerkung

Bearbeiten

In den obigen Matrizen kann man die Zwischenwerte der Funktion c durch die Mittelwerte ersetzen:

 
 

In diesem Fall braucht man für den raumabhängigen Diffusionsokeffizient nur die Matrix der Werte an den Gitterpunkten   speichern.

Für stückweise lineare Funktion   sind die obigen Mittelwerte identisch mit den Zwischenwerten, d.h in den obigen Formeln für   gilt Gleichheit '='.

Im Fall einer allgemeinen Funktion ist die Approximation durch die Mittelwerte von zweiter Ordnung, was nach der Addition der Taylorpolynome für   bzw.   folgt.

Ergänzungen Octave-Tutorial

Bearbeiten

Diese Ergänzungen wurden bei dem Octave-Tutorial vorgenommen, um die Implementation der Gruppe bzgl. der verwendeten Octave-Befehle nachvollziehbar zu machen.

Skripte in Octave

Bearbeiten

Referenzieren Sie hier die von Ihnen verwendeten Skripte und Bibliotheken in Octave oder R/Studio

Literatur

Bearbeiten

Notieren Sie hier die von Ihnen verwendete Literatur

  • Quelle 1
  1. https://de.wikiversity.org/wiki/Reeller_Vektorraum/Vektorfeld/Definition
  2. https://de.wikipedia.org/wiki/Laplace-Gleichung#Definition
  3. https://de.wikipedia.org/wiki/Diffusionskoeffizient
  4. https://de.wikiversity.org/wiki/Reaktion-Diffusionsprozess#Verallgemeinung_in_%7F'%22%60UNIQ--postMath-0000002D-QINU%60%22'%7F,_Zusammenfassung
  5. Laplace Gleichung, Wikipedia abgerufen am 21.04.2020
  6. a b Lawrence C. Evans: Partial Differential Equations. American M mathematical Society, Providence RI 1998, ISBN 0-8218-0772-2 (Graduate studies in mathematics 19)
  7. a b Fundamentallösung, Wärmeleitungsgleichung , Wikipedia .. abgerufen am 22.04.2020
  8. https://de.wikiversity.org/wiki/Numerische_Modellierung_der_Diffusion#Assemblierung
  9. https://de.wikiversity.org/wiki/Numerische_Modellierung_der_Diffusion#SW10:_Numerische_Diskretisierung_der_Reaktionsdiffusionsgleichung_mit_FDM