Gelöste Aufgaben/COVI: Unterschied zwischen den Versionen

Aus numpedia
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(31 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Category:Gelöste_Aufgaben]]
[[Category:Anfangswertproblem]]  
[[Category:Anfangswertproblem]]  
[[Category:Matlab]]


=Aufgabenstellung=
==Aufgabenstellung==
Als Ingenieure können wir die COVID-19-Epidemie genauso modellieren, wie technische Systeme.
Als Ingenieure können wir die COVID-19-Epidemie in Deutschland genauso modellieren wie technische Systeme. Wir brauchen dazu "Koordinaten" - also Messgrößen - die die quatitativen Größen des Krankheitsverlaufs erfassen.  


Wir brauchen dazu "Koordinaten" - also Messgrößen - die die Anzahl der Individuen erfassen, die
<onlyinclude>
[[Datei:Flatten the Curve.png|200px|mini|Numerische Lösung der COVID-19 Pandemmie als Anfangswertproblem.|alternativtext=COVID19|links]]
Gesucht ist hier ein phänomenologisches Modell für die Entwicklung der Anzahl der Individuen, die


*ansteckbar "''a''",
*ansteckbar "''a''",
Zeile 10: Zeile 14:
*genesen "''r''"
*genesen "''r''"


sind. Für jede dieser Koordinaten müssen wir nun "Bewegungsgleichungen" - also z.B. Differentialbeziehungen in der Zeit - hinschreiben.
sind.
</onlyinclude>
 
Für jede dieser Koordinaten müssen wir "Bewegungsgleichungen" - also Differentialbeziehungen in der Zeit als [[Anfangswertprobleme|Anfangswertproblem]] - hinschreiben.


Das nennen wir "Modellbildung".
Das nennen wir "Modellbildung".
Zeile 20: Zeile 27:
Das Modell ist nicht dafür gemacht, um daraus quantitative Schlussfolgerungen zu ziehen.}}  
Das Modell ist nicht dafür gemacht, um daraus quantitative Schlussfolgerungen zu ziehen.}}  


Diese algebraischen und Differentialgleichungen sind dabei nicht das Ergebnis von Gleichgewichtsbeziehungen wie in der Technischen Mechanik. Wir begnügen uns statt dessen damit, Phänomene der Epidemie mit unserer Mathematik zu erfassen.
Die algebraischen und Differentialgleichungen, die wir erhalten, sind dabei nicht das Ergebnis von Gleichgewichtsbeziehungen wie in der Technischen Mechanik. Wir begnügen uns statt dessen damit, Phänomene der Epidemie mit unserer Mathematik zu erfassen.
[[Datei:Flatten the Curve.png|mini|Numerische Lösung der COVID-19 Pandemmie als Anfangswertproblem.|alternativtext=|links]]
 
Und so gehen wir vor:
Und so gehen wir vor:


Zeile 32: Zeile 39:
::<math>i_0=1000</math>
::<math>i_0=1000</math>


infiziert.
infiziert.  
 
== Lösung mit Matlab<sup>®</sup> ==
{{MyCodeBlock|title=Header|
text=Wir lösen hier das Anfangswertproblem zu nichtlinearen Bewegungsgleichungen.
 
Diese Gleichungen haben wir nicht - wir entwickeln sie ad-hoc und achten nur darauf, zentrale Phänomene abzubilden. Eine Abbildung der realen Zahlen ist nicht beabsichtigt.|
code=
<syntaxhighlight lang="matlab" line start=1>
%*******************************************************
%* matlab script                                      *
%* version: R2020a                                    *
%* author: Andreas Baumgart                            *
%* last updated: 2020-03-25                            *
%* ref: Technische Mechanik mit Computer              *
%* description: COVID-19 Simulation                    *
%*              no spatial resoultion                  *
%*******************************************************
</syntaxhighlight>
}}
 
