Eine etwas andere Kettenlinie
Verfasst: Donnerstag 4. Oktober 2007, 17:05
Übliche Demonstrationsprogramme für die Kettenlinie stellen meistens nur eine einfache, komplett durchhängende Linie dar. Interessanter finde ich eine Linie, die auf dem Boden aufliegt, weil sie zu lang ist, oder zwei zusammenhängende Linien. Ich hatte dies bereits einmal in C implementiert. Jetzt habe ich in anderem Zusammenhang erste Erfahrungen mit dem Scipy-Modul machen können. Deshalb habe ich das Problem jetzt einmal in Python mit Scipy umgesetzt. Eins vorweg: Es ist nicht langsamer als die C-Implementierung und die Entwicklung war wesentlich geradliniger. Gerade die Berechnung der Gleichungen für aufliegende Ketten erscheint mir ziemlich elegant. Im Prinzip ist es lediglich die Lösung eines nichtlinearen Gleichungssystems.
Die grafische Darstellung erfolgt mit Tkinter, weil sich das Canvas-Widget hierfür anbot. Die entsprechende Klasse enthält u.a. auch eine Methode draw_vecs, die für die Kettenlinie nicht benötigt wird. Ich verwende die Klasse aber auch für eine alternative Ausgabe der in einem anderen Thread behandelten Planetenbahnen: http://www.python-forum.de/topic-11982.html
Wenn man den mittleren Aufhängungspunkt verschiebt, fallen in Grenzbereichen abrupte Formänderungen der Kurve auf, die wahrscheinlich nicht korrekt sind. Nach Vermeidung negativer Werte für k, die z.T. von fsolve als Ergebnis geliefert wurden, in der Gleichung für die Kettenlinie und "Sicherheitsabstand" am oberen und den seitlichen Rändern für die Verschiebemarke ist dies wesentlich besser geworden, taucht aber gelegentlich weiterhin auf. Ich vermute, dass die Teilung der aufliegenden Kette (Zeile 138) das Problem darstellt. Ich habe die Grenze zwischen rechtem und linkem Teil einfach senkrecht durch das Minimum einer entsprechenden durchhängenden Kettenlinie gleicher Länge gelegt. Das scheint aber nicht korrekt zu sein: Wenn man z.B. den Verschiebepunkt nicht bei x=0, sondern bei x=50 hat (animate_drag(-100, 200, 100, 200, 500, graph, 50)), dann entsteht beim Übergang von der 2-Punkt- auf die 3-Punkt-Form plötzlich ein Knick. Ich weiß aber nicht, wie ich die Kette "physikalisch korrekt" in 2 Teile aufteile. Vielleicht hat ja jemand eine gute Idee oder kennt sich einfach besser in Physik aus.
Etwas komisch sehen die vielen Funktionen im Modul aus. Ich zumindest sehe hier aber keinen Sinn in der Verwendung einer Klasse. Auch hier würden mich Meinungen interessieren.
Bitte nicht über die z.T. kurzen Namen (a, b, k, l, l1 etc.) schimpfen. Sie sind halt kurz und trotzdem wohl verständlich.
Das Programm ist fast nicht kommentiert. Wenn es also Fragen gibt, nur zu.
Hier jetzt der Code: http://paste.pocoo.org/show/5299/
MfG
HWK
Die grafische Darstellung erfolgt mit Tkinter, weil sich das Canvas-Widget hierfür anbot. Die entsprechende Klasse enthält u.a. auch eine Methode draw_vecs, die für die Kettenlinie nicht benötigt wird. Ich verwende die Klasse aber auch für eine alternative Ausgabe der in einem anderen Thread behandelten Planetenbahnen: http://www.python-forum.de/topic-11982.html
Wenn man den mittleren Aufhängungspunkt verschiebt, fallen in Grenzbereichen abrupte Formänderungen der Kurve auf, die wahrscheinlich nicht korrekt sind. Nach Vermeidung negativer Werte für k, die z.T. von fsolve als Ergebnis geliefert wurden, in der Gleichung für die Kettenlinie und "Sicherheitsabstand" am oberen und den seitlichen Rändern für die Verschiebemarke ist dies wesentlich besser geworden, taucht aber gelegentlich weiterhin auf. Ich vermute, dass die Teilung der aufliegenden Kette (Zeile 138) das Problem darstellt. Ich habe die Grenze zwischen rechtem und linkem Teil einfach senkrecht durch das Minimum einer entsprechenden durchhängenden Kettenlinie gleicher Länge gelegt. Das scheint aber nicht korrekt zu sein: Wenn man z.B. den Verschiebepunkt nicht bei x=0, sondern bei x=50 hat (animate_drag(-100, 200, 100, 200, 500, graph, 50)), dann entsteht beim Übergang von der 2-Punkt- auf die 3-Punkt-Form plötzlich ein Knick. Ich weiß aber nicht, wie ich die Kette "physikalisch korrekt" in 2 Teile aufteile. Vielleicht hat ja jemand eine gute Idee oder kennt sich einfach besser in Physik aus.
Etwas komisch sehen die vielen Funktionen im Modul aus. Ich zumindest sehe hier aber keinen Sinn in der Verwendung einer Klasse. Auch hier würden mich Meinungen interessieren.
Bitte nicht über die z.T. kurzen Namen (a, b, k, l, l1 etc.) schimpfen. Sie sind halt kurz und trotzdem wohl verständlich.
Das Programm ist fast nicht kommentiert. Wenn es also Fragen gibt, nur zu.
Hier jetzt der Code: http://paste.pocoo.org/show/5299/
MfG
HWK