web-dev-qa-db-fra.com

Intégration de Runge-Kutta (RK4) pour la physique du jeu

GAFFER ON GAMES a un Great Article À propos de l'utilisation intégration RK4 pour une meilleure physique du jeu. La mise en œuvre est simple, mais les maths derrière cela me confond. Je comprends les dérivés et les intégrales sur un niveau conceptuel, mais je n'ai pas manipulé des équations dans un long moment.

Voici le franc de la mise en œuvre de GAFRER:

void integrate(State &state, float t, float dt)
{
     Derivative a = evaluate(state, t, 0.0f, Derivative());
     Derivative b = evaluate(state, t+dt*0.5f, dt*0.5f, a);
     Derivative c = evaluate(state, t+dt*0.5f, dt*0.5f, b);
     Derivative d = evaluate(state, t+dt, dt, c);

     const float dxdt = 1.0f/6.0f * (a.dx + 2.0f*(b.dx + c.dx) + d.dx);
     const float dvdt = 1.0f/6.0f * (a.dv + 2.0f*(b.dv + c.dv) + d.dv)

     state.x = state.x + dxdt * dt;
     state.v = state.v + dvdt * dt;
}

Quelqu'un peut-il expliquer en termes simples comment RK4 fonctionne? Spécifiquement, pourquoi sommes-nous en train de calculer les dérivés à 0.0f, 0.5f, 0.5f, et 1.0f? Comment la moyenne des dérivés de la moyenne est-elle allant jusqu'à la 4ème commande différente de faire une simple intégration d'Euler avec un horaire plus petit?


Après avoir lu la réponse acceptée ci-dessous et plusieurs autres articles, j'ai une compréhension sur la façon dont RK4 fonctionne. Pour répondre à mes propres questions:

Quelqu'un peut-il expliquer en termes simples comment RK4 fonctionne?

RK4 tire parti du fait que nous pouvons obtenir une bien meilleure approximation d'une fonction si nous utilisons ses dérivés d'ordre supérieur plutôt que simplement le premier ou le deuxième dérivé. C'est pourquoi la Série Taylor converge beaucoup plus rapidement que les approximations d'Euler. (Jetez un coup d'œil à l'animation sur le côté droit de cette page)

Spécifiquement, pourquoi sommes-nous en train de calculer les dérivés à 0.0f, 0.5f, 0.5f, et 1.0f?

La méthode Runge-Kutta est une approximation d'une fonction qui échantillonne des dérivés de plusieurs points dans une horodatale, contrairement à la série Taylor qui échantillonne uniquement des dérivés d'un seul point. Après avoir échantillonné ces dérivés, nous devons savoir comment peser chaque échantillon pour obtenir l'approximation la plus proche possible. Un moyen facile de faire est de choisir des constantes qui coïncident avec la série Taylor, ce qui est la manière dont les constantes d'une équation de runge-kutta sont déterminées.

Cet article le rendit plus clair pour moi. Remarquez comment (15) est l'expansion de la série Taylor tandis que (17) est la dérivation de Runge-Kutta.

Comment calculer la moyenne des dérivés jusqu'au 4ème ordre différent de faire une simple intégration d'Euler avec un horaire plus petit?

Mathématiquement, il converge beaucoup plus vite que de faire de nombreuses approximations d'Euler. Bien sûr, avec suffisamment d'approximations d'Euler, nous pouvons obtenir une précision égale à RK4, mais la puissance de calcul nécessaire ne justifie pas d'utiliser Euler.

49
Kai

Cela peut être un peu trop simplifié dans la mesure où les mathématiques réelles, mais signifiaient comme un guide intuitif de Runge Kutta l'intégration.

Donné une certaine quantité à un moment donné t1, nous voulons connaître la quantité à un autre moment t2. Avec une équation différentielle de premier ordre, nous pouvons connaître le taux de changement de cette quantité à t1. Il n'y a rien d'autre que nous pouvons savoir à coup sûr; Le reste devine.

L'intégration Euler est le moyen le plus simple de deviner: extrapoler linéairement de t1 à T2, en utilisant le taux de changement précisément connu à t1. Cela donne généralement une mauvaise réponse. Si T2 est loin de T1, cette extrapolation linéaire ne parviendra pas à une courbure dans la réponse idéale. Si nous prenons de nombreuses petites étapes de T1 à t2, nous aurons le problème de la soustraction de valeurs similaires. Les erreurs de rond-point vont ruiner le résultat.

Nous affinons donc notre devin. Une solution est d'aller de l'avant et de faire cette extrapolation linéaire de toute façon, en espérant que ce n'est pas trop loin de la vérité, utilisez l'équation différentielle pour calculer une estimation du taux de changement à t2. Ceci, en moyenne avec le taux de changement (précis) à t1, mieux représente la pente typique de la vraie réponse entre t1 et t2. Nous utilisons cela pour faire une extrapolation linéaire fraîche à partir de t1 à t2. Ce n'est pas évident que si nous devrions prendre la moyenne simple, ou donner plus de poids au taux de t1, sans faire les calculs pour estimer des erreurs, mais il y a un choix ici. En tout cas, c'est une meilleure réponse que Euler donne.

