Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ss2021:project2:doku

Partikelsimulation

Im Rahmen des Projektlabor Mathesis, welches im MINTgrün Orientierungsstudium angesiedelt ist, wurde dieses Projekt umgesetzt. Wie bereits der Name andeutet, ist das Ziel des Projekts eine Simulation von Partikeln im dreidimensionalen Raum. Besonders auf die drei Kerneigenschaften Gravitation, Reibung und Kollision wird hierbei wertgelegt.

Struktur des Programms

Unser Programm basiert auf der Bibliothek vpython, welche die graphische Umsetzung ermöglicht. Im Anfang unseres Programms werden die Partikel zweimal erzeugt. Einmal als die Liste „partikel“, welche die einzelnen Partikel als Dictionaries enthält, und einmal als die Liste „kugeln“, welche vpython Objekte enthält, die graphisch dargestellt werden können.

Die Hauptschleife

Nach dem definieren einiger Funktionen, auf welche im Detail weiter unten eingegangen wird, findet sich die Hauptschleife in Form eines while Loops, eine Schleife, welche theoretisch unendlich laufen kann. Die Grundidee hierbei ist, dass jede Iteration in dieser Hauptschleife einen Frame der Simulation bildet. Die Dictionaries aus „partikel“ enthalten sieben Einträge. Hierbei stellen drei die Position im dreidimensionalen Raum dar und- drei weitere Einträge den Geschwindigkeitsvektor. Der letzte Eintrag ist für die Masse, welche zum Beispiel bei der Gravitationsfunktion benötigt wird. In jeder Iteration wird dann die Position eines jeden Partikels aktualisiert, indem auf die alte Position $\vec{p}_{alt}$ der Geschwindigkeitsvektor $\vec{v}$ hinzuaddiert wird.
Es gilt also für die neue Position $\vec{p}_{neu}=\vec{p}_{alt}+\vec{v}$. Auf diese Weise würde zunächst eine gradlinige Bewegung für alle Partikel entstehen. Die Simulation wird aber dadurch interessant, dass in der Hauptschleife vorneweg noch die anderen Funktionen die Geschwindigkeitsvektoren verändern, teilweise entfallen sogar ganze Partikel. Im folgendem werden diese Kerneigenschaften und die damit verbundenen Funktionen erläutert, welche den eigentliche Grund der Simulation darstellen.

Kerneigenschaften

Wie oben erklärt besteht unser Algorithmus aus drei Hauptfunktionen, diese werden im folgendem genauer beschrieben.

Gravitation

Die Gravitation war die erste und bleibt nach wie vor die wichtigste programmierte Eigenschaft in unserem Code.

Theorie

$F=m\cdot a$

Als Gravitation bezeichnet man die Anziehungskraft zwischen Massen. Jede Masse im Universum zieht sich gegenseitig an, $F_G=\gamma\cdot\frac{m_1\cdot m_2}{r^2}$ dabei ist die Stärke der Anziehungskraft abhängig von Masse und Abstand der Massekörper. Die Abhängigkeit vom Abstand zwischen den Körpern führt dazu, dass bei sehr geringen Abständen (limes r gegen null) die Gravitationskraft sehr groß wird. Da Körper ihre Masse nicht in einen Punkt konzentrieren, dreidimensionale Objekte sind, kommt es zu Kollisionen, bevor die Stärke der Gravitation sozusagen ins unendliche schießt. [Zur Kollision in unserer Simulation folgt später ein Abschnitt] Die Gravitationskonstante $\gamma$ beträgt im Universum ungefähr $6,67\cdot10^{-11}\frac{m^3}{kg\cdot s^2}$, weshalb die Gravitation zwischen kleinen Massen üblicherweise nicht zu einer spürbaren Beschleunigung führt. In unserer Simulation haben wir größere Konstanten gewählt, und somit die Stärke der Anziehungskraft deutlich erhöht.

Bei den Berechnungen stoßen wir, sobald mehr als zwei Massekörper im Spiel sind, auf das sogenannte Dreikörperproblem 1) : für drei und mehr Körper ist es bisher (bis auf Spezialfälle) nicht gelungen, exakte analytische Lösungen zu finden und Bahnkurven genau vorherzusagen, die Differentialgleichungen beinhalten zu viele unbekannte Variablen. Numerische Berechnungen sind dennoch möglich, wobei für jedes Paar von Massekörpern in jedem Zeitschritt die Kraft bestimmt -und aus allen Kräften für die einzelnen Partikel die resultierende Beschleunigung aufsummiert wird. Mit dieser neuen Beschleunigung ergibt sich eine aktuelle Momentangeschwindigkeit für jedes Partikel, und die Position im nächsten Zeitschritt wird für die erneute Berechnung verwendet. Mithilfe dieser Methode konnten wir in unserer Simulation die Wechselwirkung vieler Massen aufeinander darstellen.

Umsetzung

In jedem Frame, also Zeitschritt, unserer Simulation, werden die einzelnen Partikel nacheinander betrachtet. Dieses Schema zeigt grob die durchlaufenen Schleifen:

Zunächst werden die Abstände zu den anderen Partikeln berechnet, und anschließend entweder eines der beiden Kollisions-szenarien (Fusion/Explosion), oder die Gravitations-beschleunigung berechnet. Für die Berechnung der Beschleunigung erstellten wir die Funktion „Gravitation“. Als Input nimmt sie die Positionen zweier Partikel (diese sind als x,y,z Koordinate in der Partikelliste gegeben) und die Stärke der Gravitationskonstante, und als Output erhalten wir die Beschleunigung, welche auf Partikel i wirkt. In einem Zeitschritt von einer Sekunde entspricht diese Beschleunigung dem Geschwindigkeitsvektor, welcher durch diese Beschleunigung an dem Partikel ansetzt, da $a=\frac{v}{s}$ gilt. Diese Geschwindigkeitsvektoren werden alle auf die vorherige Geschwindigkeit von Partikel i hinzu addiert, und es ergibt sich die neue Momentangeschwindigkeit.

