Soeben habe ich mein Blog von Blogger auf einen kleinen Raspberry Pi 2 in meiner
Wohnung verschoben. Als Engine benutze ich Pelican,
ein statischer Blog Generator in Python, der mir auf den ersten Blick sehr gefällt.
Nicht nur, dass ich alle Einträge jetzt in Markdown
schreiben kann, was es ermöglicht das ganze Blog per git
zu verwalten (dementsprechend gibt es den Quellcode auf GitHub),
sondern es steht mit Pygments ein sehr
hübsches Syntax Highlighting zur Verfügung.
floatQ_rsqrt(floatnumber){longi;floatx2,y;constfloatthreehalfs=1.5F;x2=number*0.5F;y=number;i=*(long*)&y;// evil floating point bit level hackingi=0x5f3759df-(i>>1);// what the fuck?y=*(float*)&i;y=y*(threehalfs-(x2*y*y));// 1st iteration// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removedreturny;}
Außerdem Formeln in \(\LaTeX\) Notation dank MathJax
$$\mathcal H = \sum_{\left< i, j \right>} s_i s_j$$
Ich werde diese Gelegenheit außerdem nutzen die meisten Einträge meines Blogs
zu verwerfen und nur einige ausgewählte zu überarbeiten und hier zu veröffentlichen.
Die grundlegende Idee zur numerischen Lösung von Differentialgleichungen ist es, die Zeit
in diskreten Schritten \(\tau\) vergehen zu lassen. Nach jedem Schritt wird der
Zustand so geändert, als ob sich während des Zeitschrittes nichts geändert
hätte und die „Kräfte“ werden entsprechend der Bewegungsgleichungen neu berechnet.
Für infinitesimal kleine \(\tau \to \mathrm{d}t\) ist diese Methode schließlich exakt.
Im einfachsten Fall, dem Euler Verfahren, sähe das für ein einfaches
Fadenpendel nach \(k\) Zeitschritten so aus
Unglücklicherweise hat dieses Verfahren ernsthafte Probleme mit der Energieerhaltung
und braucht sehr kleine \(\tau\) für brauchbare Ergebnisse.
Es gibt deutlich ausgefeiltere Methoden, wie den klassischen Runge-Kutta
Algorithmus. Es gibt Methoden, den Zeitschritt \(\tau\) während der Simulation
adaptiv anzupassen, um nur wenig Rechenaufwand in den wenig fehleranfälligen
Phasen zu verbringen. Es gibt spezialisierte Methoden, die sehr gut für bestimmte Bewegungsgleichungen
funktionieren, wie Velocity-Verlet,
der oft für Molekulardynamiksimulationen eingesetzt wird.
Chaotische Systeme haben in der Regel etwas kompliziertere Bewegungsgleichungen. Das oben abgebildete
Doppelpendel etwa wird, wie ich in einem anderen Post beschrieben habe
durch folgendes Ungetüm beschrieben.
Da man das 3-Körperproblem trivial auf ein \(N\)-Körperproblem erweitern kann,
habe ich hier ein „Sonnensystem“ bzw. Bohrsches „Atom“-modell simuliert.
Um die obigen (bewegten) Bilder zu erzeugen und um ein bewegtes Doppelpendel
für meinen Schreibtisch zu haben, — wennauch nur auf einem Bildschirm — habe
ich in C++ einen adaptiven Runge-Kutta-4 Löser geschrieben, der mit den Qt
Zeichenprimitiven animiert wird.
Auch wenn der Code nicht sehr aufgeräumt ist und Startwerte im Quellcode
angepasst werden müssen, sind die Quellen auf GitHub:
github.com/surt91/DGLshow.
Das ist ein Doppelpendel. Ein Doppelpendel ist neben dem Dreikörperproblem
und dem Lorenz-Attraktor [1, 2]
das Paradebeispiel für analytisch unlösbare Bewegungsgleichungen
und chaotisches Verhalten. Aus diesem Grund sollte ein Doppelpendel auf keinem
Schreibtisch fehlen und bietet sich als grandiose Geschenkidee für Physiker an.
Dass es analytisch unlösbar ist, lässt sich mit einem nicht rigorosen Argument
anschaulich machen: Ein Blick auf die Bewegungsgleichungen:
Das sind die Differentialgleichungen für die beiden Winkel \(\vartheta_1\) und \(\vartheta_2\)
des Doppelpendels. \(m_i\) sind die beiden Massen und \(l_i\) die Fadenlängen.
Unser Ziel ist es das obige Video zu erstellen, dazu müssen wir die Bahnkurve,
also \(\vartheta_1(t)\) und \(\vartheta_2(t)\) bestimmen.
Dazu müssen wir die obigen Gleichungen, die sich relativ simpel,
wenn auch mühsam, per Lagrange-Formalismus herleiten lassen,
zunächst nach den Winkelbeschleunigungen aufgelösen.