Peut-être mieux, rendre notre extrapolation linéaire initiale à un point à temps à mi-chemin entre t1 et t2 et utiliser l'équation différentielle pour calculer le taux de changement là-bas. Cela donne environ une bonne réponse que la moyenne vient de décrire. Ensuite, utilisez ceci pour une extrapolation linéaire de t1 à t2, depuis notre but de trouver la quantité à t2. C'est l'algorithme de milieu.

Vous pouvez imaginer à l'aide de l'estimation mi-virgule du taux de changement pour rendre une autre extrapolation linéaire de la quantité de t1 au milieu. Avec l'équation différentielle, nous obtenons une meilleure estimation de la pente. En utilisant cela, nous finissons par extrapoler de t1 tout le chemin à t2 Où nous voulons une réponse. C'est le Runge Kutta algorithme.

Pourrions-nous faire une troisième extrapolation au milieu? Bien sûr, ce n'est pas illégal, mais une analyse détaillée montre une diminution d'une amélioration, de sorte que d'autres sources d'erreur dominent le résultat final.

RUNGE KUTTA applique l'équation différentielle au point précisant T1, deux fois au milieu du point médian, et une fois au point final T2. Les points intermédiaires sont une question de choix. Il est possible d'utiliser d'autres points entre t1 et t2 Pour rendre ces estimations améliorées de la pente. Par exemple, nous pourrions utiliser t1, un point d'un tiers du chemin vers T2, un autre 2/3 du chemin vers t2, et à t2. Les poids de la moyenne des quatre dérivés seront différents. En pratique, cela ne vous aide pas vraiment, mais pourrait avoir une place à des tests car il devrait donner la même réponse, mais fournira un ensemble différent d'erreurs complètes.

33
DarenW

RK4 dans le sens le plus simple consiste à faire une fonction d'approximation qui est basée sur 4 dérivés et point pour chaque étape de la période: votre condition initiale au point de départ A, une première pente approximative B basée sur le point de données A à votre temps Step/2 et le pente d'une, une troisième approximation C, qui a une valeur de correction pour la pente sur B pour refléter les changements de forme de votre fonction, et enfin une pente finale basée sur la pente corrigée au point C.

Donc, fondamentalement, cette méthode vous permet de calculer à l'aide d'un point de départ, un point central moyen qui comporte des corrections intégrées aux deux parties à régler pour la forme et un point d'extrémité doublement corrigé. Cela rend la contribution effective de chaque point de données 1/6 1/3 1/3 et 1/6, la plupart de votre réponse repose sur vos corrections pour la forme de votre fonction.

Il s'avère que l'ordre d'approximation de RK (Euler est considéré comme une RK1) correspond à la manière dont sa précision échoue avec des étapes de temps plus petites.

La relation entre les approximations RK1 est linéaire, donc 10 fois la précision que vous obtenez environ 10 fois une meilleure convergence.

Pour RK4, 10 fois la précision vous donne environ 10 ^ 4 fois une meilleure convergence. Donc, alors que votre temps de calcul augmente linéairement dans RK4, il augmente votre précision polynomie.

2
Skyler

Quant à votre question Pourquoi: Je me rappelle une fois écrit un simulateur de tissu où le tissu était une série de ressorts interconnectés à des nœuds. Dans le simulateur, la force exercée par le ressort est proportionnelle à la façon dont le ressort est étiré. La force provoque une accélération au nœud, qui provoque une vitesse qui déplace le nœud qui s'étire le ressort. Il y a deux intégrales (intégration de l'accélération pour obtenir la vitesse et l'intégration de la vitesse d'intégration de la position) et s'ils sont inexacts, les erreurs Snowball: Trop d'accélération provoque une trop grande vitesse qui provoque une trop grande accélération, ce qui fait encore plus d'accélération, rendant tout le système. instable.

Il est difficile d'expliquer sans graphismes, mais je vais essayer: dites que vous avez F (t), où f(0) = 10, f(1) = 20, et f(2) = 30.

Une intégration correcte de f(t) sur l'intervalle 0 <t <1 vous donnerait la surface sous le graphique de f(t) sur cet intervalle.

L'intégration de la règle rectangle se rapproche de la surface avec un rectangle où la largeur est le delta dans le temps et la longueur est la nouvelle valeur de F (t), donc dans l'intervalle 0 <t <1, il donnera 20 * 1 = 20, et dans l'intervalle suivant 1

Maintenant, si vous deviez tracer ces points et dessinez une ligne à travers eux, vous verrez qu'il est réellement triangulaire, avec une surface de 30 (unités), et donc l'intégration Euler est inadéquate.

Pour obtenir une estimation plus précise de la surface (intégrale), vous pouvez prendre des intervalles de T, évaluer à par exemple F (0), F (0,5), F (1), f(1.5) et f (2).

Si vous me suivez toujours, la méthode RK4 est alors simplement un moyen d'estimer les valeurs de f(t) pour t0 <t <t0 + dt inventé par des personnes plus intelligentes que moi pour obtenir des estimations précises de la intégral.

(Mais comme d'autres l'ont dit, lisez l'article Wikipedia pour une explication plus détaillée. RK4 est dans la catégorie de intégration numérique )

2
Wernsey