Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1819:sternensystem

Dies ist eine alte Version des Dokuments!



Inhaltsverzeichnis

  1. Ziel
  2. Dokumentation
  3. Protokoll
  4. Analyse
  5. Fazit
  6. Ergebnis
  7. Credits




Mithilfe von Python möchten wir ein System von Himmelskörpern simulieren, das durch die gravitativen Kräfte und andere Einflüsse berechnet wird. Die Ergebnisse sollen graphisch dargestellt werden und interaktiv nutzbar sein.

Die ermittelten Daten sollen mit Berechnungen der NASA und ESA abgeglichen werden, um so die Korrektheit der Simulation abzuschätzen. Des Weiteren möchten wir verschiedene Simulationsalgorithmen verwenden, darunter die Euler-Methode, das Leapfrog-Verfahren und das Runge-Kutta-Verfahren 4.Ordnung, um diese zu Vergleichen und entsprechend ihrer Korrektheit zu bewerten.

Im späteren Verlauf des Projekts und je nach Fortschritt können Überlegungen zu weiterführenden Fragestellungen bzw. Visualisierungen angestellt werden. Hier sind z.B. die Berechnung von Gezeitenkräften, Kollisionsparameter oder Raumschiffen in Betracht zu ziehen.




Voraussetzungen:
Python 3.7
SkyField 1.10
Vpython 7.4
Numpy 1.15
Itertools

Programm
Programmcode



Verfahren


Unsere Simulation ist in der Lage das n-Körperproblem mit drei verschiedenen Verfahren seperat zu lösen und so für jeden Zeitschritt die neuen Positionen zu berechnen. Die Berechnungsverfahren unterscheiden sich zum Teil deutlich in den errechneten Werten, der Genauigkeit und der Stabilität. Unsere ersten Berechnungen haben wir mit dem Euler-Verfahren erstellt. Im Folgenden haben wir das Leap-Frog Verfahren implementiert und als letzte Berechnung das Runge-Kutta Verfahren 4. Ordnung, mit einer sehr hohen Genauigkeit, geschrieben.

Euler-Verfahren


Das explizite Euler-Verfahren ist das einfachste Verfahren zur Lösung numerischer n-Körperprobleme mittels Differentialgleichungen erster Ordnung. Um die neuen Positionen der Objekte im Raum zu ermitteln, werden zu erst die Gravitationskräfte die auf ein Objekt von allen anderen Objekten aus wirken, für jedes Objekt im Raum berechnet. Durch die berechnete Gravitationskraft ist es nun möglich die Beschleunigung für jedes Objekt mithilfe des 2. newton'schen Gesetzes (F=m*a), zu berechnen

Die Gleichung für die Berechnung der Beschleunigung von multiplen Körpern:

$$ a_{ix} = \sum_{i \neq j}^{i} \frac{Gm_j}{((x_i - x_j)^2 + (y_i - y_j)^2 + (z_i - z_j)^2)^\frac{3}{2}}(x_j - x_i)\hat{x} $$

Da die Geschwindigkeit, Masse und Position der Objekte zum Simulationsbeginn bekannt sind, kann man nun mit Hilfe der berechneten Beschleunigung die neuen Positionen der Körper für einen festgelegten Zeitschritt berechnen. Da sich die Beschleunigung kontinuierlich verändert, ist die Simulation umso genauer, desto kleiner die Zeitschritte festgelegt werden.
Da es sich um ein lineares Verfahren der 1. Ordnung handelt, ist der lokale Fehler(Fehler zu in einem Schritt) der Berechnung quadratisch zur Intervallgröße. In der Darstellung wird dies deutlich.



Leapfrog-Verfahren

Das Leapfrog-Verfahren ist ebenfalls eine Methode zur numerischen Integration von Differentialgleichungen. Die Leapfrog-Integration ist eine Methode der 2. Ordnung, benötigt jedoch genauso viele Berechnungen pro Schritt wie das Euler-Verfahren. Dadurch ist das Leapfrog-Verfahren deutlich Genauer als das Euler-Verfahren und benötigt dabei keine zusätzlichen Berechnungsschritte. Beim Leapfrog-Verfahren ist die Berechnung der neuen Geschwindigkeit versetzt zur Berechnung der neuen Position.

  1. Berechnung der Kräfte
  2. Neue Geschwindigkeit basierend auf den Kräften und einem halben Zeitintervall berechnen
  3. Neue Position berechnen
  4. Neue Geschwindigkeit basierend auf einem halben Zeitschritt berechnen





Es eignet sich daher sehr gut für gravitative Simulationen, da dort nur die Position der Objekte die Berechnung beeinflussen. Besonders die Eigenschaft der Reversibilität und der Symplektizität der Berechnung, also das die Energie in einem dynamischen System stabil bleibt, machen es zu einer hervorragenden Methode zur Berechnung von Gravitationssystemen.



Runge-Kutta-Verfahren 4. Ordnung


Das Runge-Kutta-Verfahren (RK-Verfahren) basiert im Grunde genommen auf dem Euler-Verfahren, welches jedoch die Problematik aufweist, dass von einer konstanten Beschleunigung innerhalb eines Zeitschrittes ausgeht, was jedoch nicht der Realität entspricht. Dies trifft im Grunde auch das Leapfrog-Verfahren, jedoch nur für einen halben Zeitschritt. Das RK-Verfahren weist dieses Problem zwar immer noch auf, ist jedoch deutlich präziser als das Euler-Verfahren oder das Leapfrog-Verfahren, da es mit mehreren Beschleunigungswerten rechnet und von diesen den Durchschnitt bildet.

