Gafferon Games a un excellent article sur l'intégration RK4 pour les simulations de physique du bâtiment qui peut être trouvé ici: Bases de l'intégration
Personnellement, mes connaissances en mathématiques et en physique pourraient être améliorées. Je me sens à l'aise dans le domaine des mathématiques vectorielles, du trigonomètre, de certaines statistiques (j'ai dû utiliser des formules de régression linéaire pour les logiciels, etc.) et, fondamentalement, de la plupart des choses du niveau secondaire au collège.
Maintenant à la question, j'ai lu cet article, téléchargé la source associée et débogué ligne par ligne pour essayer de comprendre ce qui se passe et j'ai toujours l'impression que je n'obtiens clairement pas ce que je regarde. J'ai cherché sur Internet en essayant de trouver les versions "pour les nuls", franchement j'apprends un peu différemment et regarder des formules toute la journée en mettant l'accent sur la mémorisation ne va pas le couper car j'ai besoin de comprendre ce qui se passe donc je peut être flexible en l'appliquant.
Voici donc ce que je pense comprendre jusqu'à présent, mais j'espère que quelqu'un d'autre pourra me clarifier ou me corriger complètement. Le RK4 utilise un pas d'Euler, puis base celui-ci pour avancer dans le temps pour calculer plusieurs pas d'Euler plus essentiellement (?) Et détermine à l'aide d'une somme pondérée quelle est la meilleure position et la meilleure vitesse pour la prochaine image?
De plus, cette méthode d'accélération (convertie en AS3):
private function acceleration(state:State, time:Number):Number
{
const k:int = 10;
const b:int = 1;
return - k*state.x - b*state.v;
}
prend une masse (10) et une force (1) constantes? et renvoie un calcul bizarre, je ne sais pas pourquoi ... - masse * position - force * vitesse? quelle?
Ensuite, pour ma dernière confusion, dans les méthodes d'évaluation qui ressemblent à (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;
}
Nous stockons un nouvel état avec le pas de temps, puis définissons une dérivée à retourner ... Je comprends en quelque sorte cela car il est utilisé dans le processus d'approximation, mais qu'est-ce que c'est!:
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.
Nous définissons le changement de sortie dérivé en position sur la nouvelle vitesse des états? Hein?
Enfin, cette simulation de test s'exécute en faisant ceci:
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;
}
Nous établissons donc un nouvel état avec une valeur de position de 100 et une vitesse de 0? Quel est l'intérêt de cette simulation si nous n'avons pas de vitesse ...
Quoi qu'il en soit, inutile de dire que je suis assez confus et que j'ai dérivé de la planète Terre. En espérant que quelqu'un là-bas puisse clarifier cela pour moi.
la source
Réponses:
RK4 est un exemple d' intégrateur numérique . L'intégration d'Euler est un concept similaire, mais il est beaucoup moins précis. L'intégration numérique n'est pas exacte, mais beaucoup mieux pour un ordinateur à gérer dans une situation en temps réel comme un jeu. La raison pour laquelle vous utilisez RK4 au lieu d'Euler est que RK4 prend en compte l'intégration des deuxième et troisième dérivées (accélération et secousse), et s'adapte ainsi beaucoup mieux à la solution analytique.
RK4 est essentiellement une expansion de la série Taylor de l'équation différentielle qui définit l'accélération en termes de déplacement et de vitesse. Cela vous permet d'intégrer des forces qui dépendent de ces quantités, comme dans les contraintes et même la gravitation universelle. Les extensions de la série Taylor sont utiles dans la programmation car les ordinateurs peuvent les évaluer très efficacement.
La
acceleration
fonction utilisée est un exemple est un simple système de ressort amorti, non gravitationnel.k
est la constante du ressort de Hooke etb
est utilisée pour amortir le système (éliminer l'énergie). Pour à peu près toutes les contraintes liées aux ressorts dans votre moteur, vous voudrez les amortir car les erreurs numériques peuvent provoquer une énorme accumulation d'énergie, provoquant l'explosion de la simulation. Si vous utilisiez l'intégration d'Euler, ce serait bien pire.En ce qui concerne
acceleration()
, un moteur physique plus complet calculera les accélérations linéaires et angulaires en fonction des forces (couples). Les forces à additionner pourraient inclure la gravité (constante ou basée sur la gravitation universelle), la flottabilité et les ressorts (la plupart des contraintes peuvent être modélisées à l'aide de ressorts rigides).Il est facile de répondre à votre troisième question. En cinématique, il existe trois grandeurs de base: le déplacement (position), la vitesse et l'accélération. L'accélération est la dérivée de la vitesse, qui est la dérivée du déplacement (les deux par rapport au temps). Un dérivé est simplement la vitesse à laquelle quelque chose change.
Derivative.dx
signifie "le dérivé deState.x
".Étant donné que la simulation suppose que le ressort est ancré à l'origine et a une longueur de repos nulle, un déplacement de 100 signifie que la particule commencera à osciller. La simulation de test se termine lorsque la particule ne bouge pas et est proche de l'origine.
la source