Académique Documents
Professionnel Documents
Culture Documents
diérentielles ordinaires
Babacar LEYE
13 septembre 2019
1
1 Introduction
Dans ce chapitre, nous présentons diérentes méthodes pour résoudre nu-
mériquement les équations diérentielles. Les notions de stabilité des schémas
numériques seront aussi abordés. Les méthodes numériques pour une équation
diérentielle du premier ordre seront présentées. Certaines de ces méthodes se-
ront étendues et utilisées pour résoudre les équations diérentielles d'ordre plus
élevé et les systèmes d'équations diérentielles.
Une équation diérentielle du premier ordre s'écrit comme suit :
(1)
0
y = f (x, y), y(a) = y0 , x 0 = a ≤ x ≤ b = xn ,
où y0 est la condition initiale. On suppose que l'équation admet une unique
solution y(x) dans l'intervalle [a, b].
L'intervalle est divisé en n segments de longueur égale à h tels que
x1 = x0 + h, x2 = x0 + 2h, · · · , xn = x0 + nh.
La solution au point x0 est donnée par la condition initiale. L'objectif est de
trouver une estimation de la solution aux points x1 , x2 , ..., xn .
Les méthodes à un pas trouvent la solution approchée yi+1 au point xi+1
en extrapolant à partir de la solution approchée yi au point précédent xi . La
façon dont la nouvelle estimation est extrapolée à partir de l'ancienne dépend
spéciquement de la méthode numérique utilisée,
2
où ζi ∈]xi , xi+1 [. On rappelle, d'après l'équation (1), que y (xi ) = f (xi , yi ).
0
En notant yi = y(xi ) et yi+1 = f (xi+1 ), l'estimation yi+1 peut être trouvée via
y = zeros(x);
y(1) = y0;
h = x(2)-x(1);
n = length(x);
for i=1:n-1
y(i+1) = y(i) + h*f(x(i),y(i));
end
endfunction
3
1 1 1 1
y1 = y0 + hf (x0 , y0 ) = + 0.1f (0, ) = + 0.1( ) = 0.5250.
2 2 2 4
La solution exacte en est calculée par . Ainsi,
l'erreur relative est de 0.57 . Des calculs similaires peuvent être eectués aux
x = 0.1 yexact (0.1) = 0.522
4
Code Scilab 2.
disp(' x yEulerExplicite yExact');
h = 0.1;
x = 0:h:1;
y0 = 1/2;
exec('EulerExplicite.sci');
yEuler = EulerExplicite(f,x,y0);
yExact = yexact(x);
// Affichage
for k=1:length(x)
x_coord = x(k);
yE = yEuler(k);
yEx = yExact(k);
fprintf(' %6.2f %11.6f %11.6f \n', x_coord, yE, yEx);
end
Deux sources d'erreur existent dans la solution numérique d'une EDO : ar-
rondi et troncature. Les erreurs d'arrondi sont causée par le nombre de chires
signicatifs retenus et utilisés dans les calculs par ordinateur. Les erreurs de
troncature sont causées par la façon dont le schéma numérique approche la so-
lution, et comprennent deux parties. La première est l'erreur de troncature locale
résultant de l'application du schéma numérique à chaque étape. La deuxième
est la propagation des erreurs de troncature, causée par des approximations ef-
fectuées dans les étapes précédentes. L'erreur de troncature globale provient de
la combinaison des erreurs de troncature locales. Il peut être démontré que que
l'erreur de troncature locale est de O(h2 ), tandis que l'erreur global est de O(h).
5
2.2 Calcul des erreurs de troncature
0.525 tandis que la solution exacte est y = 0.522007. A ce stade les erreurs
0 2 1 1
e
initiale.
En x = 0.2, la valeur calculée est y = 0.543992. A la place de y , on utilise
y = 0.522007, le calcul en x est :
2 2 1
e
1 2
0 1 2 00 1 1
y(xi+1 ) = y(xi )+hy (xi )+ h y (xi )+· · ·+ hk y (k) (xi )+ h( k+1)y (k+1) (ζi ),
2! k! (k + 1)!
6
yi+1 = yi + hpk (xi , yi ), i = 0, 1, 2, · · · , n − 1,
où
1 0 1
pk (xi , yi ) = f (xi , yi ) + hf (xi , yi ) + · · · + hk−1 f (k−1) (xi , yi ).
2 k!
On observe que la méthode d'Euler explicite est une méthode de Taylor du
1er ordre. La méthode de Taylor du k -ième ordre a une erreur de troncature
locale de O(hk+1 ) et globale de O(hk ). Ainsi, plus l'ordre de la méthode est
élevée, plus précise est la solution numérique. Cependant, la réduction de l'erreur
nécessite le calcul des dérivées de f (x, y).
Exercice 2 (Méthode de Taylor du second ordre). Résoudre les problèmes des
exemples ?? et ??, en utilisant la méthode de Taylor du second-ordre avec un
pas de h = 0.1 et comparer les solutions avec celles produites par le schéma
dÉuler explicite.
Solution 2. Le problème est
0 1
2y + y = e−x , y(0) = , 0≤x≤1
2
telle que f (x, y) = 1 −x
2 (e − y) . La diérentiation par rapport à x s'écrit :
0 1 0 1 1 1
f (x, y) = (−e−x − y ) = − e−x − (e−x − y) = (−3e−x + y).
2 2 2 4
La méthode de Taylor du second ordre est dénie par
yi+1 = yi + hp2 (xi , yi ), i = 0, 1, 2, · · · , n − 1,
où
1 0
p2 (xi , yi ) = f (xi , yi ) + hf (xi , yi ).
Ainsi,
2
1 0
yi+1 = yi + h (xi , yi ) + hf (xi , yi ) .
2
Commençant par y0 = 21 , la solution numérique au point suivant x
est calculée par
1 = 0.1
1 0
y1 = y0 + h (x0 , y0 ) + hf (x0 , y0 ) = 0.521875.
2
La solution au n÷ud est 0.522007, l'erreur relative est de 0.03%,
qui est une amélioration par rapport à -0.57 obtenue avec la méthode d'Euler
x1 = 0.1
Code Scilab 3.
disp(' x yEulerExplicite yTaylor e_EulerExplicite e_Taylor');
h = 0.1;
x = 0:h:1;
y0 = 1/2;
exec('EulerExplicite.sci');
yEuler = EulerExplicite(f,x,y0);
yExact = yexact(x);
yTaylor2 = zeros(x);
yTaylor2(1) = y0;
for i=1:length(x)-1
yTaylor2(i+1) = yTaylor2(i) + h*f(x(i),yTaylor2(i))
+ (1/2)*h^2*df(x(i),yTaylor2(i));
end
for k=1:length(x)-1
x_coord = x(k);
yE = yEuler(k);
yEx = yExact(k);
yT = yTaylor2(k) ;
e_Euler = (yEx-yE)/yEx*100;
e_Taylor = (yEx-yT)/yEx*100;
fprintf(' %6.2f %11.6f %11.6f %6.2f. %6.2f \n',
x_coord, yE, yEx, e_Euler, e_Taylor);
end
8
4 Méthodes de Runge-Kutta
Dans la section précédente, nous avons vu que la méthode de Taylor d'ordre k
a une erreur de troncature globale de O(hk ), mais nécessite le calcul des dérivées
de f (x, y). La méthodes de Runge-Kutta générent la solution numérique avec
la même précision que les méthodes de Taylor sans le calcul des dérivées.
k1 = f (xi , yi ),
k1 = f (xi , yi ),
1 1
k2 = f (xi + h, yi + k1 h),
2 2
9
4.1.2 Méthode de Heun
Dans ce cas, on eectue les choix suivants :
1 1
a1 = , a2 = , b1 = 1, c11 = 1.
2 2
La méthode d'Euler améliorée s'écrit donc comme suit :
k1 = f (xi , yi ),
k2 = f (xi + h, yi + k1 h),
1
yi+1 = yi + h(k1 + k2 ). (7)
2
On dénit la fonction Heun(f,x,y0) (dans le chier Heun.sci) qui utilise
la méthode de Heun pour estimer la solution du problème de Cauchy.
Code Scilab 4.
function y = Heun(f,x,y0)
// f est une fonction représentant f(x,y)
// x est un vecteur représentant les noeuds du maillage
// y est un vecteur contenant la solution numérique sur les noeuds
y = zeros(x);
y(1) = y0;
h = x(2)-x(1);
n = length(x);
for i = 1:n-1
k1 = f(x(i) ,y(i));
k2 = f(x(i)+h,y(i)+h*k1);
y(i+1) = y(i)+h*(k1+k2)/2;
end
endfunction
10
Solution 3. On note que
f (x, y) = x2 (2 + y),
la valeur de y = y(0.1) estimée par chaque méthode de RK2 est calculée
comme suit :
1
Présenter sur un tableau les solutions approchées et les erreurs pour la mé-
n
ψ(xi , yi ) = a1 k1 + a2 k2 + a3 k3 + a4 k4 ,
telle que
k1 = f (xi , yi ),
11
où aj , bj , b1 et cij sont des constantes, chacune spécique à une méthode de
RK4. Seule la méthode de RK4 sera présentée ici. L'erreur de troncature locale
est de O(h5 ) et l'erreur globale est de O(h4 ). La méthode de RK4 classique est
décrite par :
k1 = f (xi , yi ),
1 1
k2 = f (xi + h, yi + k1 h),
2 2
1 1
k3 = f (xi + h, yi + k2 h),
2 2
k4 = f (xi + h, yi + k3 h),
1
yi+1 = yi + h(k1 + 2k2 + 2k3 + k4 ) (9)
6
La méthode de RK4 est la plus utilisée pour la résolution des EDO, car elle
ore un meilleur rapport précision/coût dans les calculs.
La fonction Scilab RK4(f,x,y0) (dans le chier RK4.sci) utilise la méthode
de RK4 classique pour estimer la solution du problème de Cauchy.
Code Scilab 5.
function y = RK4(f,x,y0)
// f est une fonction représentant f(x,y)
// x est un vecteur représentant les noeuds du maillage
// y est un vecteur contenant la solution numérique sur les noeuds
y = zeros(x);
y(1) = y0;
h = x(2)-x(1);
n = length(x);
for i = 1:n-1
k1 = f(x(i) ,y(i));
k2 = f(x(i)+h/2,y(i)+h*k1/2);
k3 = f(x(i)+h/2,y(i)+h*k2/2);
k4 = f(x(i)+h ,y(i)+h*k3);
y(i+1) = y(i)+h*(k1+2*k2+2*k3+k4)/6;
end
endfunction
12
Exercice 4. On considère le problème suivant :
0
y − x2 y = 2x2 , y(0) = 1, 0 ≤ x ≤ 1, h = 0.1.
1. Calculer à la main l'estimation de y = y(0.1) avec la méthode de RK4
classique.
1
k1 = f (x0 , y0 ) = f (0, 1) = 0,
⇒ y1 = y0 + 16 h(k1 + 2 ∗ k2 + 2 ∗ k3 + k4 ) = 1.0010
exec('RK4.sci');
y = RK4(f,x,y0);
5 Méthodes multipas
Les méthodes multipas sont basées sur le fait qu'une meilleure estimation de
yi+1 en xi+1 peut être obtenue en utilisant l'information sur deux ou plus de
points précédents qu'un seul. Les méthodes multipas peuvent être explicites ou
implicites. Les méthodes explicites utilisent une formule explicite pour trouver
13
l'estimation. Par exemple, si une méthode explicite utilise deux points précé-
dents, l'estimation de yi+1 en xi+1 est de la forme
1
yi+1 = yi + hf (xi+1 , yi+1 ) = yi+1 = yi + h(−λyi+1 ) ⇒ yi+1 = yi .
1 + λh
Cette formule a une erreur de troncature globale de O(h).
14
6.1 Transformation en un système dEDO du premier ordre
0 00
u1 = y, u2 = y , u3 = y .
On a donc trois équations données par
0 0
u1 = y = u2
0 00
u2 = y = u3
0 000 00 0
u3 = y = 13 (y + 5y + 3y + e−x/2 ) = 31 (u3 + 5u2 + 3u1 + e−x/2 )
avec
u1 (0) = 0, u2 (0) = −1, u3 (0) = 1.
Sous forme vectorielle, on a
u1 u2 0
0
u = f (x, u), u = u2 , f = u3 , u0 = −1
u3 1 −x/2 1
3 (u3 + 5u2 + 3u1 + e )
u1 = x1 , u2 = x2 , u3 = ẋ1 .
Il y a donc trois équations d'état
15
u̇1 = ẋ1 = u3 ,
u̇2 = ẋ2 = 2(x1 − x2 ) = 2(u1 − u2 ),
u̇3 = ẍ = −2ẋ1 − 2(x1 − x2 ) + e−t sin t = −2u3 − 2(u1 − u2 ) + e−t sin t,
où
u1 (0) = 0, u2 (0) = 0, u3 (0) = 1.
Sous forme vectorielle,
u1 u3 0
u̇ = f (t, u), u = u2 , f = 2(u1 − u2 ) , u0 = 0 .
u3 −2u3 − 2(u1 − u2 ) + e−t sin t 1
la suite.
Solution 5. Le problème a été transformé en un système d'EDO comme suit
u1 u2 0
0
u = f (x, u), u = u2 , f = u3 , u0 = −1 .
u3 1 −x/2 1
3 (u3 + 5u2 + 3u1 + e )
u1 = u0 + hf (x0 , u0 ).
Hors x 0 =0 ,
16
u2 (x0 )
f (x0 , u0 ) = u3 (x0 )
1
u3 (x0 ) + 5u2 (x0 ) + 3u1 (x0 ) + e−x0 /2
3
−1
= 1 .
1
3 1 + 5(1) + 3(0) + 1
−1
= 1
−1
Ainsi,
0 −1 −0.1
u1 = u0 + hf (x0 , u0 ) = −1 + 0.1 1 = −0.9 .
1 −1 0.9
L'étape suivante, u 2 = u1 + hf (x1 , u1 ) où
u2 (x1 )
f (x1 , u1 ) = u3 (x1 )
1 −x1 /2
3 (u3 (x1 ) + 5u2 (x1 ) + 3u1 (x1 ) + e )
−0.9
= 0.9
1 −0.1/2
3 (0.9 + 5(−0.9) + 3(−0.1) + e )
−0.9
= 0.9 .
−0.9829
Ainsi,
−0.1
−0.9
-0.1900
u2 = u1 + hf (x1 , u1 ) = −0.9 + 0.1 0.9 = −0.8100 .
0.9 −0.9829 0.8017
17
Code Scilab 6. function u=EulerSystem(f,x,u0)
u(:,1) = u0;
h = x(2)-x(1);
n = length(x);
for i = 1:n-1
u(:,i+1) = u(:,i) + h* f(x(i),u(:,i));
end
endfunction
Code Scilab 7.
deff('z=f(x,y)','z=[u(2);u(3);(u(3)+5*u(2)+3*u(1)+exp(-x/2))/3]');
exec('EulerSystem.sci');
7 Stabilité
Une méthode numérique est stable si une erreur introduite à une étape ne
se propage pas sur les étapes suivantes. Considérons, par exemple, le problème
suivant :
18
Puisque la solution exacte y(x) = y0 e−λx tend vers 0 lorsque x tend vers
l'inni, nous aimerions aussi que l'erreur tende vers 0 lorsque x tend vers l inni.
1
yi+1 = yi + hf (xi+1 , yi+1 ) = yi + h(−λyi+1 ) ⇒ yi+1 = yi .
1 + λh
Ainsi, la méthode est stable si
1
< 1 ⇒ |1 + λh| > 1 ⇒ h > 0.
1 + λh
19
8 Travaux dirigés
8.1 Méthode d'Euler explicite
2. xy + y = x, y(1) = 0, 1 ≤ x ≤ 2, h = 0.1.
0
Solution exacte : y = e . x
5. e y = x y , y(0) = , 0 ≤ x ≤ 1, h = 0.2 .
x 0
2 2 1
Solution exacte : y = e (x + 2x + 2) .
3
−1
−x 2
6. xy − y = y , y(2) = 1, 2 ≤ x ≤ 3, h = 0.1.
0
2
Exercice 3. Ecrire un script Scilab pour trouver les valeurs approchées pro-
duites par la méthode d'Euler explicite avec h = 0.2, et ensuite h = 0.1. Le
chier doit retourner un tableau les solutions estimées en 0, 0.2, 0.4, 0.6, 0.8,
1 produites dans les deux scénarios, ainsi que la valeur exacte et le pourcentage
de l'erreur globale, sur les n÷uds du maillage.
0
y − xy = x2 sin x, y(0) = 1, 0 ≤ x ≤ 1.
2. xy = x + y, y(1) = 0, 1 ≤ x ≤ 2, h = 0.1.
0
4. yy + xy = x, y(1) = 2, 1 ≤ x ≤ 2, h = 0.2.
2
0
2
21
Exercice 8. Ecrire un script Scilab qui utilise la méthode d'Euler explicite avec
et de Taylor du second ordre avec h = 0.08. Le chier doit retourner un
tableau contenant les solutions estimées en x = 0 : 0.08 : 0.8 produites dans les
h = 0.04
estimées en x = 1 : 0.1 : 2 produites dans les deux méthodes, ainsi que la valeur
exacte et le pourcentage de l'erreur globale, sur les n÷uds du maillage. Discuter
les résultats.
0 3
xy + y = x ln x, y(1) = , 1 ≤ x ≤ 2.
4
Exercice 12. Ecrire un code en Scilab qui utilise la méthode d'Euler explicite,
la méthode de Taylor d'ordre 2 et la méthode de Heun et renvoie un tableau
incluant les solutions estimées et la valeur exacte et l'erreur relative globale
obtenue avec ces trois méthode, sur tous les points de l'intervalle donné. Discuter
les résultats.
0
xy + y = xe−x/2 , y(1) = 0, 1 ≤ x ≤ 3, h = 0.2.
22
8.4 Méthode RK4
Exercice 13. Dans les problèmes de 1 à 6, pour chaque condition initiale et les
pas indiqués h, utiliser la méthode RK4 sur les deux premiers n÷uds du maillage
(au delà du point initial).
1. xy + (2x + 1)y = x, y(1) = 0.5, 1 ≤ x ≤ 2, h = 0.1
0
4. xy + 2y = x ln x, y(1) = 0, 1 ≤ x ≤ 2, h = 0.1
0
5. y + y = 0, y(0) = , 0 ≤ x ≤ 2, h = 0.2
0
3 2
Exercice 14. Ecrire un code en Scilab qui utilise la méthode d'Euler expli-
cite, la méthode de Heun et la méthode RK4 et renvoie un tableau incluant les
solutions estimées sur tous les points de l'intervalle donné.
0
y = y 2 + ex , y(0) = 0.1, 0 ≤ x ≤ 0.5, h = 0.04.
Exercice 15. Ecrire un code en Scilab qui utilise la méthode d'Euler explicite
(avec h = 0.025)), la méthode de Heun (avec h = 0.05) et la méthode RK4 (avec
h = 0.1) et renvoie un tableau incluant les solutions estimées et l'erreur relative
sur tous les points x = 1, 1.1, 1.2, 1.3, 1.4, 1.5 pour les trois méthodes. Discuter
les résultats.
0
xy = y + 2ey/x , y(1) = 0, 1 ≤ x ≤ 1.5.
Exercice 16. Ecrire un code en Scilab qui utilise la méthode d'Euler explicite
(avec h = 0.0125)), la méthode de Heun (avec h = 0.025) et la méthode RK4
(avec h = 0.1) et renvoie un tableau incluant les solutions estimées et l'erreur
relative sur tous les points x = 1 : 0.1 : 2 pour les trois méthodes. Discuter les
résultats.
0 1
(x + 1)y + y = x ln x, y(1) = , 1 ≤ x ≤ 2.
4
Exercice 17. Dans les problèmes de 1 à 4, pour chaque EDO du second ordre.
(a) Transformer en un système d'EDO du premier ordre.
(b) Appliquer les méthodes d'Euler explicite, de Heun et de RK4 pour les
systèmes, avec les pas h indiqués, pour calculer la solution estimée y , et
calculer l'erreur relative pour chaque estimation.
1
23
2. y + 3y + 2y = x + 1, y(0) = 0, y (0) = 0, 0 ≤ x ≤ 1, h = 0.1
00 0 0
F (t) est la force appliquée. On suppose que, en unités physiques, les valeurs des
1 2
paramètres sont :
2
m = 2, c1 = 1, c2 = 1, k1 = 2, k2 = , F (t) = 4e−t/2 sin t.
3
Les équations du mouvement sont exprimées comme suit :
2ẍ1 + ẋ1 + 2(x1 − x2 ) = 4e−t/2 sin(t)
ẋ2 + 32 x2 − 2(x1 − x2 ) = 0
sous les conditions initiales,
x1 (0) = 0, x2 (0) = 1, ẋ1 (0) = −1.
1. Transformer en un système d'EDO du premier ordre.
2. Ecrire un script Scilab utilisant la fonction RK4System pour résoudre
le système obtenu. Le chier doit renvoyer les courbes de x et x pour
0 ≤ t ≤ 8 sur le même graphe. Il est recommandé d'utiliser au moins 100
1 2
25
Exercice 23. On considère le système mécanique en mouvement de transla-
tion, où m est une masse, c est le coecient d'amortissement visqueux, x le
déplacement du bloc, et f = x une force de ressort non lináire, et F (t) une
3
force appliquée. On suppose que, en unités physiques, les valeurs des paramètres
s
sont :
1
m= , c = 0.75, F (t) = 100.
L'équation du mouvement est exprimée comme suit :
2
1
ẍ + 0.75ẋ + x3 = 100
sous les conditions initiales
2
x(0) = 0, ẋ(0) = 1.
1. Transformer en un système d'EDO du premier ordre.
2. Ecrire un script Scilab utilisant la fonction RK4System pour résoudre le
système obtenu. Le chier doit renvoyer la courbe de x pour 0 ≤ t ≤ 5.
Il est recommandé d'utiliser au moins 100 points pour la régularité de la
courbe.
Exercice 24. On considère le système mécanique en mouvement de translation,
où m et m représentent les masses, k et k sont les coecients de raideur, c
est le coecient d'amortissement visqueux, x et x sont les déplacements des
1 2 1 2
blocs, et F (t) et F (t) sont les forces appliquées. On suppose que, en unités
1 2
ẍ2 − x1 + x2 = 0
26
sous les conditions initiales
1
x1 (0) = 0, x2 (0) = 1, ẋ1 (0) = , ẋ2 (0) = 1.
2
1. Transformer en un système d'EDO du premier ordre.
2. Ecrire un script Scilab utilisant la fonction RK4System pour résoudre
le système obtenu. Le chier doit renvoyer les courbes de x et x pour
0 ≤ t ≤ 30 sur le même graphe. Il est recommandé d'utiliser au moins
1 2
27