Gafferon Games hat einen großartigen Artikel über RK4-Integration für bauphysikalische Simulationen, den Sie hier finden: Integrationsgrundlagen
Persönlich könnten meine mathematischen und physikalischen Kenntnisse verbessert werden. Ich fühle mich wohl im Bereich der Vektormathematik, Trigger, einiger Statistiken (ich musste lineare Linienregressionsformeln für Software usw. verwenden) und im Grunde der meisten Dinge auf Highschool-Niveau bis zum ersten Studienjahr.
Nun zur Frage: Ich habe diesen Artikel gelesen, die zugehörige Quelle heruntergeladen und Zeile für Zeile debuggt, um zu verstehen, was passiert, und trotzdem das Gefühl zu haben, dass ich eindeutig nicht das bekomme, was ich sehe. Ich habe im Internet nach den "For Dummies" -Versionen gesucht, ehrlich gesagt lerne ich etwas anders und wenn ich den ganzen Tag auf Formeln mit dem Schwerpunkt auf Auswendiglernen starre, wird das nicht schaden, da ich verstehen muss, was passiert, also ich kann flexibel angewendet werden.
Ich glaube, ich verstehe Folgendes, aber ich hoffe, dass jemand anderes mich klarstellen oder vollständig korrigieren kann. Der RK4 verwendet einen Euler-Schritt, basiert dann darauf, dass er sich rechtzeitig vorwärts bewegt, um mehrere wesentlichere Euler-Schritte (?) Zu berechnen, und bestimmt anhand einer gewichteten Summe, welche Position und Geschwindigkeit für den nächsten Frame am besten ist.
Darüber hinaus diese Beschleunigungsmethode (konvertiert in AS3):
private function acceleration(state:State, time:Number):Number
{
const k:int = 10;
const b:int = 1;
return - k*state.x - b*state.v;
}
nimmt eine konstante Masse (10) und Kraft (1)? und gibt eine seltsame Berechnung zurück Ich habe keine Ahnung warum ...- Masse * Position - Kraft * Geschwindigkeit? Was?
Dann für meine letzte Verwirrung in den Bewertungsmethoden, die aussehen wie (AS3):
private function evaluateD(initial:State, time:Number, dtime:Number, d:Derivative):Derivative
{
var state:State = new State();
state.x = initial.x + d.dx*dtime;
state.v = initial.v + d.dv*dtime;
var output:Derivative = new Derivative();
output.dx = state.v;
output.dv = acceleration(state, time+dtime);
return output;
}
Wir speichern einen neuen Zustand mit dem Zeitschritt und setzen dann eine Ableitung, um zurückzukehren ... Ich verstehe das irgendwie, wie es im Approximationsprozess verwendet wird, aber was ist das!:
output.dx = state.v;
output.dv = acceleration(state, time+dtime);
// ok I get we are getting the new velocity since v = a * t, obviously I
// don't what acceleration() is returning though.
Wir setzen die Positionsänderung der abgeleiteten Ausgabe auf die Zustände neue Geschwindigkeit? Huh?
Zuletzt wird diese Testsimulation folgendermaßen ausgeführt:
var state:State = new State();
state.x = 100;
state.v = 0;
t = 0;
dt = 0.1;
while (Math.abs(state.x)>0.001 || Math.abs(state.v)>0.001)
{
trace(state.x, state.v);
integrate(state, t, dt);
t += dt;
}
Wir setzen also einen neuen Zustand mit einem Positionswert von 100 und einer Geschwindigkeit von 0? Was ist der Sinn dieser Simulation, wenn wir keine Geschwindigkeit haben ...
Wie auch immer, ich bin ziemlich verwirrt und vom Planeten Erde abgewandert. Die Hoffnung, dass jemand da draußen das für mich klären kann.