Il s’agit de résoudre des EDOs (équations différentielles ordinaires), considérées comme ‘raide’. On va voir pourquoi nous qualifions ces ODEs de ‘raide’ et comment nous devrions aborder la résolution de ces types d’ODE en utilisant des méthodes numériques implicites telles que la méthode Euler implicite.
⚠️ La ressource de Pixar nous conseille d’éviter une EDO raide en reformulant notre problème dynamique. Nous nous concentrerons sur les cas où cela n’est pas possible.
EDOs raides
Après avoir cherché une définition de ‘équation différentielle ordinaire raide’ sur Internet, j’ai fini par utiliser celle de Wikipédia qui, certes pour moi, n’est pas très suffisante, mais je vais quand même vous la donne :
Une équation différentielle raide est une équation différentielle dont la sensibilité aux paramètres va rendre difficile la résolution par des méthodes numériques explicites.
Moi, je trouve que Pixar Physics Simulation Animation Course nous donne un exemple amusant sur lequel on va travailler pour mieux visualiser la définition Wikipédia. Imaginons que l’on veut simuler la dynamique d’une particule dont le changement de position se décrit par l’équation différentielle suivante :
X˙(t)=dtd(x(t)y(t))=(−x(t)−ky(t))
où k est une grande constante positive. Si k est suffisamment grande, la particule ne bougera jamais trop loin de y(t)=0 car −ky(t) fera la revenir y(t) à l’origine. On voit également que l’abscisse de la particule est plus libre de se déplacer, comme décrit par l’absence de cette grande constante positive k.
Dans cet exemple, cette EDO serait donc ‘raide’ si la variable k est si grande que la particule reste proche de la droite y=0. Comme nous le verrons dans la partie suivante, les méthodes explicites auront du mal à simuler ce comportement attendu.
Le problème avec des méthodes explicites
Rappelons que l’équation de la méthode d’Euler explicite se décrit comme suit :
Xnew=X0+hX˙(t0)
et dans cet exemple, X0=(x0y0) et X˙(t)=dtd(x(t0)y(t0))=(−x0−ky0). Alors, après la substitution :
Xnew=(x0y0)+h(−x0−ky0)
Ce qui produit la suivante :
Xnew=((1−h)x0(1−hk)y0)
Nous avons appris dans la discussion Partie 1 des méthodes numériques que pour trouver une solution, on doit prendre des petits pas dans le temps afin de s’approcher de la solution, car des pas trop grands pourront rendre le système instable. En réarrangeant les termes dans l’équation, on s’aperçoit rapidement que ces conditions doivent être remplies pour que la position de la particule décrite dans notre exemple se converge vers (0,0) :
xstep:∣1−h∣<1ystep:∣1−kh∣<1
🚨 Si nous prenons k égal à 1000 : le pas maximum permis est calculé comme suit : 1−1000h=−1=>h=0,002. Si on dépasse cette limite, l’ordonnée de la particule ne pourra jamais converger vers 0 !
Résolvez pour y en utilisant la méthode d’Euler explicite les paramètres h=0.0015 et k=1000.0dans un solveur Euler explicite que j’ai écrit, nous pouvons visualiser l’ordonnée de la particule lorsqu’elle oscille et s’approche autour de zéro :
Voici comment l’ordonnée se converge, ou plutôt se diverge, qu’on utilise une valeur h > 0.002 (h = 0.003 et k = 1000.0):
OK, nous pourrions donc utiliser un très petit pas comme h = 0.0015 n’est-ce pas ? Peut-être… cependant, on se rendrait vite compte que la valeur d’abscisse bouge trop lentement, ce qui rendra notre simulation trop lente !
Pouvons-nous faire mieux ? Pourrions-nous utiliser une méthode plus stable pour se converger plus rapidement ? Oui - avec la méthode d’Euler implicite !
Euler implicite
La méthode d’Euler implicite est la plus simple des méthodes implicites à comprendre et c’est pourquoi je vais me concentrer dessus.
Voici l’équation d’Euler implicite :
Xnew=X0+hX˙new
Si vous aviez été quelqu’un d’observateur, vous auriez vu que la différence entre l’équation d’Euler implicite et celle d’Euler explicite est que le changement d’X se définit comme hX˙∗new dans l’équation d’Euler implicite. Il faut donc résoudre ce changement en calculant X˙∗new… pour calculer enfin X_new.
En fait, c’est comme marcher à reculons.
X0=Xnew−hX˙new
Autrement dit, c’est comme si on était à la position X_new et nous aimerions reculer pour arriver à la position X0. Il faut dire qu’en anglais, Euler implicite s’appelle aussi ‘Backwards Euler’ pour cette raison.
C’est trop de résoudre X∗new, d’autant plus que nous devons aussi résoudre X˙∗new… qui nous est aussi inconnue. Voyons s’il est possible de réécrire cela dans une équation résoluble.
On commence par fournir l’équation de la méthode d’Euler implicite :
X0+ΔX=X0+hf(X0+ΔX)
où ΔX=X_new−X0. Nous pouvons l’écrire comme suit :
ΔX=hf(X0+ΔX)
💡 f(X∗0+ΔX) est inconnue, et aussi ΔX (parce que ΔX=X∗new−X∗0 contien X∗new qui est inconnue). Donc on doit faire une approximation de f(X0+ΔX) en utilisant la série de Taylor comme suit :
f(X0+ΔX)=f(X0)+ΔXf′(X0)
Voyez cette ressource pour en savoir plus sur la série de Taylor et cette dérivation exacte.
En utilisant la dernière équation, on peut réécrire notre équation pour ΔX :
ΔX=h(f(X0)+ΔXf′(X0))h1ΔX−ΔXf′(X0))=f(X0)
💡 Pour continuer, il faut rappeler que f(X0) est un vecteur et f′(X0) est une matrice. Cela est le cas grâce au calcul vectoriel :
Ce qui est intéressant, c’est qu’on peut faire un pas avec n’importe quelle amplitude ! Si l’on calcule la limite de ΔX lorsque h s’approche d’infini, on verrait que :
Donc X∗new=X0+−(X0)=(00) lorsque _h* s’approche de l’infini !
Maintenant, nous pouvons utiliser le programme que j’ai écrit pour voir cet exemple. Après avoir navigué jusqu’au dossier où vous avez téléchargé le code, exécute la commande suivante :
make
./out 0.2 1000.0 100.0 100.0
où h=0.2, k=1000.0, x0=100.0 et y0=100.0. Vous devriez voir deux fichiers implicit.txt et explicit.txt qui viennent s’ajouter au dossier. Dans implicit.txt, on voit que y se converge vers 0 !
Comments for Des méthodes numériques (Euler implicite) - Partie 3
Written by Carmen Cincotti, computer graphics enthusiast, language learner, and improv actor currently living in San Francisco, CA. Follow @CarmenCincotti