Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
talit:csharp_oop_sca [2025-06-16 10:05] – [Physik] sca | talit:csharp_oop_sca [2025-06-16 14:47] (aktuell) – [Physik] sca | ||
---|---|---|---|
Zeile 226: | Zeile 226: | ||
===== - Auftrag: Simulation des N-Body-Problems mit MonoGame ===== | ===== - Auftrag: Simulation des N-Body-Problems mit MonoGame ===== | ||
- | **Ziel: Orbits von $N$ Himmelskörpern, | + | **Ziel:** Schreibe mit C# und MonoGames eine Simulation der **Orbits von $N$ Himmelskörpern**, die sich gegenseitig mittels des Newton' |
+ | |||
+ | Tipps: | ||
+ | |||
+ | * Starte mit dem **2-Körperproblem** und erweitere es dann zu beliebig vielen Körpern. | ||
+ | * Machst du eine strikte Trennung von **Model und View**, kannst du deinen Code später besser wiederverwenden. | ||
==== Physik ==== | ==== Physik ==== | ||
- | Beim N-Body-Problem betrachtet man $N$ Himmelskörper $i=1, | + | Beim N-Body-Problem betrachtet man $N$ Himmelskörper $i=1, |
$$\vec{F}_{ik} = G m_i m_k \frac{\vec{r}_k-\vec{r}_i}{|\vec{r}_k-\vec{r}_i|^3}$$ | $$\vec{F}_{ik} = G m_i m_k \frac{\vec{r}_k-\vec{r}_i}{|\vec{r}_k-\vec{r}_i|^3}$$ | ||
+ | Da aber alle anderen $N-1$ Himmelskörper eine solche Gravitationskraft auswirken, müssen sämtliche einzelnen Kraftvektoren aufsummiert werden (Superpositionsprinzip), | ||
+ | $$\vec{F}_{i} = G m_i \sum_{k=1, | ||
+ | |||
+ | Ein Problem, das oft auftaucht, ist das folgende: Kommen sich zwei Massen sehr nah, so wird $|\vec{r}_k-\vec{r}_i|^3$ extrem klein. Dadurch wird die Kraft sehr gross und eine Masse kann dann regelrecht aus dem Bildschirm geschleudert werden. Dies soll verhindert werden. Dazu addiert man dem Nenner einen kleinen konstanten *Softening-Term* $s$: | ||
+ | $$\vec{F}_{i} = G m_i \sum_{k=1, | ||
+ | |||
+ | ==== Idee Code ==== | ||
- | ==== Struktur des Projekts ==== | + | Um die Bewegung der Himmelskörper zu simulieren, legt man die **Anfangsbedingungen (Initial Conditions)** fest: Anfängliche Position $\vec{r}\_i$ und Geschwindigkeit $\vec{v}\_i$ (und natürlich auch Masse) von jedem Himmelkörper $i$. |
- | Strukturiere dein Projekt nach dem **Model-View-Controller (MVC)** Muster: | + | Im Code geht man dann in einer Schleife alle $N$ Himmelskörper durch. In jedem Durchgang wird dann die Position und Geschwindigkeit von jedem Himmelskörper $i$ updated: |
+ | 1. Berechne mithilfe der Formel oben die **resultierende Kraft**, die auf den Himmelskörper $i$ wirkt. | ||
+ | 1. Berechne daraus die tatsächliche **Beschleunigung** des Himmelskörpers: | ||
+ | 1. Nutze diese, um den Geschwindigkeitsvektor des Himmelskörpers zu updaten: $$\vec{v\_i} \rightarrow \vec{v\_i} + \Delta t \cdot \vec{a\_i}$$ Dabei ist $\Delta t$ ein kleiner konstanter Zeitschritt: | ||
+ | 1. Mit dem neuen Geschwindigkeitsvektor wird nun der Positionsvektor updated: $$\vec{x\_i} \rightarrow \vec{x\_i} + \Delta t \cdot \vec{v\_i}$$ | ||
+ | **Kontrolle: | ||