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