Pendant la semaine dernière, je relisais Physically Based Modeling — SIGGRAPH (spécifiquement, Differential Equation Basics) quand je me suis rendu compte que bien que je savais bien utiliser des méthodes numériques, j’avais du mal à expliquer quand il est nécessaire de les utiliser pour estimer des solutions aux équations différentielles du premier ordre. Alors, j’ai donc pris le temps pour apprendre à fond le sujet.
Les équations différentielles ordinaires (EDO) du premier ordre
Pour comprendre les EDOs du premier ordre, je vais commencer par une brève introduction. Les EDOs sont des fonctions inconnues qui dépendent que d’une seule variable réelle (t) qui s’écrit sous la forme :
Où y est la fonction inconnue.
On s’intéresse ici aux problèmes de Cauchys, où l’on utilise une équation différentielle avec une condition initiale :
où t0, T, et y0 sont donnés.
Les solutions analytiques
Prenons un exemple d’une équation différentielle sous la forme :
Nous pouvons donc le résoudre en séparant les variables t et y :
Ensuite, en intégrant les deux membres de l’équation sur la variable t, on obtient :
où C est la constante d’intégration.
Pour calculer cette variable C, il faut qu’on nous fournisse une valeur initiale (ce qui fait de ce problème un problème de valeur initiale)
Ajoutons une condition initiale arbitraire… en supposant que :
Notre dernier mot est :
Il existe de nombreuses méthodes possibles pour les résoudre analytiquement (ou ‘à la main’) — mais ce n’est pas le sujet de ce post. En fait, dans la plupart des cas, nous verrons des EDOs qui ne sont pas du tout faciles à calculer, voire impossibles. Dans ce cas, il est quasi nécessaire d’utiliser des méthodes numériques avec un ordinateur pour estimer de telles solutions.
Méthodes numériques
Comme je viens de dire, il existe des EDOs où ce n’est pas possible de les calculer explicitement et, ainsi, de trouver une solution analytique. Nous pouvons éviter ces calculs frustrants en utilisant des méthodes numériques afin d’approximer une solution.
Comment est-ce que ça marche ? Nous pouvons éviter de calculer l’intégrale de la dérivée en estimant la pente de la courbe par rapport à chaque pas de calcul (dans l’exemple dernier, c’est la variable t). Ainsi, on approxime la valeur de la fonction y par rapport à la variable t (ne vous inquiétez pas si cela semble déroutant, on va voir bientôt des exemples).
La méthode que je vais proposer d’étudier en premier est la méthode d’Euler. Notez bien qu’il existe d’autres méthodes plus efficaces et précisées. Cependant, la méthode d’Euler est assez facile à enseigner et c’est la raison pour laquelle j’en parle.
La méthode d’Euler
Je vous propose de regarder cet exemple sur KhanAcademy avant d’avancer.
OK… si l’on utilise notre exemple dernier :
Rappelons que nous pouvons éviter de trouver l’intégrale en estimant la pente de la courbe par rapport à chaque pas de calcul (ici, c’est la variable t). Ainsi, on approxime la valeur de la fonction y par rapport à la variable t. L’équation de la méthode Euler est la suivante :
où t0 et y0 sont les valeurs initiales de t et y à ce pas de calcul donné (avec une amplitude h). Si l’on étudie cette équation à fond, on peut voir que la fonction f(t0, y0) est la pente… ou, en langage familier, si l’on considère l’équation de droite : , c’est la partie m.
Utilisons notre équation avec une condition initiale de : ou avec chaque pas, on utilise la valeur dernière de y qu’on vient de calculer en tant que y0.
t0 | y0 | f(x,y) | y |
---|---|---|---|
0 | 1 | 1 | 1 |
0.25 | 1 | 1 | 1.25 |
0.5 | 1.25 | 1.25 | 1.56 |
0.75 | 1.56 | 1.56 | 1.95 |
1.0 | 1.95 | 1.95 | 2.44 |
Le comportement de cette courbe calculé est à peu près le même que l’équation réelle… mais pas tout à fait (on va voir pourquoi).
Pourquoi est-ce que ça marche ? Rappelons qu’une droite tangentielle à un point sur une courbe est la suivante :
C’est donc pareil de la méthode d’Euler ! On calcule à chaque point sur notre courbe approximée une estimation d’une droite tangentielle afin d’approximer le prochain point !
Néanmoins, la différence entre la vraie courbe et celle que nous venons d’approximer est évidente… surtout quand on s’en rend compte de la vraie valeur … peut-on faire mieux ? Oui ! Si l’on prend des pas plus petits, on trouverait des points approximés plus proches du vrai ! Par exemple, avec une pas de 0,025 :
t0 | y0 | f(x,y) | y |
---|---|---|---|
0 | 1 | 1 | 1 |
0.025 | 1 | 1 | 1.025 |
0.05 | 1.025 | 1.025 | 1.05 |
0.075 | 1.05 | 1.05 | 1.08 |
… | 1.0 | 2.62 | 2.62 | 2.685 |
Ainsi, avec des pas plus petits, on se rapproche de la valeur réelle, mais le prix est considérable, car il faut plus de pas afin de calculer le résultat… augmentant ainsi le temps de calcul nécessaire.
Méthode d’Euler en C
Pour conclure cette section — je vous laisse un extrait de code pour calculer les valeurs de cette méthode (NOTE: Je suis débutant en C !) :
float func(float x, float y) {
return y;
}
int main(int argc, char *argv[])
{
float h = 0.025; // step size
float x0 = 0.; // x initial condition
float y = 1.; // y initial condition
int x_approx = 2; // x that we want to approximate
while(x0 < x_approx) {
printf("X: %f, Y:%f\n", x0, y);
y = y + h * func(x0, y);
x0 = x0 + h;
}
printf("FINAL X: %f, Y:%f ", x0, y);
return 0;
}
X: 0.000000, Y:1.000000
X: 0.025000, Y:1.025000
X: 0.050000, Y:1.050625
X: 0.075000, Y:1.076891
X: 0.100000, Y:1.103813
X: 0.125000, Y:1.131408
X: 0.150000, Y:1.159693
La suite
Nous explorerons les autres méthodes et examinerons les types d’erreurs associées à chacune !