Anfangswertprobleme/Methoden zur Lösung von Anfangswertproblemen: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
KKeine Bearbeitungszusammenfassung |
||
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
Fast immer sind im Maschinenbau Anfangswertprobleme über Differentialgleichungen im Zeitbereich definiert - die unabhängige Koordinate ist deshalb hier immer ''t''. Für die gesuchte Funktion | Fast immer sind im Maschinenbau Anfangswertprobleme über Differentialgleichungen im Zeitbereich definiert - die unabhängige Koordinate ist deshalb hier immer ''t''. Für die gesuchte Funktion | ||
<math>\displaystyle q(t) \text{ und der Abkürzung } \frac{d}{dt}(.):=\dot{(.)}</math> | ::<math>\displaystyle q(t) \text{ und der Abkürzung } \frac{d}{dt}(.):=\dot{(.)}</math> | ||
suchen wir die Lösung zum Anfangswertproblem<math>\dot{q} = f(q,t) \text{ mit dem Anfangswert } q(0) = q_0</math> | suchen wir die Lösung zum Anfangswertproblem<math>\dot{q} = f(q,t) \text{ mit dem Anfangswert } q(0) = q_0</math> | ||
Zeile 10: | Zeile 10: | ||
Numerische Löser für Anfangswertprobleme gibt es meist nur für Differentialgleichungen erster Ordnung (erste Ableitung nach der Zeit). Da Bewegungsgleichungen mechanischer Systeme fast immer Differentialgleichungen zweiter Ordnung sind (die Beschleunigung und damit die d'Alembert'sche Trägheitskrafte sind zweite Ableitungen des Weges nach der Zeit), brauchen wir einen Trick: Wir führen die Geschwindigkeit explizit als Koordinate ein, z.B. für die Bewegungsgleichung | Numerische Löser für Anfangswertprobleme gibt es meist nur für Differentialgleichungen erster Ordnung (erste Ableitung nach der Zeit). Da Bewegungsgleichungen mechanischer Systeme fast immer Differentialgleichungen zweiter Ordnung sind (die Beschleunigung und damit die d'Alembert'sche Trägheitskrafte sind zweite Ableitungen des Weges nach der Zeit), brauchen wir einen Trick: Wir führen die Geschwindigkeit explizit als Koordinate ein, z.B. für die Bewegungsgleichung | ||
<math>\ddot{u}(t) = f(u,\dot{u},t)</math> | ::<math>\ddot{u}(t) = f(u,\dot{u},t)</math> | ||
Nun sind | Nun sind | ||
<math>u, \dot{u}</math> | ::<math>u, \dot{u}</math> | ||
die Zustandsgrößen des Systems. | die Zustandsgrößen des Systems. | ||
Zeile 20: | Zeile 20: | ||
Mit | Mit | ||
<math>v(t) = \dot{u}(t)</math> | ::<math>v(t) = \dot{u}(t)</math> | ||
schreiben wir die Differentialgleichung zweiter Ordnung als zwei Differentialgleichungen erster Ordnung: | schreiben wir die Differentialgleichung zweiter Ordnung als zwei Differentialgleichungen erster Ordnung: | ||
<math>\underbrace{\left(\begin{array}{c}\dot{v}\\\dot{u}\end{array}\right)}_{\displaystyle \underline{\dot{q}}} = \underbrace{\left(\begin{array}{c}f(u, v, t)\\v\end{array}\right)}_{\displaystyle \underline{f}(\underline{q},t)}</math> | ::<math>\underbrace{\left(\begin{array}{c}\dot{v}\\\dot{u}\end{array}\right)}_{\displaystyle \underline{\dot{q}}} = \underbrace{\left(\begin{array}{c}f(u, v, t)\\v\end{array}\right)}_{\displaystyle \underline{f}(\underline{q},t)}</math> | ||
== Beispiel 1: Wachstum einer Population == | == Beispiel 1: Wachstum einer Population == | ||
Zeile 31: | Zeile 31: | ||
In einem Zeitintervall stirbt ein Anteil ''λ<sub>S</sub>'' von Fliegen, ein Anteil ''λ<sub>G</sub>'' von Fliegen wird geboren, das Anfangswertproblem lautet: | In einem Zeitintervall stirbt ein Anteil ''λ<sub>S</sub>'' von Fliegen, ein Anteil ''λ<sub>G</sub>'' von Fliegen wird geboren, das Anfangswertproblem lautet: | ||
<math>\dot{n} = \underbrace{(\lambda_G-\lambda_S )}_{\displaystyle =: \lambda_0} \cdot n\; \text{ mit dem Anfangswert } n(0) = n_0</math> | ::<math>\dot{n} = \underbrace{(\lambda_G-\lambda_S )}_{\displaystyle =: \lambda_0} \cdot n\; \text{ mit dem Anfangswert } n(0) = n_0</math> | ||
Die analytische Lösung dazu ist | Die analytische Lösung dazu ist | ||
<math>\displaystyle n(t) = n_0 \cdot e^{\lambda_0\cdot t}</math> | ::<math>\displaystyle n(t) = n_0 \cdot e^{\lambda_0\cdot t}</math> | ||
== Beispiel 2: Wachstum einer Population mit Selbstvergiftung == | == Beispiel 2: Wachstum einer Population mit Selbstvergiftung == | ||
Für sehr viele Fliegen ''n'' führen dies zu "Wachstum mit Selbstvergiftung". Die Stoffwechselrückstände ''r'' der Population in einem abgeschlossenen System (z.B. Erde) führen zum Aufbau von Hemmstoffen, die negativ auf die Geburtenrate ''λ<sub>G</sub>'' wirken, hier mit dem Faktor ''(1-r)''. | Für sehr viele Fliegen ''n'' führen dies zu "Wachstum mit Selbstvergiftung". Die Stoffwechselrückstände ''r'' der Population in einem abgeschlossenen System (z.B. Erde) führen zum Aufbau von Hemmstoffen, die negativ auf die Geburtenrate ''λ<sub>G</sub>'' wirken, hier mit dem Faktor ''(1-r)''. | ||
Zeile 45: | Zeile 44: | ||
* proportional mit ''μ'' zur Anzahl der Fliegen ''n'' steigen und | * proportional mit ''μ'' zur Anzahl der Fliegen ''n'' steigen und | ||
* proportional zu ''r'' abgebaut werden (zerfallen):<math>\begin{array}{ll}\dot{n} &= \left(\lambda_G\cdot(1-r)-\lambda_S\right) \cdot n\\ \dot{r} &= \mu \cdot n -\varrho\cdot r\end{array}\; \text{ mit den Anfangswerten } n(0) = n_0, r(0) = 0</math> | * proportional zu ''r'' abgebaut werden (zerfallen): | ||
::<math>\begin{array}{ll}\dot{n} &= \left(\lambda_G\cdot(1-r)-\lambda_S\right) \cdot n\\ \dot{r} &= \mu \cdot n -\varrho\cdot r\end{array}\; \text{ mit den Anfangswerten } n(0) = n_0, r(0) = 0</math> | |||
{{Template:MyCodeBlock | {{Template:MyCodeBlock | ||
|title= | |title=Implementierung in Maxima | ||
|text= | |text= | ||
Auch wenn es einfach aussieht: das IVP hat keine analytische Lösung mehr. Wir müssen es als Anfangswertproblem numerisch lösen. Und das geht so: | Auch wenn es einfach aussieht: das IVP hat keine analytische Lösung mehr. Wir müssen es als Anfangswertproblem numerisch lösen. Und das geht so: | ||
Zum Zeitpunkt | Zum Zeitpunkt ''t<sub>0</sub> =0'' wissen wir | ||
::<math>\displaystyle \left(\begin{array}{c}n(0)\\r(0)\end{array}\right) = \left(\begin{array}{c}n_0\\0\end{array}\right)</math> | ::<math>\displaystyle \left(\begin{array}{c}n(0)\\r(0)\end{array}\right) = \left(\begin{array}{c}n_0\\0\end{array}\right)</math> | ||
Zeile 60: | Zeile 61: | ||
::<math>\displaystyle \left.\left(\begin{array}{c}\dot{n}\\\dot{r}\end{array}\right)\right|_{t=0}= \left(\begin{array}{c}\lambda_G\cdot n_0\\\mu\cdot n_0\end{array}\right)</math> | ::<math>\displaystyle \left.\left(\begin{array}{c}\dot{n}\\\dot{r}\end{array}\right)\right|_{t=0}= \left(\begin{array}{c}\lambda_G\cdot n_0\\\mu\cdot n_0\end{array}\right)</math> | ||
Die Änderungsgeschwindigkeit der Zustandsgrößen des Modells (n,r) ist also für t= | Die Änderungsgeschwindigkeit der Zustandsgrößen des Modells ''(n,r)'' ist also für ''t=t<sub>0</sub>'' bekannt. Nun ersetzten wir - wie beim Verfahren der Finiten Differenzen - den Differentialquotienten durch den Differenzenquotienten: | ||
::<math>n(\underbrace{t_0+\Delta t}_{\displaystyle :=t_1}) = n(t_0) + \dot{n}|_{t=t_0}\cdot \Delta t</math> | ::<math>n(\underbrace{t_0+\Delta t}_{\displaystyle :=t_1}) = n(t_0) + \dot{n}|_{t=t_0}\cdot \Delta t</math> | ||
Und analog für r. | Und analog für <sub>r</sub>. | ||
[[Datei:MethodenAnfangswertprobleme-Euler.png|150px|ohne|mini|Integrationsschritt beim Lösen eines AWPs.]] | |||
So berechnen wir aus dem Anfangspunkt den Zustand des Systems zu einem Folgepunkt, den Zeitpunkt ''t<sub>1</sub>''. Und für ''t<sub>1</sub>'' den Folgepunkt ''t<sub>2</sub>'. Wenn wir diese Schritte oft genug machen, erhalten wir den approximierten Verlauf der Zustandsgrößen über der Zeit. Im Maxima-Modell machen wir das mit der dimensionslosen Zeit: | |||
::<math>\displaystyle \tau=\lambda_G\cdot t</math> | |||
Für die gewählte Dauer von 50 Fliegen-Generationen erhalten wir: | |||
[[Datei:MethodenAnfangswertproblem-LösungFliegen.png|mini|Anzahl der Fliegen und Hemmstoffe über der Zeit.]] | [[Datei:MethodenAnfangswertproblem-LösungFliegen.png|mini|Anzahl der Fliegen und Hemmstoffe über der Zeit.]] | ||
Zeile 73: | Zeile 79: | ||
|code= | |code= | ||
<syntaxhighlight lang="notmuch" line='line' style="border:1px solid blue"> | <syntaxhighlight lang="notmuch" line='line' style="border:1px solid blue"> | ||
/* wxMaxima 21.05.2 */ | |||
/* equations of motion */ | /* equations of motion */ | ||
eom: ['diff(n, | eom: ['diff(n,τ)=((1-r)-λ[S])*n, | ||
'diff(r, | 'diff(r,τ)= μ*n- ρ*r]; | ||
/* parameter */ | /* parameter */ | ||
par: [ | par: [λ[S]=0.5, ρ=1/10, μ=1/100]; | ||
/* solve IVP */ | /* solve IVP */ | ||
results: rk(subst(par,makelist(rhs(eom[i]),i,1,2)),[n,r],[1,0],[ | results: rk(subst(par,makelist(rhs(eom[i]),i,1,2)),[n,r],[1,0],[τ,0,50,0.1])$ | ||
results: [ | results: [τ = makelist(results[i][1],i,1,length(results)), | ||
n = makelist(results[i][2],i,1,length(results)), | |||
r = makelist(results[i][3],i,1,length(results))]$ | |||
/* plot results */ | /* plot results */ | ||
plot2d([[discrete,subst(results, | plot2d([[discrete,subst(results,τ),subst(results,n)], | ||
[discrete,subst(results, | [discrete,subst(results,τ),subst(results,r)]], | ||
[legend, "# Pop.", "Rückst."], | [legend, "# Pop.", "Rückst."], | ||
[xlabel, "τ→"],[ylabel, "n,r→"], | [xlabel, "τ→"],[ylabel, "n,r→"], | ||
Zeile 94: | Zeile 100: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
}} | }} | ||
{{Template:MyCodeBlock | |||
|title=Implementierung in Matlab | |||
|text= | |||
Ganz analog erfolgt die Implementierung in Matlab. | |||
Nur dass wir hier zwei Dateien brauchen: | |||
# die Skriptdatei und | |||
# die Funktion, die <code>dydt</code> zurückliefert. | |||
[[Datei:MethodenAnfangswertproblem-LösungFliegen_mit_Matlab.png|mini|Anzahl der Fliegen und Hemmstoffe über der Zeit.]] | |||
|code= | |||
<syntaxhighlight lang="matlab" line='line' style="border:1px solid blue"> | |||
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
% Modul Numerische Methoden der Mechanik % | |||
% IVP - Introduction % | |||
% Autor: Andreas Baumgart % | |||
% Last Update: 2022-05-17 % | |||
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
cd('C:\Users\abs384\OneDrive - haw-hamburg.de\2022-SS\Numerische Methoden der Mechanik\Unterricht\Matlab\KW21') % hier den richtigen Pfad eingeben! | |||
addpath("./Functions"); | |||
%% parameter | |||
lambda=0.5; rho=1/10; mu=1/100; | |||
tspan = [0 50]; | |||
y0 = [1 0]; | |||
%% solve ODE | |||
[t,y] = ode45(@(t,y) flies(t,y,lambda,rho,mu), tspan, y0); | |||
%% plot | |||
plot(t,y(:,1),t,y(:,2)); | |||
xlabel('Time τ'); | |||
ylabel('solutions n,r'); | |||
legend('n','r'); | |||
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
% Function dydt(y,t) % | |||
% % | |||
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
function dydt = flies(t,y,lambda,rho,mu) | |||
%RETURN rhs of ode | |||
% self-poisoning of population of flies | |||
n=y(1);r=y(2); | |||
dydt = [((1-r)-lambda)*n; ... | |||
mu*n- rho*r]; | |||
end | |||
</syntaxhighlight> | |||
}} | |||
Klimamodelle machen genau das - nur mit deutlich komplizierteren Modellen. | Klimamodelle machen genau das - nur mit deutlich komplizierteren Modellen. | ||
'''Links''' | '''Links''' | ||
* [[Sources/Lexikon/Phasendiagramme|Phasendiagramme]]: eine Methode zum Ausdeuten der Lösung von | * [[Sources/Lexikon/Phasendiagramme|Phasendiagramme]]: eine Methode zum Ausdeuten der Lösung von numerisch gelösten AWP. | ||
Aktuelle Version vom 27. November 2023, 19:36 Uhr
Problemstellung
Fast immer sind im Maschinenbau Anfangswertprobleme über Differentialgleichungen im Zeitbereich definiert - die unabhängige Koordinate ist deshalb hier immer t. Für die gesuchte Funktion
suchen wir die Lösung zum Anfangswertproblem
im Zeitintervall 0 < t < T.
Numerische Löser für Anfangswertprobleme gibt es meist nur für Differentialgleichungen erster Ordnung (erste Ableitung nach der Zeit). Da Bewegungsgleichungen mechanischer Systeme fast immer Differentialgleichungen zweiter Ordnung sind (die Beschleunigung und damit die d'Alembert'sche Trägheitskrafte sind zweite Ableitungen des Weges nach der Zeit), brauchen wir einen Trick: Wir führen die Geschwindigkeit explizit als Koordinate ein, z.B. für die Bewegungsgleichung
Nun sind
die Zustandsgrößen des Systems.
Mit
schreiben wir die Differentialgleichung zweiter Ordnung als zwei Differentialgleichungen erster Ordnung:
Beispiel 1: Wachstum einer Population
Eine Fliegenpopulation besteht zum Zeitpunkt t=0 aus der Anzahl von n0 Fliegen.
In einem Zeitintervall stirbt ein Anteil λS von Fliegen, ein Anteil λG von Fliegen wird geboren, das Anfangswertproblem lautet:
Die analytische Lösung dazu ist
Beispiel 2: Wachstum einer Population mit Selbstvergiftung
Für sehr viele Fliegen n führen dies zu "Wachstum mit Selbstvergiftung". Die Stoffwechselrückstände r der Population in einem abgeschlossenen System (z.B. Erde) führen zum Aufbau von Hemmstoffen, die negativ auf die Geburtenrate λG wirken, hier mit dem Faktor (1-r).
Dieses Modell (die Bewegungsgleichung) für r setzt für die Änderungsgeschwindigkeit einen Prozess an, bei dem die Hemmstoffe
- proportional mit μ zur Anzahl der Fliegen n steigen und
- proportional zu r abgebaut werden (zerfallen):
Implementierung in Maxima
Auch wenn es einfach aussieht: das IVP hat keine analytische Lösung mehr. Wir müssen es als Anfangswertproblem numerisch lösen. Und das geht so:
Zum Zeitpunkt t0 =0 wissen wir
Einsetzen in die Bewegungsgleichung liefert:
Die Änderungsgeschwindigkeit der Zustandsgrößen des Modells (n,r) ist also für t=t0 bekannt. Nun ersetzten wir - wie beim Verfahren der Finiten Differenzen - den Differentialquotienten durch den Differenzenquotienten:
Und analog für r.
So berechnen wir aus dem Anfangspunkt den Zustand des Systems zu einem Folgepunkt, den Zeitpunkt t1. Und für t1 den Folgepunkt t2'. Wenn wir diese Schritte oft genug machen, erhalten wir den approximierten Verlauf der Zustandsgrößen über der Zeit. Im Maxima-Modell machen wir das mit der dimensionslosen Zeit:
Für die gewählte Dauer von 50 Fliegen-Generationen erhalten wir:
/* wxMaxima 21.05.2 */
/* equations of motion */
eom: ['diff(n,τ)=((1-r)-λ[S])*n,
'diff(r,τ)= μ*n- ρ*r];
/* parameter */
par: [λ[S]=0.5, ρ=1/10, μ=1/100];
/* solve IVP */
results: rk(subst(par,makelist(rhs(eom[i]),i,1,2)),[n,r],[1,0],[τ,0,50,0.1])$
results: [τ = makelist(results[i][1],i,1,length(results)),
n = makelist(results[i][2],i,1,length(results)),
r = makelist(results[i][3],i,1,length(results))]$
/* plot results */
plot2d([[discrete,subst(results,τ),subst(results,n)],
[discrete,subst(results,τ),subst(results,r)]],
[legend, "# Pop.", "Rückst."],
[xlabel, "τ→"],[ylabel, "n,r→"],
[style, [lines,3]])$
Implementierung in Matlab
Ganz analog erfolgt die Implementierung in Matlab. Nur dass wir hier zwei Dateien brauchen:
- die Skriptdatei und
- die Funktion, die
dydt
zurückliefert.
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% Modul Numerische Methoden der Mechanik %
% IVP - Introduction %
% Autor: Andreas Baumgart %
% Last Update: 2022-05-17 %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cd('C:\Users\abs384\OneDrive - haw-hamburg.de\2022-SS\Numerische Methoden der Mechanik\Unterricht\Matlab\KW21') % hier den richtigen Pfad eingeben!
addpath("./Functions");
%% parameter
lambda=0.5; rho=1/10; mu=1/100;
tspan = [0 50];
y0 = [1 0];
%% solve ODE
[t,y] = ode45(@(t,y) flies(t,y,lambda,rho,mu), tspan, y0);
%% plot
plot(t,y(:,1),t,y(:,2));
xlabel('Time τ');
ylabel('solutions n,r');
legend('n','r');
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% Function dydt(y,t) %
% %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function dydt = flies(t,y,lambda,rho,mu)
%RETURN rhs of ode
% self-poisoning of population of flies
n=y(1);r=y(2);
dydt = [((1-r)-lambda)*n; ...
mu*n- rho*r];
end
Klimamodelle machen genau das - nur mit deutlich komplizierteren Modellen.
Links
- Phasendiagramme: eine Methode zum Ausdeuten der Lösung von numerisch gelösten AWP.
Untergeordnete Seiten