{{MyCodeBlock|title=Declarations|text=Wir verwenden diese Parameter aus einer Tabelle
[[Datei:COVI-Excel-Eingabedatei.png|left|mini|EXCEL-Datei mit Parametern]]
und erklären unten, wie wir sie einsetzten.|code=
<syntaxhighlight lang="matlab" line start=11>
cd 'C:\Users\abs384\OneDrive\Confluence Sources\COVI'
addpath('.\functions')
% load parameters
parameter = readtable('parameter.xlsx');
for row=1:length(parameter.name)
  eval(strcat(char(parameter.name(row)),'=', num2str(parameter.zahl(row))))
end
</syntaxhighlight>
}}
 
{{MyCodeBlock|title=Equations of Motion|
text=Die Bewegungsgleichungen schreiben wir für die Anzahl der Individuen an,
* die infiziert sind (Koordinate "''i''") und
* die genesen sind (Koordinate "''r''").
Die Anzahl der Individuen, die sich noch anstecken können, ergibt sich dann aus
 
:: <math>a(t)=n_0-i(t)-r(t)</math>


==Lösung mit Maxima==
Unsere "Minimal-Koordinaten" des Systems sind also ''i'' und ''r''.
{| class="wikitable"
 
|+
Jetzt lassen wir unserer Fantasie freien Lauf:|
! colspan="2" style="text-align:left;" |Header
code=
|-
<syntaxhighlight lang="matlab" line start=21>
| style="width: 50%; vertical-align:top;" |Wir lösen hier das Anfangswertproblem zu nichtlinearen Bewegungsgleichungen.
function dydt = covid19(t,y,dt,DS,n,a0,lambda)
Diese Gleichungen haben wir nicht - wir entwickeln sie ad-hoc und achten nur darauf, zentrale Phänomene abzubilden. Eine Abbildung der realen Zahlen ist nicht beabsichtigt.
%  COVID19 Evaluate the COVID19 ODEs
|<syntaxhighlight lang="notmuch">
%
/*******************************************************/
%  last updated: 2020-03-24
/* declare variational variables */
%  author: Andreas Baumgart
declare("δW", alphabetic); /* virtual work */
declare("δA", alphabetic); /* virtual work of implied external forces */
declare("δΠ", alphabetic); /* virtual strain energy */
declare("δu", alphabetic); /* variation of u */
declare("δw", alphabetic);
declare("δφ", alphabetic);
declare("δη", alphabetic);
declare("δθ", alphabetic);
declare("λ" , alphabetic); /* otherwise, this is the lambda fct. */
declare("μ" , alphabetic);
declare("Δr", alphabetic); /*displacement of material point [x,y,z] */
declare("δΔr",alphabetic); /* variation of Δr */
declare("δZ", alphabetic); /* variation of strain */
   
   
/*******************************************************/
% present state of pandemy
/* parameters */
q = y(end,:);
/* abbreviate: */
% individuals left to be infected
geometry  : [h^3 = 12*I[y]/b, b^3 = 12*I[z]/h, b = A/h];
a = n - sum(q);
/* Lame's Constants                                */
/* see https://en.wikipedia.org/wiki/Hooke%27s_law */
lameConst : [λ = e*nu/((1+nu)*(1-2*nu)), μ = e/(2*(1+nu))];
   
   
/* relation: hook's law, modulus of elasticity    */
% assign i=0 for t<0
/* see https://en.wikipedia.org/wiki/Hooke%27s_law */
if length(y)>DS
E :  matrix([2*μ+λ,     λ,    λ,  0,  0,  0],
     i = y(end-DS,1);
            [    λ, 2*μ+λ,    λ,  0,  0,  0],
else
            [    λ,    λ, 2*μ+λ,  0,  0,  0],
     i=0;
            [    0,    0,    0,  μ,  0,  0],
end
            [   0,    0,    0,  0,  μ,  0],
% recovery rate
            [    0,    0,    0,  0,  0μ]);
r = dt*lambda(2)*i;
      % infected                  % recovered
dydt=[dt*lambda(1)*q(1)*(a-a0)-rr          ];
   
   
/* Strain Displacement Relation */
end
/* see https://en.wikipedia.org/wiki/Hooke%27s_law */
</syntaxhighlight>
StrainDispl(arg) := [epsilon[x,x] =     diff(arg[1],x),
}}
                    epsilon[y,y] =     diff(arg[2],y),
 
                    epsilon[z,z] =     diff(arg[3],z),
{{MyCodeBlock|title=Solving|
                    epsilon[x,y] = 1/2*(diff(arg[1],y) + diff(arg[2],x)),
text=
                    epsilon[x,z] = 1/2*(diff(arg[1],z) + diff(arg[3],x)),
<h4>1: Die Bewegungsgleichung für ''r''</h3>
                    epsilon[y,z] = 1/2*(diff(arg[2],z) + diff(arg[3],y))];
Die Änderung der Anzahl der Genesenen ist proportional zu Anzahl der Infizierten. Man könnte man also
 
::<math>\displaystyle \frac{d}{dt} r(t) = \lambda_2 \cdot i(t)</math>
 
anschreiben. Allerdings genesen zum Zeitpunkt t die Personen, die sich zum Zeitpunkt t-ΔT infiziert hatten. Dazwischen liegt gerade der gesamte Krankheitsverlauf mit der Dauer ΔT. Also schreiben wir
 
::<math>\displaystyle \frac{d}{dt} r(t) = \lambda_2 \cdot i(t-\Delta T)</math>
 
und nennen ΔT die Genesungsdauer - oder in Begriffen der Schwingungslehre: Totzeit (engl.: "dead-time").
 
<h4>2: Die Bewegungsleichungen für ''i''</h4>
 
Die Änderung der Anzahl der Infizierten steigt mit der Anzahl der Infizierten i selbst und mit der Anzahl der ansteckbaren Individuen a.
Sie reduziert sich um die Änderung der Anzahl der genesenen Individuen r.
Allerdings weiß man aus Erfahrung, dass eine Epedemie endet, wenn ein bestimmter Durchseuchungsgrad  α erreicht ist.
Also wählen wir
 
::<math>\displaystyle \frac{d}{dt} i(t) = \lambda_1 \;\; i(t) \cdot (a(t)-a_0) - \frac{d}{dt} r(t) \;\;\text{ mit } a_0 = \alpha\cdot n_0</math>.
 
Beim Auftragen des Produkts i∙(a-a0) unten erkennt man gut, wie die Funktion für i=0 und (a-a0)=0 Null liefert - also die Zuwachsrate der Infizierten Null ist, wenn niemand infiziert ist oder die Anzahl der ansteckbaren Individuen Null ist. Dazwischen steigt die Funktion steil an:
[[Datei:COVI-Ansteckungsfunktion.png|left|mini|Die "Ansteckungsfunktion" des Modells]]
 
Damit haben wir zwei Bewegungsdifferentialgleichungen, die wir in die Matlab-Funktion "covid19" schrieben.
 
Die Bewegungsgleichungen machen wir dimensionslos mit
 
::<math>t = \Delta T \cdot \tau</math>
 
und erhalten als Bewegungsgleichungen
 
::<math>
\displaystyle \frac{d}{d\tau} \left(\begin{array}{c}
i(\tau)\\r(\tau)\end{array}\right)=\left(\begin{array}{c}
\Delta T\cdot\lambda_1\;\cdot\; i(\tau)\cdot (a(\tau)-a_0) - \displaystyle \frac{dr(\tau)}{d\tau}\\
\Delta T \cdot \lambda_2 \; \cdot \; i(\tau-1)
\end{array}\right)
</math>.|
code=
<syntaxhighlight lang="matlab" line start=51>
% limit of infection
a0= n*alpha
 
% initial values in Mio. individuals
y = [ 1E-3 0];
 
% time steps and "dates"
dt=0.1;
t=0:dt:50;
 
% dead-time given in integration steps
DS=int16(round(DT/dt));
 
% make lambda dim'less
lambda = DT*lambda;
 
% Eulers Method
for j=2:length(t) 
    y(end+1,:)=y(end,:) + covid19(t,y,dt,DS,n,a0,lambda);
end
</syntaxhighlight>
}}
 
{{MyCodeBlock|title=Postprocessing|
text=
Die Ergebnisse plotten wir für verschiedene Werte von λ:
 
[[Datei:COVI-result-01.png|left|mini|... für ''λ<sub>1</sub>'' = 0.016]]
[[Datei:COVI-result-02.png|left|mini|... für ''λ<sub>1</sub>'' = 0.012]]
 
Hier sieht man, wie unterschiedliche Ansteckungsraten zu unterschiedlich hohen Maximalwerten in den Infizierten ''i'' zu einem bestimmten Zeitpunkt führen. Und warum es sinnvoll ist, dieses ''λ'' niedrig zu halten.|
code=
<syntaxhighlight lang="matlab" line start=71>
% plot results
hold on
plot(t,y(:,1))
plot(t,y(:,2))
plot(t,n-y(:,1)-y(:,2))
hold off
legend('i(t)','r(t)','a(t)')
xlabel('t / tBez →')  
ylabel('Individuen / Mio →')  
</syntaxhighlight>
</syntaxhighlight>
|-
}}
|
[[Kategorie:Totzeit]]
|
|-
|
|
|}

