Übung 3 - Astrophysik Uni

Werbung
Introduction to Computational Astrophysics, SoSe 2017
H. Todt, P. Richter
Übungsblatt 3
C/C++ Das Zwei-Körper-Problem
(Ausgabe 11.05.2016)
Wiederholung
1. Wenn man eine Funktion in C++ verwenden möchte, dann . . .
2. Globale Variablen . . .
2 muss sie vor der aktuellen Funktion
deklariert sein
2 besitzen dateiweite Sichtbarkeit
2 müssen außerhalb von Funktionen
deklariert werden
2 kann sie vor der aktuellen Funktion
definiert sein
2 bleiben solange gültig, wie das Programm läuft
2 kann sie in einer Headerdatei
(#include...) deklariert werden
2 werden durch lokale Variablen gleichen Namens maskiert
1. Aufgabe Euler-Verfahren zur Funktionsberechnung ?
Das Programm euler berechnet die Lösung der Differentialgleichung
dx
=2·t
dt
(1)
Kopieren Sie den Quelltext in Ihr eigenes Programm-Verzeichnis, kompilieren sie ihn
und führen sie das Programm aus.
a) Ergänzen Sie das Programm so, dass auch jeweils die exakte Lösung zum Vergleich
ausgegeben wird.
b) Ändern Sie die Schrittweite ∆t. Wie wirkt sich das auf die Genauigkeit der Lösung
für x aus?
2. Aufgabe Das Kepler-Problem ? ? ? ?
Im folgenden versuchen wir, die Bewegung eines Planeten um die Sonne zu modellieren.
Dafür soll das gekoppelte Gleichungssystem
~r
d~v
d d~r
~a = −GM 3 =
=
(2)
r
dt
dt dt
mithilfe des Euler-Cromer-Verfahrens gelöst werden. Die Bewegung des Planeten soll
mittels Xgraphics visualisiert werden.
a) Verwenden Sie kartesische Koordinaten x, y und astronomische Einheiten. Die Gleichungen (2) lassen sich dann “getrennt” für beide Koordinaten aufstellen (Array!).
Durch welchen Term koppeln die Gleichungen für die x- und y-Koordinaten?
b) Gliedern Sie das Programm mithilfe von Funktionen:
i. main(): Aufruf der Funktion initial. Aufruf der Funktionen euler und
output in einer (Endlos-) Schleife
H. Todt, P. Richter
Introduction to Computational Astrophysics, SoSe 2017
ii. void initial (...): Setzen der Variablen und Konstanten, insbesondere
Anfangsbedingungen.
Hierbei sollen immer y(t = 0) = 0 und vx (t = 0) = 0 sein. Nutzereingabe
folgender Parameter: Zeitschrittweite ∆t, Anzahl der Zeitschritte zwischen
zwei Zeichenaktionen (output), Anfangswert x(t = 0), Anfangswert vy (t = 0).
Überprüfung der Nutzereingaben
iii. void euler (...): Implementierung des Euler-Cromer-Algorithmus. Inkrementierung von t.
iv. void output (...): Grafische Ausgabe mittels Xgraphics. Einzeichnen der
Sonne, außerdem für jeden Aufruf die Position des umlaufenden Planeten
(blau).
Jede Funktion sollte in einer eigenen Datei stehen, beachten Sie dabei die Sichtbarkeit von Variablen und Funktionen. Schreiben sie ein passendes makefile zum
Kompilieren und Linken.
c) Verifizieren Sie das Programm, indem Sie den Spezialfall einer Kreisbahn mit
x(t = 0) = 1 betrachten.
Wie muss vy (t = 0) gewählt werden, damit sich eine Kreisbahn ergibt?
Wie klein muss ∆t mindestens sein, damit sich eine stabile Kreisbahn ergibt?
d) Verändern Sie das Programm so, dass der i) Euler-Richardson-Algorithmus bzw. ii)
Euler-Algorithmus benutzt wird. Wie muss die Zeitschrittweite ∆t gewählt werden,
um mit denselben Anfangsbedingungen wie beim Euler-Cromer-Verfahren einen
stabilen Orbit zu erhalten?
e) Schreiben Sie eine Funktion float energy(...), die die Gesamtenergie
1
GM m
E = mv 2 −
2
r
(3)
oder E/m berechnet. Wie muss für dieselben Anfangsbedingungen wie unter 2c)
die Zeitschrittweite gewählt werden, damit E erhalten bleibt? Welcher Algorithmus
erhält die Energie besser?
Herunterladen