Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
talit:csharp_oop_sca [2025-06-16 10:53] – [Physik] scatalit: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, die sich gegenseitig anziehen mittels des Newton'schen Gravitationsgesetztes.**+**Ziel:** Schreibe mit C# und MonoGames eine Simulation der **Orbits von $N$ Himmelskörpern**, die sich gegenseitig mittels des Newton'schen Gravitationsgesetztes anziehenProgrammiere deinen Code schön und strikt **objektorientiert**. Natürlich soll dabei die eigene **Vektor-Klasse** so viel wie möglich verwendet werden. 
 + 
 +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 ====
Zeile 235: Zeile 241:
 $$\vec{F}_{i} = G m_i \sum_{k=1,k\neq i}^N m_k \frac{\vec{r}_k-\vec{r}_i}{|\vec{r}_k-\vec{r}_i|^3}$$ $$\vec{F}_{i} = G m_i \sum_{k=1,k\neq i}^N m_k \frac{\vec{r}_k-\vec{r}_i}{|\vec{r}_k-\vec{r}_i|^3}$$
  
-Um die Bewegung von Himmelskörper $izu simulieren, geht man wie folgt vor:+Ein Problem, das oft auftaucht, ist das folgende: Kommen sich zwei Massen sehr nah, so wird $|\vec{r}_k-\vec{r}_i|^3extrem 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,k\neq i}^N m_k \frac{\vec{r}_k-\vec{r}_i}{(|\vec{r}_k-\vec{r}_i| + s)^3}$$
  
-   1. Lege die **Initial Conditions** fest: Anfängliche Position $\vec{r}\_i$ und Geschwindigkeit $\vec{v}\_i$. +==== Idee Code ====
-   1. Berechne mithilfe der Formel oben die **resultierende Kraft**, die auf den Himmelskörper wirkt. +
-   1. Berechne daraus die tatsächliche **Beschleunigung** des Himmelskörpers: $$\vec{a}\_i \frac{\vec{F}\_i}{m\_i}$$ +
-   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 Zeitschritt: Je kleiner, desto genauer aber auch ineffizienter wird die Simulation. $\Delta t 1 [\text{s}]$ ist ein guter Startwert. +
-   1. Mit dem neuen Geschwindigkeitsvektor wird nun der Positionsvektor updated: $$\vec{x\_i} \rightarrow \vec{x\_i} + \Delta t \cdot \vec{v\_i}$$ +
-==== Struktur des Projekts ====+
  
-Strukturiere dein Projekt nach dem **Model-View-Controller (MVC)** Muster:+Um die Bewegung der Himmelskörper zu simulieren, legt man die **Anfangsbedingungen (Initial Conditions)** festAnfängliche Position $\vec{r}\_i$ und Geschwindigkeit $\vec{v}\_i$ (und natürlich auch Masse) von jedem Himmelkörper $i$.
  
 +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: $$\vec{a}\_i = \frac{\vec{F}\_i}{m\_i}$$
 +   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: Je kleiner, desto genauer aber auch ineffizienter wird die Simulation. $\Delta t = 1 [\text{s}]$ ist ein guter Startwert.
 +   1. Mit dem neuen Geschwindigkeitsvektor wird nun der Positionsvektor updated: $$\vec{x\_i} \rightarrow \vec{x\_i} + \Delta t \cdot \vec{v\_i}$$
  
 +**Kontrolle:** Um zu kontrollieren, ob der Code sich richtig verhält, kann man zu jedem Zeitpunkt den **Schwerpunkt** des Gesamtsystems (alle Himmelskörper zusammen) betrachten. Der Schwerpunkt muss **unbeschleunigt** sein, er muss also entweder in Ruhe sein oder sich mit konstanter Geschwindigkeit entlang einer Geraden bewegen. Wird der Schwerpunkt schneller oder langsam oder bewegt er sich auf einer gekrümmten Bahn, so muss ein Fehler vorliegen. Wie der Schwerpunkt berechnet wird, kann im **[[https://sca.ksr.ch/lib/exe/fetch.php?media=pham_physik_sca:pham_statik_01_schwerpunkt.pdf|PHAM Dossier zum Schwerpunkt (Siehe Formel unter 'Diskrete Massenverteilung')]]** nachgeschlagen werden.
  
  • talit/csharp_oop_sca.1750071192.txt.gz
  • Zuletzt geändert: 2025-06-16 10:53
  • von sca