Gelöste Aufgaben/T3BP: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 20: | Zeile 20: | ||
|text=Wir implementieren die Lösung in Matlab. Dafür verwenden wir das script <code>T3BP.m</code>, das die Funktionen | |text=Wir implementieren die Lösung in Matlab. Dafür verwenden wir das script <code>T3BP.m</code>, das die Funktionen | ||
* <code>preprocess.m</code>, | * <code>preprocess.m</code>, | ||
* <code> | * <code>ode45.m</code> (solve) und | ||
* <code>postprocess.m</code> | * <code>postprocess.m</code> | ||
aufruft. Die Klasse | aufruft. Die Klasse | ||
* <code>planets.m</code> | * <code>planets.m</code> | ||
verwenden wir nur, um die Systemparameter "<code>sys</code>" bequem ansprechen zu können. | verwenden wir nur, um die Systemparameter "<code>sys</code>" bequem ansprechen zu können. | ||
Zur Lösung des Anfangswertproblems rufen wir eine der ODE-Funktionen aus Matlab auf, die wir mit den Gleichgewichtsbedingungen unserer Funktion <code>t3bpdydt.m</code> füttern. | |||
|code= | |code= | ||
<syntaxhighlight lang="notmuch" line start=1> | <syntaxhighlight lang="notmuch" line start=1> | ||
Zeile 30: | Zeile 31: | ||
|- preprocess | |- preprocess | ||
|- class sys=planets(data) | |- class sys=planets(data) | ||
|- | |- ode45 | ||
|- t3bpdydt | |||
|- postprocess | |- postprocess | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Zeile 63: | Zeile 65: | ||
F = \frac{\displaystyle m_1\cdot L}{\displaystyle T^2} \text{ zu } T = \sqrt{\frac{\displaystyle m_1\cdot L}{\displaystyle F}} | F = \frac{\displaystyle m_1\cdot L}{\displaystyle T^2} \text{ zu } T = \sqrt{\frac{\displaystyle m_1\cdot L}{\displaystyle F}} | ||
</math> | </math> | ||
erhalten. | erhalten. Damit ist <math>T \approx 175 Jahre</math>. | ||
Damit können wir schreiben: | Damit können wir schreiben: | ||
Zeile 76: | Zeile 78: | ||
Einsetzen und Kürzen liefert uns dann die dimensionslosen Bewegungsgleichungen | Einsetzen und Kürzen liefert uns dann die dimensionslosen Bewegungsgleichungen | ||
::<math> \ddot{\underline{U}}_i = \sum_{\ell=j,k} \frac{\displaystyle \theta_\ell}{\displaystyle \varrho_{i,\ell}^2} \dot \underline{e}_{i,\ell} </math>. | ::<math> \ddot{\underline{U}}_i = \sum_{\ell=j,k} \frac{\displaystyle \theta_\ell}{\displaystyle \varrho_{i,\ell}^2} \dot \underline{e}_{i,\ell} </math>. | ||
Diese Gleichgewichtsbeziehungen implementieren wir in der Funktion <code>t3bpdydt.m</code>, die von dem Löser ODE45 aufgerufen wird. | |||
|code= | |code= | ||
<syntaxhighlight lang="matlab" line start=1> | <syntaxhighlight lang="matlab" line start=1> | ||
Zeile 108: | Zeile 111: | ||
<!-------------------------------------------------------------------------------->{{MyCodeBlock|title=Solving | <!-------------------------------------------------------------------------------->{{MyCodeBlock|title=Solving | ||
|text= | |text=Die Lösung des Anfangswertproblems übertragen wir der Matlab-Routine ODE45. | ||
Dabei organisieren wir die Zustandsgrößen so, dass in <pre>y0</pre> zunächst die 9 Anfangsverschiebungen und dann die 9 Anfangsgeschwindigkeiten stehen. | |||
Wir lösen dann | |||
::<math>\dot{\underline{q}}(\tau) = \underline{f}(\underline{q}(\tau))</math> | |||
mit | |||
::<math>\underline{q}(0) = \left(\begin{array}{c} | |||
U_{1,x}(0)\\ | |||
U_{1,y}(0)\\ | |||
U_{1,z}(0)\\ | |||
U_{2,x}(0)\\ | |||
\vdots\\ | |||
V_{3,y}(0)\\ | |||
V_{3,z}(0) | |||
\end{array}\right).</math> | |||
z.B. mit | |||
::<math>V_{3,y}(\tau) = \frac{\displaystyle d}{\displaystyle d\tau} U_{3,y}(\tau). | |||
|code= | |code= | ||
<syntaxhighlight lang="matlab" line start=1> | <syntaxhighlight lang="matlab" line start=1> | ||
1 | %% solve IVP | ||
% set-up numerical paramters | |||
tspan = 0:sys.tEnd/1000:sys.tEnd; | |||
u0 = [transpose(sys.u0(1,:));transpose(sys.u0(2,:));transpose(sys.u0(3,:))]/sys.L; | |||
v0 = [transpose(sys.v0(1,:));transpose(sys.v0(2,:));transpose(sys.v0(3,:))]*sys.T/sys.L; | |||
% initial values from sys structured for ODE45 | |||
y0 = [u0;v0]; | |||
h = waitbar(0,'solving ODE - please wait...'); | |||
% | |||
[t,y] = ode45(@(t,y)t3bpdydt(t,y,sys),tspan,y0); | |||
close(h); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
}} | }} | ||
Zeile 123: | Zeile 152: | ||
<!-------------------------------------------------------------------------------->{{MyCodeBlock|title=Post-Processing | <!-------------------------------------------------------------------------------->{{MyCodeBlock|title=Post-Processing | ||
|text= | |text=[[Datei:T3BP-21.png|550px|right|mini|Trajektoren der Körper]] | ||
Uns interessieren natürlich die Trajektorien der Körper im Raum - dabei zeichnen wir die Körper-Durchmesser entsprechend Ihrer Masse. Die Darstellung ist nicht maßstäblich. | |||
[[Datei:T3BP-21.png|550px| | |||
Zur Kontrolle können wir prüfen, ob die ODE-Routine im Rahmen der numerischen Genauigkeit die Erhaltungssätze der Mechanik erfüllt. Das machen wir hier am Beispiel des Impulssystes: die Summe der Bewegungsgrößen jeweils in die drei Raumrichtungen muss gleich bleiben: | |||
[[Datei:T3BP-22.png|150px|left|mini|Bewegungsgrößen <math>\sum_{i=1}^3 \theta_i \cdot I_{i,x0}</math>]]. | |||
Und schließlich schauen wir uns die Bewegung der drei Körper in einer Animation über der Zeit an - hier über einen Zeitraum 4375 Jahren. | |||
[[Datei:T3BP-23.mp4|100%|left|mini|Animation der Bewegung]] | [[Datei:T3BP-23.mp4|100%|left|mini|Animation der Bewegung]] | ||
|code= | |code= | ||
<syntaxhighlight lang="lisp" line start=1> | <syntaxhighlight lang="lisp" line start=1> | ||
Zeile 136: | Zeile 164: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
}} | }} | ||
<hr/> | <hr/> | ||
'''Links''' | '''Links''' | ||
* .. | * [https://en.wikipedia.org/wiki/The_Three-Body_Problem_(novel) The Three-Body-Problem] | ||
'''Literature''' | '''Literature''' | ||
* ... | * ... |
Version vom 3. Oktober 2022, 08:53 Uhr
Aufgabenstellung
Sie untersuchen das „Three-Body-Problem“(vgl. Wikipedia) numerisch. Dabei sollen die Bahnen von drei Körper mit den Punktmassen m1, m2, m3 in Wechselwirkung miteinander berechnet werden.
Gesucht ist die Lösung des Anfangswertproblems für verschiedene Anfangswerte (Orte und Geschwindigkeiten) und Massen mi der Körper.
Lösung mit Matlab®
Die Lösung mit Matlab erfordert keine großen algebraischen Vorbereitungen - für die wir Maxima einsetzten würden. Als äußere Kräfte treten nur die Feldkräfte der Gravitation zwischen den Körpern auf - die wir einfach einschreiben und in Matlab implementieren können.
Declarations
Wir implementieren die Lösung in Matlab. Dafür verwenden wir das script T3BP.m
, das die Funktionen
preprocess.m
,ode45.m
(solve) undpostprocess.m
aufruft. Die Klasse
planets.m
verwenden wir nur, um die Systemparameter "sys
" bequem ansprechen zu können.
Zur Lösung des Anfangswertproblems rufen wir eine der ODE-Funktionen aus Matlab auf, die wir mit den Gleichgewichtsbedingungen unserer Funktion t3bpdydt.m
füttern.
T3BP
|- preprocess
|- class sys=planets(data)
|- ode45
|- t3bpdydt
|- postprocess
Equilibrium Conditions
Die Gravitationskräfte zwischen den Körpern i und j erfassen wir mit
mit der Gravitationskonstanten
Dabei gehen die Wirkungslinien der Kräfte durch die Massenmittelpunkte der Körper, die Körper ziehen sich gegenseitig an. Damit ist
- ,
wobei der Einheitsvektor der Anziehungskraft - in diesem Fall von i nach j - ist.
Die Bewegungsgleichungen schreiben wir in Vektorschreibweise für Körper i als
- .
Dabei ist z.B. i=1 und =2,3.
Die drei Bewegungsgleichungen in den drei räumlichen Koordinaten ui formulieren wir in dimensionslosen Koordinaten. Dafür brauchen wir drei unabhängige Referenzgrößen, hier wählen wir
Uns fehlt noch die Referent-Zeit T, die wir aus
erhalten. Damit ist .
Damit können wir schreiben:
Einsetzen und Kürzen liefert uns dann die dimensionslosen Bewegungsgleichungen
- .
Diese Gleichgewichtsbeziehungen implementieren wir in der Funktion t3bpdydt.m
, die von dem Löser ODE45 aufgerufen wird.
function dydt = t3bpdydt(t,y,sys)
% implementation of ode
% params hold system parameters
% get coordinates
for body = 1:3
u(body,1:3) = transpose(y(3*(body-1)+1:3*body,1));
end
r = zeros(3,3,3);
e = zeros(3,3,3);
% compose vectors, unit vectors and distances
r(1,2,:) = u(2,:)-u(1,:); % this from m[1] to m[2]
:
:
:
% mass 3
dydt(9+7:9+9,1)=sys.theta(1)/R(3,1)*e(3,1,:)+sys.theta(2)/R(3,2)*e(3,2,:);
%% velocities
dydt(1:9,1) = y(10:18,1);
%%
waitbar(t / sys.tEnd);
end
Solving
Die Lösung des Anfangswertproblems übertragen wir der Matlab-Routine ODE45.
Dabei organisieren wir die Zustandsgrößen so, dass in
y0
zunächst die 9 Anfangsverschiebungen und dann die 9 Anfangsgeschwindigkeiten stehen.
Wir lösen dann
mit
z.B. mit
- Fehler beim Parsen (Syntaxfehler): {\displaystyle V_{3,y}(\tau) = \frac{\displaystyle d}{\displaystyle d\tau} U_{3,y}(\tau). |code= <syntaxhighlight lang="matlab" line start=1> %% solve IVP % set-up numerical paramters tspan = 0:sys.tEnd/1000:sys.tEnd; u0 = [transpose(sys.u0(1,:));transpose(sys.u0(2,:));transpose(sys.u0(3,:))]/sys.L; v0 = [transpose(sys.v0(1,:));transpose(sys.v0(2,:));transpose(sys.v0(3,:))]*sys.T/sys.L; % initial values from sys structured for ODE45 y0 = [u0;v0]; h = waitbar(0,'solving ODE - please wait...'); % [t,y] = ode45(@(t,y)t3bpdydt(t,y,sys),tspan,y0); close(h); </syntaxhighlight> }} {{MyZipfileBlock |title=Matlab<sup>©</sup>-files |text =[[Datei:matlab-folder-structure.png|links|mini|Folder Structure]]Die Datei-Struktur zeit das Skript <nowiki>T3BP.m</nowiki>. Classes und Functions sind in den jeweiligen Ordnern. Die Excel-Datei hält alle System-Parameter. Den komplette Quellcode zu diesem Programm können Sie über dieses ZIP-File rechts herunterladen. |file =T3BP.zip}} <!-------------------------------------------------------------------------------->{{MyCodeBlock|title=Post-Processing |text=[[Datei:T3BP-21.png|550px|right|mini|Trajektoren der Körper]] Uns interessieren natürlich die Trajektorien der Körper im Raum - dabei zeichnen wir die Körper-Durchmesser entsprechend Ihrer Masse. Die Darstellung ist nicht maßstäblich. Zur Kontrolle können wir prüfen, ob die ODE-Routine im Rahmen der numerischen Genauigkeit die Erhaltungssätze der Mechanik erfüllt. Das machen wir hier am Beispiel des Impulssystes: die Summe der Bewegungsgrößen jeweils in die drei Raumrichtungen muss gleich bleiben: [[Datei:T3BP-22.png|150px|left|mini|Bewegungsgrößen <math>\sum_{i=1}^3 \theta_i \cdot I_{i,x0}} ]].
Und schließlich schauen wir uns die Bewegung der drei Körper in einer Animation über der Zeit an - hier über einen Zeitraum 4375 Jahren.
1+1
Links
Literature
- ...