Méthodes Numériques, 2016-2017 TP Equations différentielles
Transcription
Méthodes Numériques, 2016-2017 TP Equations différentielles
Université de Caen UFR des Sciences Méthodes Numériques, 2016-2017 TP Equations différentielles Résolution numérique avec des méthodes explicites L3 Maths Soit f : I × R → R une fonction, avec I un intervalle. On s’intéresse à la résolution numérique de l’équation différentielle y 0 (t) = f (t, y(t)) avec condition initiale y(t0 ) = y0 , (t0 ∈ I). Soit h > 0. On considère les points définis par tn = t0 + nh, n = 0, 1, 2, . . . On veut calculer une valeur approchée de y(tn ), qu’on notera yn , pour n ≥ 0. 1. Méthode d’Euler explicite : yn+1 = yn + hf (tn , yn ), n ≥ 0. Une implémentation est function y = eulerexp(t0,tf,y0,N,f) // entrees : t0,tf intervalle d’integration de la edo // N : nombre de sous intervalles // f : fonction 2nd membre ode y’ = f(t,y) a integrer // sortie : y : vecteur avec les valeurs approchees y_n ~= y(tn) h = (tf-t0)/N; // pas de temps t = linspace(t0,tf,N+1); // tableau avec les N+1 points t_n y(1) = y0; // initialisation for n=1:N, y(n+1) = y(n) + h*f(t(n),y(n)); end endfunction a) Programmer la fonction sur scilab. b) Ecrire un script pour calculer une solution approchée de y 0 (t) = −y(t), y(0) = 1, dans l’intervalle [0, 30]. Utiliser les pas de temps h = 1/2, h = 30/16 et h = 30/14. Utiliser plot2d pour représenter les solutions calculées. Comparer avec la solution exacte. Interpréter les résultats. Ind. Dans le script, programmer une fonction function z = f(t,y) ... membre de l’edo. avec le second 2. Méthode de Runge-Kutta 2 explicite (Heun, Euler modifiée) : w = yn + hf (tn , yn ), h yn+1 = yn + (f (tn , yn ) + f (tn+1 , w)) , 2 (1) a) En modifiant la function du 1., programmer la méthode de Runge-Kutta 2. On pourra compléter le programme suivant : 1 function y = RK2(t0,tf,y0,N,f) // Runge-Kutta 2 // entrees : t0,tf intervalle d’integration de la edo // N : nombre de sous intervalles // f : fonction 2nd membre ode y’ = f(t,y) a integrer // sortie : y : vecteur avec les valeurs approchees y_n ~= y(tn) h = (tf-t0)/N; // pas de temps t = ..................... // tableau avec les N+1 points t_n y(1) = y0; // cond. initiale for n=..... w = .... // calcul de w y(n+1) = y(n) + (0.5*h)*(................); end endfunction b) Tester avec l’équation différentielle du 1.b) 3. Méthode de Runge-Kutta 4 explicite : K1 = f (tn , yn ), K2 = f (tn + h/2, yn + (h/2)K1 ), K3 = f (tn + h/2, yn + (h/2)K2 ), K4 = f (tn+1 , yn + hK3 ), h yn+1 = yn + (K1 + 2K2 + 2K3 + K4 ) , 6 (2) a) En modifiant la function du 1., programmer la méthode de Runge-Kutta 4. On pourra compléter le programme suivant : function y = RK4(t0,tf,y0,N,f) // Runge-Kutta 4 // entrees : t0,tf intervalle d’integration de la edo // N : nombre de sous intervalles // f : fonction 2nd membre ode y’ = f(t,y) a integrer // sortie : y : vecteur avec les valeurs approchees y_n ~= y(tn) h = .........; // pas de temps t = linspace(t0,tf,N+1); // tableau avec les N+1 points t_n y(1) = y0; // initialisation ..... // boucle for K1 = f(t(n),y(n)); // calcul de K1 K2 = .... // calcul de K2 K3 = .... // calcul de K3 K4 = .... // calcul de K4 y(...) = ................; // calcul solution approchee end // end boucle endfunction b) Tester avec l’équation différentielle du 1.b) 2 4. Etude de l’ordre des méthodes. On considère l’équation différentielle avec condition initiale y 0 (t) = cos(2y(t)), 4t −1) La solution est y(t) = 12 arcsin (e . (e4t +1) y(0) = 0. Ecrire un script pour calculer les solutions approchées, dans l’intervalle [0, 1], avec les méthodes d’Euler explicite, Runge-Kutta 2 et Runge-Kutta 4, pour différentes valeurs de h = 1/N (par exemple, pour N = 5, 10, 20, 40, 80, 160, 320, 640). Calculer l’erreur suivante eN = |y(1) − yN |, pour chaque méthode et chaque N (i.e., on calcule l’erreur de la solution numérique à l’instant final tf = 1). Avec plot2d représenter eN en fonction de h en échelle log-log. Ind. Dans le script, on doit programmer la fonction second membre, par exemple, function z=ff(t,y) ... endfunction et la fonction avec la solution exacte, par exemple, function y=solex(t) ... endfunction On pourra compléter le code suivant : ... // a completer avec les fonctions ... // a completer avec l’initialisation de t0, tf, N=5; for i=1:8, soleuler = eulerexp(t0,tf,y0,N,ff); // calcul solution avec euler exp ........... // calcul solution avec RK2 ........... // calcul solution avec RK4 erreuler(i) = ... // calcul erreur euler .................. // calcul erreur rk2 .................. // calcul erreur rk4 h(i) = ....; // calcul du pas N = ....; // on double N end clf; // on efface la fenetre (au cas ou) // plot2d des erreurs plot2d(h,[erreuler ....... .......], logflag=’....’,style = [1,..,..]); hl = legend(([’euler exp’,’..........’,’...........’]); On pourra aussi représenter les courbes h 7→ h, h 7→ h2 et h 7→ h4 . L B H 3