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?