Aktuelle Version vom 7. November 2021, 16:45 Uhr


Aufgabenstellung

Als Ingenieure können wir die COVID-19-Epidemie in Deutschland genauso modellieren wie technische Systeme. Wir brauchen dazu "Koordinaten" - also Messgrößen - die die quatitativen Größen des Krankheitsverlaufs erfassen.


COVID19
Numerische Lösung der COVID-19 Pandemmie als Anfangswertproblem.

Gesucht ist hier ein phänomenologisches Modell für die Entwicklung der Anzahl der Individuen, die

  • ansteckbar "a",
  • infiziert "i" - mit und ohne Sympthome - und
  • genesen "r"

sind.


Für jede dieser Koordinaten müssen wir "Bewegungsgleichungen" - also Differentialbeziehungen in der Zeit als Anfangswertproblem - hinschreiben.

Das nennen wir "Modellbildung".

🧨 Dies ist kein zuverlässiges Prognosewerkzweug:
Hier geht es um die Modellierung
  • der zeitlichen Zusammenhänge,
  • die Interpretation der Zustandsgrößen des Systems und
  • das Verständnis der Abläufe bei der Verbreitung des Virus in Abhängigkeit von zentralen Systemparametern.
Das Modell ist nicht dafür gemacht, um daraus quantitative Schlussfolgerungen zu ziehen.