k1 = Beschleunigung basierend auf Startwerten
k2 = Beschleunigung 0.5 Zeitschritte (t = 0.5) vorwärts
k3 = Beschleunigung am Zeitschritt t = 0.5, mit der Beschleunigung von k2
k4 = Beschleunigung an t = 1 mit der Beschleunigung von k3

 k1_v = self.calc_acceleration(n, positions, masses)
        k1_r = velocities
        k2_v = self.calc_acceleration(n, positions + k1_r * self.dt / 2, masses)
        k2_r = velocities + k1_v * self.dt / 2
        k3_v = self.calc_acceleration(n, positions + k2_r * self.dt / 2, masses)
        k3_r = velocities + k2_v * self.dt / 2
        k4_v = self.calc_acceleration(n, positions + k3_r * self.dt, masses)
        k4_r = velocities + k3_v * self.dt
 
        velocities = velocities + self.dt / 6 * (k1_v + 2*k2_v + 2*k3_v + k4_v)        
        positions = positions + self.dt / 6 * (k1_r + 2*k2_r + 2*k3_r + k4_r)

Die Beschleunigungswerte werden gewichtet und ein Durchschnitt wird gebildet:

$$ Beschleunigung = \frac{ k_1 + 2 * k_2 + 2 * k_3 + k_4 }{6} $$

Durch dieses Verfahren wird eine viermal höhere Genauigkeit erreicht und dabei weniger Rechenleistung benötigt als z.B. mit dem Eulerverfahren.




In unserem Protokoll haben wir unsere Fortschritte an diesem Tag festgehalten, Probleme dokumentiert und Ziele bis zum nächsten Labor definiert. Zudem auch Aufnahmen vom WIP-Code und interessante Ergebnisse bzw. Probleme festgehalten.




In den folgenden Graphen wird die absolute Abweichung der Planeten, die von uns berechnet werden, zu den Berechnungen der NASA deutlich, die Mittels Skyfield in unserer Programm importiert werden. Die Berechnungen wurden in relativ Großen Zeitschritten von einem Tag, also 86400 Sekunden, berechnet, was die Abweichung nochmal deutlich darstellt. Die Berechnung lief für 50 echte Sekunden, für jedes Berechnungsverfahren. Auf den ersten Blick wird sofort deutlich, dass das Eulerverfahren kein stabiles Berechnungsverfahren darstellt, die Abweichung der Planeten, vor allem des Merkurs, ist infinit und exponential. Bei Leapfrog und RK4 ist zu erkennen, das die Abweichungen deutlich stabiler bleiben und sich auch wieder dem Referenzgraphen annähern. Runge-Kutta ist dabei das stabilste und genauste Verfahren zur n-Körper Berechnung, das wir in unserem Programm verwendet haben.








Zum Beginn des Labors, nach Findung unserer Projektidee war unser Ziel eine n-Körpersimulation zu programmieren und diese graphisch darstellen zu lassen. Wir wollten des Weiteren das Programm so modular wie möglich gestalten, um so verschiedene Methoden und Visualisierungsmöglichkeiten zu erlauben und auch später noch zu erweitern. Diese Idee hat sich später bezahlt gemacht, da es uns nun möglich ist, die Simulation mit verschiedenen Berechnungen laufen zu lassen und zu vergleichen.

Es wurde auch schnell klar das wir zu erst das Sonnensystem als Anhaltspunkt für unsere Simulation nehmen, um so die Korrektheit der berechneten Werte zu überprüfen. Letztendlich haben wir uns auf dieses System spezialisiert und unser Augenmerk auf den Vergleich der verschiedenen Berechnungsarten gelenkt. Nichtsdestotrotz ist es immer noch Möglich, ein beliebiges System von Objekten zu erstellen und zu simulieren. Es gab einige Schwierigkeiten in der Berechnung, da kleine Verständnisfehler das ganze System instabil werden lassen, doch nach einigen Stunden intensiver Fehlersuche und vielen Flüchen konnten wir die Berechnungen vollends abschließen. Ein weiteres Problem stellte die Einarbeitung in Vpython dar, das wir jedoch letztendlich zufriedenstellend in Betrieb nehmen konnten. Nächste Schritte in der Entwicklung wären Optimierungen der Berechnung für eine bessere Performance und andere Darstellungsmöglichkeiten zu implementieren.
Des Weiteren wäre es noch interessant, Möglichkeiten zu finden, um stabiles Systeme zu ermitteln und zu simulieren.
Wir sind mit dem Ergebnis des Projektlabores insgesamt sehr zufrieden und haben im Verlauf der Arbeit viel über Python, Differentialgleichungen und planetare Berechnungen gelernt. Es war insgesamt ein sehr interessantes Projekt, das wir in ähnlicher Form auch anderen Gruppen in Zukunft empfehlen würden, da man gut seine Erfolge sieht und eine angenehmes Maß an Programmierung und theoretischer Arbeit vor sich hat. Zudem muss man sich den Umgang mit diversen Werkzeugen beibringen, wie z.B. 3D-Rendering mit vypthon, der Umgang mit Datenspeicherung in Form von bspw. CSV-Files, mathematische Sachverhalte in Python implementieren, externe Programme wie Skyfield integrieren und vieles mehr.




Euler-Verfahren
Euler-Verfahren

Leapfrog-Verfahren
Leapfrog-Verfahren





Lars Bonczek
Lukas Holdermann
Martina Kraußer
Lennox Lingk
Matthias Schuster

ws1819/sternensystem.1553274856.txt.gz · Zuletzt geändert: 2019/03/22 18:14 von lennox99