Aus physikalischer Sicht steht jeder Frame für eine Sekunde, wobei die Simulation (aus ästhetischen und praktischen Gründen) deutlich schneller abgespielt wird.

Reibung

Theorie

Als einen weiteren Bestandteil unserer Simulation haben wir Reibung eingebaut, welche die Bewegung dämpft, da kinetische Energie umgewandelt wird. Es gibt verschiedene Arten von Reibung, Abhängig von beispielsweise der größe der Angriffsfläche des Objekts und der Beschaffenheit der Umgebung durch die es sich bewegt. Wir haben uns dfür entschieden, abhängig von Geschwindigkeit und Masse der Partikel, einen geringen Geschwindigkeitsverlust zu kalkulieren.

Wenn sich also einige Partikel in einem Kräftegleichgewicht auf stabilen Bahnen bewegen, führt die Reibung in der Simulation dazu, dass sie stetig kleine Anteile ihrer Bewegungsenergie verlieren, und die Bahnen nicht endlos als stabile Bewegung gegeben bleiben.

Umsetzung

Kollision

Die Kollision findet genau dann statt, wenn sich zwei Partikel zu nahe kommen, hierbei wird zwischen der Fusion bei langsamen -und Explosion bei schnellen Zusammenstößen unterschieden. Die besondere Herausforderung hierbei bestand darin, dass sich die eigentliche Partikelanzahl verändert. Ein Problem ähnlich wie bei der Gravitation besteht darin, dass auch hier zwischen je zwei Partikeln zunächst der Abstand ermittelt werden muss, wodurch eine hohe Rechenzeit entsteht. Die beiden folgenden Fälle treten nur ein, wenn der Abstand zwischen zwei Partikeln klein genug ist.

Fusion

Anschaulich gesprochen, verschmelzen bei der Fusion zwei Partikel zu einem. Im Programm wird hierbei zunächst ein Partikel übernommen. Seine Position bleibt gleich, da sich beide Partikel relativ nah sein sollen. Als nächstes wird der neue Richtungsvektor $\vec{v}_{neu}$ ermittelt. Da hier der Impulserhaltungssatz wichtig ist, verwenden wir folgende Formel:
$\vec{v}_{neu}\cdot(m_1+m_2)=m_1\cdot\vec{v}_1+m_2\cdot\vec{v}_2.$
Hier stehen $m_1$ und $m_2$ für die Massen der zwei Partikel und $\vec{v}_1$ und $\vec{v}_2$ für die entsprechenden alten Geschwindigkeitsvektoren. Zum Schluss wird als neue Masse die Summe der beiden alten verwendet und dass übergebliebene Partikel entfernt und die Fusion ist abgeschlossen.

Explosion

Die Idee hierbei war, dass zwei schnell aufeinander prallende Partikel nicht fusionieren, sondern eher auseinander gesprengt werden. Hierbei wird eine Anzahl an Splitterpartikeln erzeugt, so dass später keine kinetische Energie verloren geht. In der Variabel „v“ wird hierfür zunächst die Geschwindigkeit der einzelnen Splitterpartikel, wir haben angenommen, dass alle neuen Partikel die gleiche Geschwindigkeit und Masse besitzen. Diese neuen Splitterpartikel werden nun erzeugt, zunächst nur eine Hälfte an dem Ort der Kollision mit einem zufälligem Richtungsvektor und dann die andere Hälfte, so dass je zwei Splitterpartikel entgegengesetzte Richtungsvektoren besitzen. Die Splitterpartikelmasse ist hierbei die Anzahl der Splitterpartikel geteilt durch die Summe der Massen der beiden alten Partikel. Zu guter Letzt werden alle Richtungsvektoren so skaliert, dass die Norm der Richtungsvektoren gleich zu „v“ ist. Dann können die alten Partikel entfernt und die neuen Partikel der Simulation hinzugefügt werden.

Fusion oder Explosion

Um zu entscheiden, welche der beiden Vorgänge bei einer Kollision passieren, nehmen wir zunächst die Norm der Differenz der Richtungsvektoren der beiden alten Partikel. Wenn nun dieses Ergebnis kleiner als eine Konstante namens „threshold“ ist, entsteht eine Fusion, sonst eine Explosion. Es ist schwierig diesen Grenzwert so zu wählen, dass weder alles Explodiert, noch alles in sich zusammenfällt.

Herausforderungen und Pläne für die Zukunft

Die erste Herausforderung dieses Projektes war eine passende Bibliothek zu finden, um die graphische Umsetzung zu ermöglichen. Anfangs wollten wir matplotlib nutzen, aber schnell war klar, dass diese Bibliothek nicht unseren Vorstellungen entsprach. Alles funktionierte nur sehr langsam und war zuzüglich sehr umständlich. Wir entschieden uns für die Bibliothek vpyhthon, welche uns auf eine einfache Weise ermöglichte, Körper in einer dreidimensionalen Welt zu platzieren. In dieser Welt kann man sich sogar bewegen, die Simulation konnten wir uns so von allen Seiten anschauen und waren nicht auf einen Blickwinkel beschränkt.

raise TypeError
ss2021/project2/doku.txt · Zuletzt geändert: 2021/10/14 15:23 von pauli_fritze