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.
![](/images/thumb/1/13/T3BP-01.png/150px-T3BP-01.png)
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
- ...