| |
|
|
p.specht
| Das grande Dilemma bei der numerischen Lösung von Feldgleichungen (z.B. Magnetfeldern) ist folgendes: Man muss entweder zuerst 2 Orte und die verstrichene Zeit kennen, um eine Durchschnittsgeschwindigkeit berechnen zu können (von der dann aber z.B. die Induktion und auf den Weg zurückwirkende magnetische Kräfte abhängen). Oder man muss, bei Kenntnis des Ausgangsortes, der Richtung und Geschwindigkeit, den nächsten Bahnpunkt berechnen - die wirkenden nichtlinearen Reibungskräfte sind aber z.B. vom Weg ZWISCHEN Ausgangs- und nächstem Bahnpunkt abhängig ... den man aber noch nicht kennt! Problem erkannt? Fehler-Minimierung allein hilft da wenig, es geht nämlich noch um weitere Eigenschaften, die ein guter Simulationsalgorithmus erfüllen muss:
Das Geheimnis vieler Physik-Simulationen ist Velocity Verlet Integration, ein schnelles Integrationsverfahren per Newton'sche Bewegungsgleichungen, das sogar das hochgenaue 'Runge-Kutta-4./5.Ordnung (RKF45)'-Verfahren übertrifft, - allerdings NICHT an Genauigkeit, sondern an Energie-Konstanz! Runge-Kutta neigt nämlich im Laufe der Zeit dazu, durch systematische Fehler und Rundungsfehler immer mehr Energie in das simulierte System (etwa ein Pendel) zu pumpen.
Das kann beim hier als DEMO OHNE GEWÄHR vorgestellten VELOCITY VERLET-Verfahren (sehr ähnlich dem 'Leapfrog'-Verfahren, zu deutsch etwa 'Bockspringen') nicht passieren, da es ein ZEITUMKEHRBARES, SYMPLEKTISCHES Verfahren ist, dessen Fehler sich bis auf einen kleinen Anteil gegenseitig weitestgehend aufheben. Zeitumkehrbar è: Durch Vorzeichenänderung im Zeitschritt gelangt man wieder an die Ausgangsposition! Symplektisch bedeutet, daß physikalische Erhaltungsgrößen wie Impuls, Energie, Entropie dabei (weitestgehend) erhalten bleiben.
Anbei ein bewusst äußerst einfach gehaltenes Verfahrensbeispiel (In Physik-Engines geht's dann gleich in allen 3 Freiheitsgraden der Translation und 3 der Rotation zur Sache):
WindowTitle "VELOCITY VERLET DEMO am Beispiel Lineares Feder-Masse-Dämpfungssystem"
'(CL) CopyLeft 2014-08 by P.Specht, Wien
'Q: https://en.wikipedia.org/wiki/Verlet_integration#Velocity_Verlet
WindowStyle 24:Window 0,0-%maxx,%maxy
var xh&=width(%hwnd)\2:var yh&=height(%hwnd)\2
Declare m!,dt!,x1!,x2!,v1!,v15!,v2!,a1!,a2!
proc A :parameters x!,v!
var l!=200' Federlänge m/1000
var fk!=25' Federkonstante N/m 'Kraft pro Auslenkung
var rk!=0.2' Reibungskonstante N*s/m
return (l!-x!)*fk!/m! - v!*rk!
'Beschleunigung = Kraft / Masse - Reibungsdämpfung
endproc
proc DRAW
usepen 0,(xh&-x2!)/30 ,255
cls
line xh&-500,yh& - xh&+x2!-200,yh&
usepen 0,37,rgb(0,0,255)
line xh&+x2!-200,yh& - xh&+x2!-199,yh&
endproc
'Startwerte:
dt!=0.03's
m!=1'kg
'Einfachstes Zeichenmodell (mit Cls, ohne MemCopy)
'Hauptschleife
Repeat :waitinput 33
'VELOCITY VERLET (aka Leapfrog)
v15!= v1!+a1!/2*dt!
x2! = x1!+v15!*dt!
a2! = A(x2!,v15!)
v2! = v15!+dt!*a2!/2
DRAW
a1!=a2!:v1!=v2!:x1!=x2!' Umgreifen per nächsten Schritt
until %key=27
END
|
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 14.05.2021 ▲ |
|
|
|