Die algebraischen und Differentialgleichungen, die wir erhalten, sind dabei nicht das Ergebnis von Gleichgewichtsbeziehungen wie in der Technischen Mechanik. Wir begnügen uns statt dessen damit, Phänomene der Epidemie mit unserer Mathematik zu erfassen.

Und so gehen wir vor:

Wir modellieren eine Grundgesamtheit von n0 = 80 Millionen Individuen.

Die Pandemie soll bei einer Durchseuchung von α=50% zum Stillstand kommen - die Individuen sind dann so weit voneinander entfernt, dass eine Ansteckung unwahrscheinlich ist.

Zum Zeitpunkt t0=0 seien von insgesamt i0 Individuen mit

infiziert.

Lösung mit Matlab®

Header

Wir lösen hier das Anfangswertproblem zu nichtlinearen Bewegungsgleichungen.

Diese Gleichungen haben wir nicht - wir entwickeln sie ad-hoc und achten nur darauf, zentrale Phänomene abzubilden. Eine Abbildung der realen Zahlen ist nicht beabsichtigt.


%*******************************************************
%* matlab script                                       *
%* version: R2020a                                     *
%* author: Andreas Baumgart                            *
%* last updated: 2020-03-25                            *
%* ref: Technische Mechanik mit Computer               *
%* description: COVID-19 Simulation                    *
%*              no spatial resoultion                  *
%*******************************************************




Declarations

Wir verwenden diese Parameter aus einer Tabelle

EXCEL-Datei mit Parametern

und erklären unten, wie wir sie einsetzten.


cd 'C:\Users\abs384\OneDrive\Confluence Sources\COVI'
addpath('.\functions')
 
