Méthodes Numérique - ch4
Méthodes Numérique - ch4
Chapitre 4
4.1 Introduction
Soit le problème de Cauchy
𝑑𝑦
𝑦′ = = 𝑓(𝑡, 𝑦)
(1) { 𝑑𝑡
𝑦(𝑡0 ) = 𝑦0
Où 𝑓 : [𝑡0 , 𝑡𝑁 ] × 𝐼𝑅 → 𝐼𝑅 . Le problème de Cauchy doit satisfaire les conditions qui assurent
l’existence et l’unicité de la solution (théorique) de ce problème :
L’objectif de ce chapitre est décrire un certain nombre de méthodes permettant de résoudre
numériquement le problème de Cauchy :
Etant donne une subdivision 𝑡0 < 𝑡1 < ⋯ < 𝑡𝑁 = 𝑡0 + 𝑇 de [𝑡0 , 𝑡0 + 𝑇], on cherche à
déterminer des valeurs approchées 𝑦0 , 𝑦1 , … , 𝑦𝑁 des valeurs 𝑦(𝑡𝑛 ) prises par la solution exacte
𝑦. On notera les pas successifs.
ℎ𝑛 = 𝑡𝑛+1 − 𝑡𝑛 , 0≤𝑛 ≤𝑁−1
Et ℎ𝑚𝑎𝑥 = 𝑚𝑎𝑥(ℎ𝑛 )le maximum des pas
On appelle méthode à un pas une méthode permettant de calculer 𝑦𝑛+1 à partir de la seule
valeur antérieure 𝑦𝑛 . Une méthode à 𝑟 pas est au contraire une méthode où le calcul de 𝑦𝑛+1
nécessite la mémoration des valeurs𝑦𝑛 , 𝑦𝑛−1 , … , 𝑦𝑛−𝑟+1.
Ce chapitre est limité aux méthodes numériques à un pas.
Les méthodes à un pas sont les méthodes de résolution numérique qui peuvent s’écrire sous la
forme : 𝑦𝑛+1 = 𝑦𝑛 + ℎ𝑛 𝑓(𝑡𝑛 , 𝑦𝑛 , ℎ𝑛 ). 0≤𝑛≤𝑁
Où 𝑓 ∶ [𝑡0 , 𝑡0 + 𝑇] × 𝐼𝑅 × 𝐼𝑅𝐼𝑅 est une fonction que l’on supposera continue.
Dans toutes les méthodes numériques développées par la suite, on subdivise l’intervalle
(𝑡0 +𝑇)−𝑡0 𝑇
(𝑡0 , 𝑡0 + 𝑇) en 𝑁 intervalles de longueur ℎ = =𝑁, limités par les points
𝑁
𝑡𝑛 = 𝑡0 + 𝑛ℎ, 0 ≤ 𝑛 ≤ 𝑁.
En 𝑡0 on connait 𝑦0 , donc aussi 𝑦′(𝑡0 ) = 𝑓(𝑡0 , 𝑦0 ).Si 𝑦(𝑡) est la solution exacte de (1).
𝑦1 = 𝑦0 + ℎ𝑓(𝑡0 , 𝑦0 ).
Sur l’intervalle[𝑡1 , 𝑦1 ].
La méthode d’Euler est une méthode du premier ordre, c’est –à-dire que l’erreur au point 𝑡𝑛
s’exprime par l’inégalité
|𝑦𝑖 − 𝑦(𝑡𝑖 )| ≤ 𝑘ℎ
Où 𝑦𝑛 est la valeur approchée définie par l’algorithme d’Euler, 𝑦(𝑡0 ) est la valeur exacte de la
solution du problème de Cauchy au point 𝑡 = 𝑡𝑖 + 𝑖ℎ, et 𝑘 une constante indépendante de i et
de h.
Remarque : l’erreur dans la méthode d’Euler est relativement importante. Elle peut être
améliorée en choisissant le pas h le plus petit, ce qui augmente considérablement le volume
des calculs à effectuer, ou en approchant la solution du problème de Cauchy par des méthodes
permettant de réduire cette erreur.
4.2.2 Méthode d’Euler modifié
ℎ2
𝑦(𝑡𝑖+1 ) = 𝑦(𝑡𝑖 + ℎ) = 𝑦(𝑡𝑖 ) + ℎ𝑦 ′ (𝑡𝑖 ) + 𝑦 ′′ (𝑡𝑖 ) + 𝑜(ℎ3 ) (1)
2!
𝑑𝑦 ′ 𝑦′(𝑡𝑖+1 )−𝑦′(𝑡𝑖 )
Or 𝑦 ′′ (𝑡𝑖 ) = = + 𝑜(ℎ)
𝑑𝑡 ℎ
ℎ2 𝑦′(𝑡𝑖+1 ) − 𝑦′(𝑡𝑖 )
𝑦(𝑡𝑖+1 ) = 𝑦(𝑡𝑖 ) + ℎ𝑦 ′ (𝑡𝑖 ) + ( + 𝑜(ℎ)) + 𝑜(ℎ3 )
2! ℎ
ℎ
𝑦𝑖+1 = 𝑦𝑖 + (𝑦 ′ (𝑡𝑖+1 ) + 𝑦′(𝑡𝑖 ))
2
ℎ
𝑦(𝑡𝑖+1 ) = 𝑦(𝑡𝑖 ) + 2 (𝑓(𝑡𝑖 , 𝑦𝑖 ) + 𝑓(𝑡𝑖+1 , 𝑦𝑖+1 )) + 𝑜(ℎ3 ) (2)
Remarquons que cette formule ne donne pas yi+1 explicitement. Pour surmonter ce problème
on estime (prédit) par la méthode d’Euler. Appelons cette valeur estimée : yi+1,p. Cette valeur
peut être utilisée dans l’équation (2) pour obtenir une estimation meilleure de yi+1.
La méthode d’Euler modifié consiste donc à :
1/ prédire yi+1 par la méthode d’Euler : 𝑦𝑖+1,𝑝 = 𝑦𝑖 + ℎ𝑓(𝑡𝑖 , 𝑦𝑖 )
ℎ
2/ corriger yi+1,p par : 𝑦𝑖+1,𝑐 = 𝑦𝑖 + 2 (𝑓(𝑡𝑖 , 𝑦𝑖 ) + 𝑓(𝑡𝑖+1 , 𝑦𝑖+1,𝑝 ))
ℎ
𝑦(𝑡𝑖+1 ) = 𝑦(𝑡𝑖 ) + ℎ [𝑓(𝑡𝑖 , 𝑦(𝑡𝑖 )) + 𝑓′(𝑡𝑖 , 𝑦𝑖 )] + 𝑜(ℎ3 )
2
Ceci conduit à l’Algorithme de Taylor (d’ordre 2):
ℎ
𝑦𝑖+1 = 𝑦𝑖 + ℎ (𝑓(𝑡𝑖 , 𝑦𝑖 ) + 2 𝑓′(𝑡𝑖 , 𝑦𝑖 )) , 0≤𝑖 ≤𝑁−1
(Taylor) {
𝑡𝑖+1 = 𝑡𝑖 + ℎ
Exemples :
Soit le problème de Cauchy
𝑦 ′ = 𝑡 − 𝑦 + 1, 𝑡 ∈ [0, 1]
{ (1)
𝑦(0) = 1, ℎ = 0.1
Trouver les valeurs approchées de y(ti) pour : i=0,1,...,n, par:
1/ la méthode d’Euler
2/ la méthode d’Euler modifié
3/la méthode de Taylor
4/la méthode de Rung-Kutta-2
5/la méthode de Rung-Kutta-4
Solution
On a : 𝑦 ′ = 𝑓(𝑡, 𝑦) = 𝑡 − 𝑦 + 1, 𝑡 ∈ [0, 1]
1/ la méthode d’Euler
𝑦𝑖+1 = 𝑦𝑖 + ℎ𝑓(𝑡𝑖 , 𝑦𝑖 ), 𝑝𝑜𝑢𝑟 𝑖 = 0,1, … , 𝑛 − 1 = 9
𝑦(0) = 𝑦0 = 1
𝑦𝑖+1 = 𝑦𝑖 + ℎ(𝑡𝑖 − 𝑦𝑖 + 1)=0.9𝑦𝑖 + 0.1𝑡𝑖 + 0.1 𝑝𝑜𝑢𝑟 𝑖 = 0,1, … ,9
𝑦0 = 1
𝑦1 = 0.9𝑦0 + 0.1𝑡0 + 0.1 = 0.9(1) + 0.1(0) + 0.1 = 1.
𝑦2 = 0.9𝑦1 + 0.1𝑡1 + 0.1 = 0.9(1) + 0.1(0.1) + 0.1 = 1.010
𝑦3 = 0.9𝑦2 + 0.1𝑡2 + 0.1 = 0.9(1.01) + 0.1(0.2) + 0.1 = 1.029
𝑦4 = 0.9𝑦3 + 0.1𝑡3 + 0.1 = 0.9(1.029) + 0.1(0.3) + 0.1 = 1.056
𝑦5 = 0.9𝑦4 + 0.1𝑡4 + 0.1 = 0.9(1.056) + 0.1(0.4) + 0.1 = 1.090
𝑦6 = 0.9𝑦5 + 0.1𝑡5 + 0.1 = 0.9(1.090) + 0.1(0.5) + 0.1 = 1.131
𝑦7 = 0.9𝑦6 + 0.1𝑡6 + 0.1 = 0.9(1.131) + 0.1(0.6) + 0.1 = 1.178
𝑦8 = 0.9𝑦7 + 0.1𝑡7 + 0.1 = 0.9(1.178) + 0.1(0.7) + 0.1 = 1.230
𝑦9 = 0.9𝑦8 + 0.1𝑡8 + 0.1 = 0.9(1.230) + 0.1(0.8) + 0.1 = 1.287
𝑦10 = 0.9𝑦9 + 0.1𝑡9 + 0.1 = 0.9(1.287) + 0.1(0.9) + 0.1 = 1.349
Programme de la méthode d’Euler en FORTRAN
! Euler's method for solving an ordinary differential equation
program main
real :: a= 0.0, b= 1.0, y=1., h, t, f
integer :: n= 10, k
open(100,file='resultats.dat')
h = (b - a)/ real(n)
t=a
k=0
write(100,*)'k t y f(t,y)'
write(*,*)' k t y f(t,y)'
do k = 0,n
write(*,10)k,t,y,f(t,y)
write(100,10)k,t,y,f(t,y)
y = y + h*f(t,y)
t=t+h
end do
10 format(i3,2x,f5.2,2f11.4)
read(*,*)red
end program main
function f(t,y)
real, intent(in)::y, t
f = t-y+1
end function f
clc;
clear all;
h=0.1;
x=0:h:1;
y=zeros(1,length(x)-1);
y(1)=1;
f_xy=@(x,y) x-y+1;
for i=1:(length(x)-1)
y(i+1)=y(i)+h*f_xy(x(i),y(i))
end
sol=[y]'
function f(t,y)
real, intent(in)::y, t
f = t-y+1
end function f
Résultats du programme de FORTRAN
k, t, y, f(t,y), yp, f(t+h,yp)
0 0.0000 1.0000 0.0000 1.0000 0.1000
1 0.1000 1.0050 0.0950 1.0145 0.1855
2 0.2000 1.0190 0.1810 1.0371 0.2629
3 0.3000 1.0412 0.2588 1.0671 0.3329
4 0.4000 1.0708 0.3292 1.1037 0.3963
5 0.5000 1.1071 0.3929 1.1464 0.4536
6 0.6000 1.1494 0.4506 1.1945 0.5055
7 0.7000 1.1972 0.5028 1.2475 0.5525
8 0.8000 1.2500 0.5500 1.3050 0.5950
9 0.9000 1.3072 0.5928 1.3665 0.6335
10 1.0000 1.3685 0.6315 1.4317 0.6683
Programme de la méthode d’Euler modifier en MATLAB
clc;
clear all;
h=0.1;
x=0:h:1;
y=zeros(1,length(x)-1);
yp=zeros(1,length(x)-1);
yp(1)=1;y(1)=1;
f_xy=@(x,y) x-y+1;
for i=1:(length(x)-1)
yp(i)=y(i)+h*f_xy(x(i),y(i));
y(i+1)=y(i)+0.5*h*(f_xy(x(i),y(i))+f_xy(x(i)+h,yp(i)));
end
sol=[y]'
ℎ
𝑦𝑖+1 = 𝑦𝑖 + ℎ (𝑓(𝑡𝑖 , 𝑦𝑖 ) + 𝑓′(𝑡𝑖 , 𝑦𝑖 ))
2
Or 𝑓 ′ (𝑡, 𝑦) = 1 − 𝑦 ′(𝑡) = 1 − (𝑡 − 𝑦 + 1) = −𝑡 + 𝑦
ℎ
𝑦𝑖+1 = 𝑦𝑖 + ℎ (𝑡𝑖 − 𝑦𝑖 + 1 + (−𝑡𝑖 + 𝑦𝑖 ))
2
k, t, y, f(t,y), df(t,y)
0 0.0000 1.0000 0.0000 1.0000
1 0.1000 1.0050 0.0950 0.9050
2 0.2000 1.0190 0.1810 0.8190
3 0.3000 1.0412 0.2588 0.7412
4 0.4000 1.0708 0.3292 0.6708
5 0.5000 1.1071 0.3929 0.6071
6 0.6000 1.1494 0.4506 0.5494
7 0.7000 1.1972 0.5028 0.4972
8 0.8000 1.2500 0.5500 0.4500
9 0.9000 1.3072 0.5928 0.4072
10 1.0000 1.3685 0.6315 0.3685
Programme de la méthode de Taylor en MATLAB
clc;
clear all;
h=0.1;
x=0:h:1;
y=zeros(1,length(x)-1);
y(1)=1;
f_xy=@(x,y) x-y+1;
df_xy=@(x,y) y-x; % dérivé de f_xy
for i=1:(length(x)-1)
y(i+1)=y(i)+h*(f_xy(x(i),y(i))+0.5*h*df_xy(x(i),y(i)));
end
sol=[y]'
Résultats du programme :
i, t, y, f(t,y), k1, f(t+h,y+k1), k2
0 0.0000 1.0000 0.0000 0.0000 0.1000 0.0100
1 0.1000 1.0050 0.0950 0.0095 0.1855 0.0185
2 0.2000 1.0190 0.1810 0.0181 0.2629 0.0263
3 0.3000 1.0412 0.2588 0.0259 0.3329 0.0333
4 0.4000 1.0708 0.3292 0.0329 0.3963 0.0396
5 0.5000 1.1071 0.3929 0.0393 0.4536 0.0454
6 0.6000 1.1494 0.4506 0.0451 0.5055 0.0506
7 0.7000 1.1972 0.5028 0.0503 0.5525 0.0553
8 0.8000 1.2500 0.5500 0.0550 0.5950 0.0595
9 0.9000 1.3072 0.5928 0.0593 0.6335 0.0633
clc;
clear all;
h=0.1;
x=0:h:1;
y=zeros(1,length(x)-1);
y(1)=1;
f_xy=@(x,y) x-y+1;
for i=1:(length(x)-1)
k1=h*f_xy(x(i),y(i));
k2=h*f_xy(x(i)+h,y(i)+k1);
y(i+1)=y(i)+(1/2)*(k1+k2);
end
sol=[y]'
clc;
clear all;
h=0.1;
x=0:h:1;
y=zeros(1,length(x)-1);
y(1)=1;
f_xy=@(x,y) x-y+1;
for i=1:(length(x)-1)
k1=h*f_xy(x(i),y(i));
k2=h*f_xy(x(i)+0.5*h,y(i)+0.5*k1);
k3=h*f_xy(x(i)+0.5*h,y(i)+0.5*k2);
k4=h*f_xy(x(i)+h,y(i)+k3);
y(i+1)=y(i)+(1/6)*(k1+2*k2+2*k3+k4);
end
sol=[y]'
yinit=y0
(c) On appelle ode45 on écrivant :
[t,y]=ode45(f,deltat,yinit);
- t: vecteur contenant les instants auxquels la solution a été calculée,
- y : vecteur contenant la solution de l’équation différentielle
(d) on fait la représentation graphique de la solution en fonction de t à l’aide de
plot(t,y).
Le programme equadiff permettant de réaliser les différentes étapes est :
clc; clear all; close all;
f=@(t,y)t-y+1;
ti=0;
tf=1;
y0=1;
[t y]=ode45(f,[0 tf],y0);
figure;
plot(t,y)
xlabel('t');
ylabel('y');
grid on
Les méthodes de résolution des EDO (1) : Euler, Euler modifier, Runge-kutta (2) et (4)
peuvent être généralisées pour résoudre le problème (II).
1/ Méthode d’Euler :
𝑢1,𝑖+1 = 𝑢1𝑖 + ℎ𝑓1 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) ; 𝑢10 = 𝛼1
𝑢2,𝑖+1 = 𝑢2𝑖 + ℎ𝑓2 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) ; 𝑢20 = 𝛼2
ℎ
𝑢1,𝑖+1,𝑐 = 𝑢1𝑖 + (𝑓1 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) + 𝑓1 (𝑡𝑖+1 , 𝑢1,𝑖+1,𝑝 , 𝑢2,𝑖+1,𝑝 ))
2
ℎ
𝑢2,𝑖+1,𝑐 = 𝑢2𝑖 + (𝑓2 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) + 𝑓2 (𝑡𝑖+1 , 𝑢1,𝑖+1,𝑝 , 𝑢2,𝑖+1,𝑝 ))
2
ℎ
𝑢2,𝑖+1 = 𝑢2𝑖 + ℎ (𝑓2 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) + 𝑓2′ (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ))
2
Exemple d’application :
𝑑𝑢1
= 𝑢1 𝑢2 + 𝑡 = 𝑓1 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 )
𝑑𝑡
(𝐼𝐼) 𝑑𝑢2
= 𝑡𝑢2 + 𝑢1 = 𝑓2 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 )
𝑑𝑡
{ 𝑢1 (0) = 𝑢1,0 = 1; 𝑢2 (0) = 𝑢2,0 = −1; ℎ = 0.1
Calculer u1(0.1) et u2(0.1) ?
1/ Méthode d’Euler :
𝑢1,𝑖+1 = 𝑢1𝑖 + ℎ𝑓1 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) = 𝑢1𝑖 + 0.1(𝑢1𝑖 𝑢2𝑖 + 𝑡𝑖 )
𝑢1,1 = 𝑢1,0 + 0.1(𝑢1,00 𝑢2,0 + 𝑡0 ) = 1 + 0.1(−1 + 0) = 0.9
𝑢2,𝑖+1 = 𝑢2,𝑖 + ℎ𝑓2 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) = 𝑢2𝑖 + 0.1(𝑡𝑖 𝑢2𝑖 + 𝑢1𝑖 )
𝑢2,1 = 𝑢20 + 0.1(𝑡0 𝑢2,0 + 𝑢1,0 ) = −1 + 0.1(0 + 1) = −0.9
Résultats du programme
k, t, u1, u 2, f1, f2
0 0.0000 1.0000 -1.0000 -1.0000 1.0000
1 0.1000 0.9000 -0.9100 -0.7190 0.8090
2 0.2000 0.8281 -0.8363 -0.4925 0.6608
3 0.3000 0.7788 -0.7751 -0.3037 0.5463
4 0.4000 0.7485 -0.7235 -0.1416 0.4591
5 0.5000 0.7343 -0.6790 0.0014 0.3948
ℎ
𝑢2,𝑖+1 = 𝑢2𝑖 + ℎ (𝑓2 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) + 𝑓2′ (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ))
2
𝑑𝑢1 𝑑𝑢2
𝑓1 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) = 𝑢1,𝑖 𝑢2,𝑖 + 𝑡𝑖 ; 𝑓1′ (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) = . 𝑢2,𝑖 + . 𝑢1,𝑖 = 𝑓1 . 𝑢2,𝑖 + 𝑓2 . 𝑢1,𝑖
𝑑𝑡 𝑑𝑡
𝑓1′ (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) = (𝑢1,𝑖 𝑢2,𝑖 + 𝑡𝑖 ). 𝑢2,𝑖 + (𝑡𝑖 𝑢2,𝑖 + 𝑢1,𝑖 ). 𝑢1,𝑖
𝑑𝑢2 𝑑𝑢1
𝑓2 (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) = 𝑡𝑖 𝑢2,𝑖 + 𝑢1,𝑖 ; 𝑓2′ (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) = 𝑢2,𝑖 + 𝑡𝑖 + = 𝑢2,𝑖 + 𝑡𝑖 𝑓2 + 𝑓1
𝑑𝑡 𝑑𝑡
𝑓2′ (𝑡𝑖 , 𝑢1𝑖 , 𝑢2𝑖 ) = 𝑢2,𝑖 + 𝑡𝑖 (𝑡𝑖 𝑢2,𝑖 + 𝑢1,𝑖 ) + 𝑢1,𝑖 𝑢2,𝑖 + 𝑡𝑖
Résultats du programme :
k, t, u1, u2
0 0.0000 1.0000 -1.0000
1 0.1000 0.9150 -0.9100
2 0.2000 0.8538 -0.8354
3 0.3000 0.8126 -0.7728
4 0.4000 0.7884 -0.7193
5 0.5000 0.7793 -0.6727
Résultats du programme
i, t, u1, u2, k11, k12, k21, k22
0 0.0000 1.0000 -1.0000 -0.1000 0.1000 -0.0710 0.0810
1 0.1000 0.9145 -0.9095 -0.0732 0.0824 -0.0496 0.0676
2 0.2000 0.8531 -0.8345 -0.0512 0.0686 -0.0314 0.0572
3 0.3000 0.8118 -0.7716 -0.0326 0.0580 -0.0156 0.0494
f=@(t,y)[y(2);-omega0.^2*y(1)];