Das Magnetpendel 2009-07-13
Als Projektarbeit für Computational Physics habe ich ein Magnetpendel programmiert. Geschrieben in Python mit wxWidgets und Pyglet, parallelisiert mit IPython.
Als Projektarbeit für Computational Physics habe ich ein Magnetpendel programmiert. Geschrieben in Python mit wxWidgets und Pyglet, parallelisiert mit IPython.
Die Semesterferien neigen sich dem Ende zu, und nach all der Prüfungszeit wollte ich mal wieder was programmieren. Doch was? Nun, ich glaube ein Physikstudent sollte zumindest einmal in seinem Leben eine _Simulation eines Doppelpendels_ programmieren 😉 Es ist nicht nur schön anzusehen, sondern auch als wohl einfachstes „chaotisches System“:http://de.wikipedia.org/wiki/Chaos ein physikalisch interessanter Fall.
Die Herleitung der Bewegungsgleichungen ist dank zwei Semestern theoretischer Physik und „Lagrange II“:http://de.wikipedia.org/wiki/Lagrange-Formalismus nicht schwer, wird aber auch bei „Eric Weisstein’s World Of Physics“:http://scienceworld.wolfram.com/physics/DoublePendulum.html sehr schön beschrieben.
Die dort hergeleiteten Gleichungen sind
mit als Gesamtmasse.
Bleibt noch das Problem sie zu lösen. Analytisch ist das aber ohne Näherung nicht möglich. (Schon das einfache Fadenpendel läßt sich analytisch nur für kleine Winkel exakt lösen!)
Also numerisch.
Angefangen mit „Python“:http://www.python.org/ und dem Rechenpaket „SciPy“:http://scipy.org/ habe ich also ein Einfach- und ein Doppelpendel nebeneinander aufgehängt. (Für die Grafkausgabe OpenGL und „Pyglet“:http://www,pyglet.org/)
Das gekoppelte Differentialgleichungssystem 2. Ordnung muß man hierbei zur numerischen Lösung in ein Differentialgleichungssystem 1. Ordnung umformen, damit die Integrationsroutinen aus SciPy anwendbar sind. Aber das ist zum Glück immer möglich.
Weil es aber langweilig ist, eine fertige Funktion zu nutzen, habe ich auch diese Routinen noch umgesetzt. Genauer gesagt drei verschiedene: das „Euler-Verfahren“:http://de.wikipedia.org/wiki/Explizites_Euler-Verfahren, das „klassische Runge-Kutta-Verfahren“:http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren mit fester Schrittweite und das Runge-Kutta-Verfahren nach „Dormand und Prince“:http://en.wikipedia.org/wiki/Dormand-Prince mit einer sich anpassenden Schrittweite, wie es in „Numerical Recipes“:http://www.nrbook.com/ beschrieben ist.
Lange Rede, kurzer Sinn. Den Python-Code gibt’s hier: „klick“:http://www.tinowagner.com/projekte/double_pendulum-r25.zip. Ausführen mit „python -O simulation.py“.
Zur Ausführung wird, wie gesagt, weiterhin das Modul „Pyglet“:http://pyglet.org/download.html benötigt. In _ode.py_ findet sich die Implementation der ODE-Integrationsroutinen. Um die Pendelparameter zu ändern, liefere ich eine einfaches und schnell zusammengeschustertes Widget-Toolkit mit, das das Unterfenster erzeugt.
Da ich aber auch mal wieder was mit Java machen wollte, habe ich das Doppelpendel noch mit Java, „NetBeans“:http://www.netbeans.org/ und „JOGL“:https://jogl.dev.java.net/ (OpenGL-Binding für Java) umgesetzt. „umgesetzt“ heißt hierbei, daß ich den Code nahezu 1:1 von meinem ursprünglichen Python-Code übersetzt habe. Die Java-Simulation läuft etwas schneller und dank Java Web Start kann ich hier auch einen Link bieten, um sich das ganze sofort anzuschauen.
Den Quelltext gibt’s natürlich auch.
Ich hatte ja schon manche Albträume, weil der Internet-Explorer sich nicht an „Vereinbarungen“:http://www.w3.org/ hält. Glücklicherweise lassen sich die vielen Ecken und Kanten daran etwas glätten. Gewußt wie!
Daher hier eine kurze Liste mit informativen Links:
* Das Verhalten dieses Browsers wird stark davon ab, daß bestimmte Elemente „Layout“ bekommen (oder nicht). Damit lassen sich etwa die doppelten Margins entfernen, die der IE merkwürdigerweise gerne bei gefloateten Elementen setzt. Mehr darüber hier: „On having layout“:http://www.satzansatz.de/cssd/onhavinglayout.html („Deutsche Übersetzung“:http://onhavinglayout.fwpf-webdesign.de/)
* Workarounds für Browser-Bugs bei „CSS-Technik“:http://www.css-technik.de/rubrik/5/CSS-Browser-Bugs.htm
* „‚min-height‘ für den Internet-Explorer“:http://standards.webmasterpro.de/index-article-min_height.html. Sogar das läßt sich bewerkstelligen.
* Eine umfangreiche Liste, welche CSS-Eigenschaften von den einzelnen Browsern unterstützt werden findet sich „CSS 4 you“:http://www.css4you.de/browsercomp.html.
* „/* Position is Everything */“:http://www.positioniseverything.net/, sehr ausführliche Seite, die CSS-Bugs in modernen Browsern beschreibt, Beispiele zeigt und sagt, wie man sie behebt.