% load parameters
parameter = readtable('parameter.xlsx');
for row=1:length(parameter.name)
   eval(strcat(char(parameter.name(row)),'=', num2str(parameter.zahl(row))))
end




Equations of Motion

Die Bewegungsgleichungen schreiben wir für die Anzahl der Individuen an,

  • die infiziert sind (Koordinate "i") und
  • die genesen sind (Koordinate "r").

Die Anzahl der Individuen, die sich noch anstecken können, ergibt sich dann aus

Unsere "Minimal-Koordinaten" des Systems sind also i und r.

Jetzt lassen wir unserer Fantasie freien Lauf:


function dydt = covid19(t,y,dt,DS,n,a0,lambda)
%   COVID19 Evaluate the COVID19 ODEs
%
%   last updated: 2020-03-24
%   author: Andreas Baumgart
 
% present state of pandemy
q = y(end,:);
% individuals left to be infected
a = n - sum(q);
 
% assign i=0 for t<0
if length(y)>DS
    i = y(end-DS,1);
else
    i=0;
end
% recovery rate
r = dt*lambda(2)*i;
      % infected                   % recovered
dydt=[dt*lambda(1)*q(1)*(a-a0)-r,  r          ];
 
end




Solving

1: Die Bewegungsgleichung für r

Die Änderung der Anzahl der Genesenen ist proportional zu Anzahl der Infizierten. Man könnte man also

anschreiben. Allerdings genesen zum Zeitpunkt t die Personen, die sich zum Zeitpunkt t-ΔT infiziert hatten. Dazwischen liegt gerade der gesamte Krankheitsverlauf mit der Dauer ΔT. Also schreiben wir

und nennen ΔT die Genesungsdauer - oder in Begriffen der Schwingungslehre: Totzeit (engl.: "dead-time").

2: Die Bewegungsleichungen für i

Die Änderung der Anzahl der Infizierten steigt mit der Anzahl der Infizierten i selbst und mit der Anzahl der ansteckbaren Individuen a. Sie reduziert sich um die Änderung der Anzahl der genesenen Individuen r. Allerdings weiß man aus Erfahrung, dass eine Epedemie endet, wenn ein bestimmter Durchseuchungsgrad α erreicht ist. Also wählen wir

.

Beim Auftragen des Produkts i∙(a-a0) unten erkennt man gut, wie die Funktion für i=0 und (a-a0)=0 Null liefert - also die Zuwachsrate der Infizierten Null ist, wenn niemand infiziert ist oder die Anzahl der ansteckbaren Individuen Null ist. Dazwischen steigt die Funktion steil an:

Die "Ansteckungsfunktion" des Modells

Damit haben wir zwei Bewegungsdifferentialgleichungen, die wir in die Matlab-Funktion "covid19" schrieben.

Die Bewegungsgleichungen machen wir dimensionslos mit

und erhalten als Bewegungsgleichungen

.

% limit of infection
a0= n*alpha

% initial values in Mio. individuals
y = [ 1E-3 0];

% time steps and "dates"
dt=0.1;
t=0:dt:50;

% dead-time given in integration steps
DS=int16(round(DT/dt));

% make lambda dim'less
lambda = DT*lambda;

% Eulers Method
for j=2:length(t)   
    y(end+1,:)=y(end,:) + covid19(t,y,dt,DS,n,a0,lambda);
end




Postprocessing

Die Ergebnisse plotten wir für verschiedene Werte von λ:

... für λ1 = 0.016
... für λ1 = 0.012

Hier sieht man, wie unterschiedliche Ansteckungsraten zu unterschiedlich hohen Maximalwerten in den Infizierten i zu einem bestimmten Zeitpunkt führen. Und warum es sinnvoll ist, dieses λ niedrig zu halten.


% plot results
hold on
plot(t,y(:,1))
plot(t,y(:,2))
plot(t,n-y(:,1)-y(:,2))
hold off
legend('i(t)','r(t)','a(t)')
xlabel('t / tBez →') 
ylabel('Individuen / Mio →')