Frédéric Georges Sylvain Delvallée Groupe 229 D1 Résolution numérique des équations différentielles. Objectif. Nous désirons trouver une approximation numérique de la solution d’une équation différentielle, par différentes méthodes : Euler, Euler Vectoriel, Runge Kutta Vectoriel ordre 2. Algorithme de Euler Pour ce faire nous utilisons l’algorithme de Euler. Celui-ci utilise un point initial de la courbe et sa tangente passant par ce point. Le but est de placer un deuxième point sur cette tangente distant du premier d’un pas h. Ensuite, nous déterminons une deuxième tangente à la courbe passant par le deuxième point calculé ce qui nous permet de déterminer un troisième point distant du deuxième du même pas h. On construit la courbe d’approximation en rejoignant tout les points calculés (la courbe obtenu est une succession de droites) P0 P3 P1 P2 ε h h : pas ε : erreur Il est évident que plus le pas h sera faible plus l’erreur ε sera petite. La subtilité est donc de choisir un compromis optimal entre qualité de la courbe ainsi obtenue (erreur faible) et temps de calcul des points (fonction de la finesse du pas de calcul). Programmation On crée une table de dimension nx2 (2 coordonnées pour chaque points et n : nombre de point calculés). Nous rentrerons dans cette table le point initial (repéré P0 sur schéma précèdent) et nous créons une procédure de calcul des points suivants suivant l’algorithme suivant : xi+h x i+1 y i + y’i *h y i+1 Détail de l’exemple traité. Nous traiterons l’exemple suivant : y’(x) = 3y -3x y(0) = 1/3 La solution réelle est de la forme : x [0 , 10] A*(e3x) + x +1/3 avec A fonction des conditions initiales. Lorsque le point initial à pour ordonné y0=1/3, on a A = 0. La courbe modélisée et la solution réelle sont des droites, il y a une corrélation entre les deux courbes et aucune erreur d’approximation (cf page 1 des copies mathematica). Par contre pour une petite perturbation sur y0 (cf page 1, 2 et 3 des copies mathematica : erreur ε de 10-5 puis 10-3) on constate que le coefficient A devient ≠ 0 il apparaît une erreur d’approximation du à l’exponentielle d’autant plus importante que l’erreur l’est également mais et des proportions exponentiel. On notera que la méthode sera dite stable à la condition que A soit inférieur à 1/e3x autrement appelé critère de stabilité. Algorithme de Euler Vectoriel Cet algorithme est proche de celui d’Euler dans la façon d’appréhender la méthode. Il permet cependant d’approximer numériquement les solutions d’équations différentielles de degré supérieur à 2. La principale différence de traitement consiste dans le fait que l’on calcule des vecteurs de dimension égale au degré de l’équation différentielle initiale (on recherche y et y’). Dans la méthode d’Euler l ‘équation est de degré 1 on calcule alors un vecteur à 1 dimension (on recherche y). Programmation On crée une table de dimension nx3 (2 coordonnées pour chaque points + la dérivé en ce point et n : nombre de point calculés). Nous rentrerons dans cette table le point initial et nous créons une procédure de calcul des points suivants suivant l’algorithme suivant : xi-1 + h yi 1 y ' h * i 1 yi 1 ' yi 1 " xi yi yi ' Détail de l’exemple traité. Soit le système de départ : y’’(x) = 1+ y²(x) y’(0) = 1 y(0) = 0 x [0 , 1] On renvoie suite à notre programmation la liste de {x , y } et la liste de { x , y’ } (sur les copie mathematica est renvoyer la liste L : {x, y, y’}). On simule un perturbation sur y0 puis sur y’0. On constate que les solutions sont très peu perturbées puisque les valeurs numériques des points ne varient de quelque % (cf page 4 et 5 des copies matematica) la méthode semble plus robuste. Ensuite, on désire raffiner la solution en calculant plus de point. On obtient des courbes plus ‘raffinées’ mais on constate que la Liste L renvoyer par mathematica (cf page 5 et 6 des copies mathematica) est composée de fraction de nombres entiers ‘grands’ (temps de calcul rallonger). On comprend l’intérêt de ne pas chercher à calculer ces fractions mais peut être en donner une approximation décimale et donc des approximations supplémentaires sur la solution réelle. Algorithme de Runge Kutta d’ordre 2 Vectoriel Cet algorithme permet de pondérer la valeur calculée du taux d’accroissement de la courbe par rapport à la méthode d’Euler. En effet, l’erreur entre la courbe réelle et le point numériquement calculé est meilleure. Ce qui ce montre à l’aide du schéma suivant (x0+h , y0+h*k1) h*k2 y1 h*y’(x0) = h*k1 (xo,yo) xo h x1 = xo+h x2 = xo+2*h Programmation xi+h yi h yi ' h yi ' * * y ' y " y " 2 2 i i i 1 x i+1 yi yi ' Détail de l’exemple traité. Soit le système de départ : y’’(x) = 1+ y²(x) y’(0) = 1 y(0) = 0 x [0 , 1] De même que pour l’algorithme de Euler vectoriel, on renvoie suite à notre programmation la liste de {x , y } et la liste de { x , y’ } (sur les copie mathematica est renvoyer la liste L : {x, y, y’}). On simule un perturbation sur y0 puis sur y’0. On constate que les solutions sont très peu perturbées puisque les valeurs numériques des points ne varient de quelques % (cf page7 et 8 des copies matematica) la méthode semble tout aussi robuste. En ne calculant que quelques points (3 sur [0 ; 1]) on constate de même que la solution est de qualité est pas trop éloigné de la solution avec une subdivision en 5 de l’intervalle (cf page 9 des copies matematica). Par contre quand on essai de subdivisé cette intervalle en 7 on constate que de même que pour la méthode précédente, les nombres entiers des fractions calculées sont encore plus important que la méthode d’Euler vectoriel alors que nous avons moins subdivisé l’intervalle (7 au lieu de 10) (cf page 9 des copies matematica). En effet on a effectué un essai pour une subdivision de 10 et mathematica a alors calculé une estimation décimal des fractions. En conclusion, cette méthode de Runge Kutta vectoriel d’ordre 2 semble plus précise et plus robuste que celle d’Euler mais nécessite une approximation décimale des résultats pour devenir plus rapide.