Ich versuche, ein Kugelpendel zu implementieren. Der Lagrangian (den ich noch nicht ganz verstanden habe) basiert auf , θ und φ von dieser Seite ergeben die Gleichungen:
Ich behandle wie die Beschleunigung und von als Geschwindigkeit von . Ist das richtig? Nun wird jeder Schritt der Bewegung wie folgt implementiert (Python):
theta_f = pow(phi_v, 2) * sin(theta) * cos(theta) - G / L * sin(theta)
phi_f = - 2 * theta_v * phi_v / tan(theta)
theta_v += theta_f / timesteps
phi_v += phi_f / timesteps
theta += theta_v
phi += phi_v
Dies funktioniert solange phi_v
(
) ist 0 oder nahe 0.
Wenn , die Bewegung ist fehlerhaft.
Meine Anfangswerte sind
theta = 0.8
phi = 0.5
timesteps = 60
L ~ 2
G = 2.0
theta_v = 0.0
phi_v = 0.1
Nach einigen Iterationen erzeugt der Code ein math range error
as phi_v
gets too large. Ich habe diese Frage gefunden , die den mathematischen Rundungsfehler erklären könnte.
Ich verwende 60 Samples pro Sekunde, weil es eine Echtzeit-Interaktion geben wird. Annäherungswerte werden völlig in Ordnung sein, aber ich kann nicht glauben, dass der aktuelle Zustand einfach ein Annäherungsfehler ist.
Wie kann ich meinen Code korrigieren, um das Kugelpendel zu simulieren?
Das Problem scheint zu sein, dass Sie die Schrittgröße beim Integrieren nicht rechtzeitig berücksichtigen. Dies sollte offensichtlich sein, wenn Sie Dinge wie tun
phi_v += phi_f
im Code. 1 Die Beschleunigung kann nicht einfach zur Geschwindigkeit addiert werden (die Einheiten stimmen nicht überein!). Die erwartete Beziehung ist,
Was Sie tun sollten, ist die Verwendung der 4 Gleichungen (2 Positionen, 2 Geschwindigkeiten),
1. OP hat den timesteps
Term zu den Gleichungen in Version 6 hinzugefügt ; Diese Antwort wurde vor dieser Bearbeitung gepostet.
Es sieht für mich so aus, als ob Sie versuchen, ein System gewöhnlicher Differentialgleichungen zu lösen, indem Sie die Lösung für kleine Schritte schätzen. Hab ich recht? Wenn ja, dann gibt es einiges zu beachten.
Erstens benötigen Sie eine gute Schätzung für den Ableitungsoperator, um den zukünftigen Zustand unter den Anfangsbedingungen zu approximieren. Diese Art von Problem wird als Anfangswertproblem (ivp) bezeichnet.
Da die Gleichung sowohl Zeitableitungen erster als auch zweiter Ordnung beinhaltet, besteht ein gemeinsamer Schritt darin, Impulsvariablen zu definieren und ein größeres System zu propagieren. Dies hilft, Fehler zu vermeiden, wenn die Gesamtzeit zunimmt. Ich habe dieses Problem bei Raytracing-Codes gesehen, und was ich vorschlage, ist so häufig, dass die meisten Leute niemals eine Gleichung zweiter Ordnung propagieren. Die Idee ist:
p_theta = d(theta)/dt
p_phi = d(phi)/dt
dann ist deine gleichung
d(p_theta)/dt = (p_phi)^2*cos(theta)*sin(theta) - g/l*sin(theta)
d(p_phi)/dt = -2*p_theta*p_phi*cot(theta)
plus die beiden Gleichungen, die die p definieren.
Ein einfacher Euler-Schritt würde implementiert als
p_theta(t0+dt) = p_theta(t0) + (d(p_theta)/dt)(t0)*dt
p_phi(t0+dt) = p_phi(t0) + (d(p_phi)/dt)(t0)*dt
plus die Gleichungen für Theta und Phi in den Definitionen von p.
Dies ist die typische Konfiguration. Nun, der Euler-Schritt ist sehr schlecht und wird niemals empfohlen. Sie sollten besser eine Methode höherer Ordnung wie RK4 oder RK5 (4) usw. mit Schrittgrößensteuerung implementieren.
Abgesehen davon ist die Verwendung von Winkeln manchmal ein Problem, da dies dazu führen kann, dass Sie bei einem Schritt den nächsten Wert nicht eindeutig bestimmen können, da das System singulär ist. In Luft- und Raumfahrtsimulationen verwenden sie Viertelionen, um dies zu beheben. Einzelheiten zur Mathematik oder Zipfel-Modellierung und -Simulation der Dynamik von Luft- und Raumfahrtfahrzeugen finden Sie in Goldstein Classical Mechanics. Ich denke, Sie brauchen diese Maschinerie jetzt nicht. Sie müssen die Gleichungen richtig schreiben und einen einfachen Schrittalgorithmus ausprobieren, bevor Sie zu anspruchsvoll werden. Ich würde denken, dass Python ein ODE-Solver-Paket hat, sodass Sie kein eigenes schreiben müssen, sondern nur richtig einrichten und aufrufen. Ich hoffe das hilft.
J. Murray
wahrscheinlich_jemand
Biophysiker
Biophysiker
Kyle Kanos
Biophysiker
Kyle Kanos
Eli
Benutzer196418
Leander
Leander
Benutzer196418
Benutzer196418
Leander
Leander
Benutzer196418
QMechaniker
RJ Mathar