Vous êtes sur la page 1sur 32

Outline

Méthodes numériques avec Matlab


Master Mathématiques Pour l’Entreprise
Marie Postel
Laboratoire Jacques-Louis Lions
Université Pierre et Marie Curie, Paris 6

Équations différentielles
Équations différentielles
Rappels sur la théorie
Méthodes numériques de résolution
Qu’est-ce qu’une équation differentielle
◮ Une équation reliant une fonction inconnue avec ses
dérivées.
◮ Si la fonction ne dépend que d’une variable on parle
d’équation différentielle ordinaire (EDO). Sinon, on parle
d’équations aux dérivées partielles (EDP).
◮ Exemples
1. Croissance (a > 0) ou extinction (a < 0) d’une espèce

y ′ (t) = ay (t), y (0) = y0 ,

de solution
y (t) = y0 eat .
2. Le problème du pendule
g
ϕ′′ (t) + sin ϕ(t) = 0,
L
où g > 0 est la constante gravitationnelle.
3
Passage d’une ODE scalaire à un système
 (p)
y (t) = f t, y(t), y ′ (t), . . . , y (p−1) (t)


  ′
 y(0) = y
0 Y (t) = F (t, Y (t))
y ′ (0) = y 1 peut s’écrire Y (0) = Y0
 (p−1) 0


p−1
y (0) = y0
avec
   
y(t) y0
 y ′ (t)   y1 
 0 
Y (t) =   : R 7→ R , Y0 =  ..  ∈ Rp
p
 
..
 .   . 
y (p−1) (t) y0p−1
et
 
Z2
F : R × Rp 7→ Rp
 Z3 
avec F (t, Z ) =  .
 
(t × Z ) 7→ F (t, Z ) ..
 . 
f (t, Z1 , Z2 , . . . , Zp )
Application à l’exemple du pendule
L’équation différentielle d’ordre deux
 g
 ϕ′′ (t) + sin ϕ(t) = 0,

L
 ϕ(0) = ϕ0 ,
 ′
ϕ (0) = ψ0 ,

peut s’écrire comme un système différentiel autonome du


premier ordre
 
′ ϕ0
Φ (t) = F (Φ(t)), Φ(0) = ,
ψ0

en introduisant la fonction
2 2

 F : R 7→ R
 !
Z2
Z 7→ F (Z ) = g
− sin(Z1 )


L
5
Systèmes d’équations différentielles ordinaires d’ordre 1

f : [0, T ] × RN → RN
 ′
u (t) = f (t, u) pour t ∈ [0, T ]
(P)
u(0) = u0 ∈ RN .

Cas où f (t, u) est Lipschitzienne par rapport à u uniformément


en t.
C’est-à-dire qu’il existe L telle que pour tout x, x ∗ ∈ Rm , et
t ∈ [0, T ] :
|f (t, x) − f (t, x ∗ )| ≤ L|x − x ∗ |.
La constante L est la constante de Lipschitz

6
Existence et unicité d’une solution globale

Théorème de Cauchy-Lipschitz Soit T > 0, y0 ∈ Rm et f (t, x)


une fonction continue de [0, T ] × Rm dans Rm , Lipschitzienne
par rapport à x uniformément en t.
Alors il existe une unique fonction y(t) de [0, T ] dans Rm
solution de l’équation différentielle
 
y ′ (t) = f t, y(t) , y(0) = y0 .

7
Existence et unicité d’une solution locale

Si f est localement Lipschitzienne, c’est-à-dire que pour tout


B ⊂ Rm ouvert borné, x, x ∗ ∈ B, et t ∈ [0, T ], il existe L telle que

|f (t, x) − f (t, x ∗ )| ≤ LB |x − x ∗ |.

Alors il existe 0 < τ ≤ T et une unique fonction y(t) de [0, τ ]


dans Rm solution de l’équation différentielle
 
y ′ (t) = f t, y(t) , y(0) = y0 .

8
Méthodes numériques de résolution

◮ Discrétisation de l’intervalle [0, T ] :


t0 = 0 < . . . < ti < . . . < tn = T
Discrétisation uniforme : ti+1 − ti = h, avec nh = T
◮ Méthode numérique explicite à un pas : définition d’une
solution approchée ȳi ≈ y(ti ) suite de Rm

ȳi+1 = ȳi + hφ(ti , ȳi , h) pour i = 0, . . . , n − 1
ȳ0 = y0

avec φ : [0, T ] × Rm × R −→ Rm

9
Méthodes numériques à un pas

◮ Méthode consistante : φ(t, y, 0) = f (t, y).


◮ Erreur de consistance

e(ti , y, h) = u(ti+1 ) − y − hφ(ti , y, h)

où u(t) est la solution de u ′ (t) = f (t, u) avec la condition


initiale u(ti ) = y.
◮ Ordre p de la méthode :

E (h) = max ||e(ti , y, h)|| ≤ Khp+1


i

avec K indépendant de ti et y pour y dans un borné.

10
Méthodes numériques à un pas (suite)

◮ Convergence

E(h) = max ||y(ti ) − ȳi || → 0 quand h → 0


i=0,..n

◮ Stabilité
ȳi+1 = ȳi + hφ(ti , ȳi , h) avec ȳ0 donné
z̄i+1 = z̄i + hφ(ti , z̄i , h) + ǫi avec z̄0 donné

Le schéma est dit stable s’il existe une constante M ne


dépendant que de φ telle que
n
!
X
max ||ȳi − z̄i || ≤ M ||ȳ0 − z̄0 || + ||ǫi ||
i=0,..n
i=0
Deux résultats fondamentaux

◮ Une méthode à un pas consistante et stable est


convergente. Si f ∈ C p ([0, T ] × Rn ) et si le schéma est
d’ordre p alors l’erreur globale de discrétisation est en
O(hp )
◮ Si φ : [0, T ] × RN × [0, h∗ ] → RN est lipschitzienne en y
uniformément par rapport à t et h alors le schéma est
stable.
Exemples de schémas numériques
◮ Euler explicite

ȳ0 = y0
ȳi+1 = ȳi + hf (ti , ȳi ) pour i = 0, 1, ...n − 1
◮ Runge Kutta, deuxième ordre


 ȳ0 = y0
k1 = f (ti , ȳi )

 k2 = f (ti + h/2, ȳi + hk1 /2)

ȳi+1 = ȳi + hk2 pour i = 0, 1, ...n − 1

◮ Runge Kutta d’ordre 4




 ȳ0 = y0
 k1 = f (ti , ȳi )



k2 = f (ti + h/2, ȳi + hk1 /2)


 k 3 = f (ti + h/2, ȳi + hk2 /2)
k = f (ti + h, ȳi + hk3 )


 4


ȳi+1 = ȳi + h(k1 + 2k2 + 2k3 + k4 )/6 pour i = 0, 1, ...n − 1
13
Exemples de schémas numériques implicites

◮ Euler implicite

ȳ0 = y0
ȳi+1 = ȳi + hf (ti+1 , ȳi+1 ) pour i = 0, 1, ...n − 1

◮ Crank–Nicholson

ȳ0 = y0
ȳi+1 = ȳi + h2 f (ti , ȳi ) + h2 f (ti+1 , ȳi+1 ) pour i = 0, 1, ...n − 1

◮ À chaque pas de temps on doit résoudre une équation


non-linéaire (si la fonction f est non-lineaire) pour
déterminer ȳi+1 en fonction de ȳi .
Mise en oeuvre Matlab

y ′ (t) = ay(t), clear
EDO
y(0) = y0 close all
Solution y(t) = y0 eat . a=-1 ;
y0=1 ;
T=1 ;
n=10 ;
h=T/n ;
t=[0 :n]*h ;
ye=y0*exp(a*t) ;
ybar=y0*ones(1,n+1) ;
for i=1 :n
ybar(i+1)=(1+h*a)*ybar(i) ;
end
plot(t,ye,’b-’,t,ybar,’r-o’)
title(’Schéma d’’Euler explicite’)
legend(’exacte’,’Euler’)

15
Script 2. Fonction second membre

clear
close all
% definition de la solution exacte
yexacte=inline(’exp(t)’);
% definition de la fonction second membre
f=inline(’y’,’t’,’y’) ;
T=1 ; n=10 ; h=T/n ; t=[0 :n]*h ;
ye=yexacte(t) ;
ybar=yexacte(t(1))*ones(1,n+1) ;
for i=1 :n
ybar(i+1)=ybar(i)+h*f(t(i),ybar(i)) ;
end
plot(t,ye,’b-’,t,ybar,’r-o’)
title(’Schéma d’’Euler explicite’)
legend(’exacte’,’Euler’)

16
Script 3. Fonctions second membre multiples

clear
% definition of exact solutions
yexacte0=inline(’exp(t)’) ;
f0=inline(’y’,’t’,’y’);

yexacte1=inline(’(t+1).*exp(-t)’);
f1=inline(’-t.*y./(t+1)’,’t’,’y’);

yexacte2=inline(’1.0./(1-t)’) ;
f2=inline(’y.*y’,’t’,’y’) ;

yexacte3=inline(’sin(t)’) ;
f3=inline(’sqrt(1-y.*y)’,’t’,’y’);

17
Fonctions second membre multiples (2)

T=.9 ; n=100 ; h=T/n ; t=[0 :n]*h ;


% choix du cas test
sol=yexacte2 ;
fun=f2 ;

ye=sol(t) ;
ybar=sol(t(1))*ones(1,n+1) ;
for i=1 :n
ybar(i+1)=ybar(i)+h*fun(t(i),ybar(i)) ;
end
plot(t,ye,’b-’,t,ybar,’r-o’)
title(’Schéma d’’Euler explicite’)
legend(’exacte’,’Euler’)

18
Script 4 - Vérification de l’ordre d’un schéma

clear
NbDisc=10 ; % Nombre de discrétisations à tester
T=1. ;
% espacement uniforme dans une échelle logarithmique
N=round(5*logspace(1,3,NbDisc));
ER=zeros(1,NbDisc) ;
for i=1 :NbDisc
ER(i)=ErreurEuler(N(i)) ;
end
loglog(T./N,ER,’b-o’,T./N,T./N,’r-’)
legend(’Erreur’,’O(h)’)
title(’vérification de l’’ordre du schéma d’’Euler’)

19
Fonctions pour le script 4
Dans le fichier ErreurEuler.m
function er=ErreurEuler(n)
T=1 ; h=T/n ; t=[0 :n]*h ;
sol=’yexacte0’ ;
fun=’f0’ ;
ybar=feval(sol,t(1))*ones(1,n+1) ;
for i=1 :n
ybar(i+1)=ybar(i)+h*feval(fun,t(i),ybar(i)) ;
end
er=abs(ybar(n+1)-feval(sol,t(n+1)));
Dans le fichier yexacte0.m
function y=yexacte0(t)
y=exp(t) ;
Dans le fichier f0.m
function dy=f0(t,y)
dy=y ;
20
Script 6. Equation du pendule

clear
close all
T=50 ;
n=1000 ;
h=T/n ;
t=[0 :n]*h ;
ybar=zeros(2,n+1) ;
ybar(1,1)=1 ;
ybar1=zeros(2,n+1) ;
ybar1(1,1)=1 ;
for i=1 :n % euler
ybar1( :,i+1)=ybar1( :,i)+h*F(t(i),ybar1( :,i))
% runge kutta
yb=ybar( :,i)+h*F(t(i),ybar( :,i))/2 ;
ybar( :,i+1)=ybar( :,i)+h*F(t(i)+h/2,yb);
end
Script 6. Equation du pendule (2)

plot(t,ybar(1, :),t,ybar(2, :),t,ybar1(1, :),...


t,ybar1(2, :))
title(’Mouvt. du pendule - comp. Euler et Runge-Kutta’)
legend(’φ (RK)’,’φ’’ (RK)’,’φ (Euler)’,’φ’’ (Euler)’)
figure
plot(ybar(1, :),ybar(2, :),ybar1(1, :),ybar1(2, :))
title(’comp. Euler et Runge-Kutta - espace des phases’)
legend(’RK’,’Euler’)

Dans le fichier F.m

function YP=F(t,Y)
YP=Y ;
YP(1)=Y(2) ;
YP(2)=-sin(Y(1)) ;
Script 7 - comparaison équation scalaire et vectorielle
yexacte3=inline(’sin(t)’) ;
f3=inline(’sqrt(1-y.*y)’,’t’,’y’);
T=10 ; n=200 ; h=T/n ; t=[0 :n]*h ;
ye=yexacte3(t) ;
ybar=yexacte3(t(1))*ones(1,n+1);
for i=1 :n
ybar(i+1)=ybar(i)+h*f3(t(i),ybar(i)) ;
end
YBAR=ones(2,n+1) ; YBAR(1,1)=0 ; YBAR(2,1)=1 ;
for i=1 :n
YBAR( :,i+1)=YBAR( :,i)+h*F1(t(i),YBAR( :,i)) ;
end
plot(t,ye,t,ybar,t,YBAR(1, :))
title(’Schéma d’’Euler explicite’)
legend(’exacte’,’Euler’,’Vect’)
figure
23
Script 7 - comparaison équation scalaire et vectorielle (2)
for i=1 :n
yb=ybar(i)+h*f3(t(i),ybar(i))/2;
ybar(i+1)=ybar(i)+h*f3(t(i)+h/2,yb) ;
end
YBAR=ones(2,n+1) ; YBAR(1,1)=0 ; YBAR(2,1)=1 ;
for i=1 :n
YB=YBAR( :,i)+h*F1(t(i),YBAR( :,i))/2 ;
YBAR( :,i+1)=YBAR( :,i)+h*F1(t(i)+h/2,YB) ;
end
plot(t,ye,t,ybar,t,YBAR(1, :))
title(’Schéma de RungeKutta ordre 2’)
legend(’exacte’,’RK scal’,’Vect’)
Dans le fichier F1.m
function YP=F1(t,Y)
YP=Y ;
YP(1)=Y(2) ; YP(2)=-Y(1) ;
Utilisation du solveur ODE de matlab

ode45, ode23, ode113, ode15s, ode23s, ode23t,


ode23tb,
La syntaxe de base :

[T,Y] = solver(odefun,tspan,y0)

Arguments d’entrée :
odefun : fonction au second membre du systeme différentiel ci
dessus f(t,y)
tspan : [t0,t1,...,tf] temps où on veut calculer la solution y
y0 : Condition initiale y(t0) (vecteur colonne n composantes)
Arguments de sortie :
T : les temps où est calculée la solution
Y : Les valeurs de la solution aux temps T

25
Script 8 - Exemple d’utilisation du solveur ODE de matlab

yexacte3=inline(’sin(t)’) ;
f3=inline(’sqrt(1-y.ˆ 2)’,’t’,’y’) ;
T=2 ; n=100 ; h=T/n ; t=[0 :n]*h ;
ye=yexacte3(t) ;
[ty,ybar] =ode23(f3,[0,T],0) ;
Y0(1,1)=0 ; Y0(2,1)=1 ;
[ TY,YBAR ] =ode23(@F1,[0,T],Y0) ;
hold on
plot(t,ye,’b’)
plot(ty,ybar,’rx’)
plot(TY,YBAR( :,1),’go’)
title(’Solveur ODE de MATLAB’)
legend(’exacte’,’scalaire’,’Vect’)

26
Script 9 - Etude de la stabilité
yexacte3=inline(’sin(t)’) ;
T=20 ; n=400 ; h=T/n ; t=[0 :n]*h ;
ye=yexacte3(t) ;
YBAR=ones(2,n+1) ;
YBAR(1,1)=0 ; YBAR(2,1)=1 ;
for i=1 :n
YBAR( :,i+1)=YBAR( :,i)+h*F1(t(i),YBAR( :,i)) ;
end
Timp=100 ; nimp=2000 ; h=Timp/nimp ; timp=[0 :nimp]*h ;
yeimp=yexacte3(timp) ;
YBARimp=ones(2,nimp+1) ;
YBARimp(1,1)=0 ; YBARimp(2,1)=1 ; for i=1 :nimp
YBARimp(2,i+1)=(YBARimp(2,i)-h*YBARimp(1,i))/(1+hˆ 2)
YBARimp(1,i+1)=YBARimp(1,i)+h*YBARimp(2,i+1);
end
plot(timp,yeimp,t,YBAR(1, :),timp,YBARimp(1, :))
title(’Schémas d’’Euler explicite et implicite’)
legend(’exacte’,’explicite’,’implicite’)

27
Exercice 5

1) Résoudre à la main l’équation différentielle

x (t) = 2x(t) − t 2 − 3,
 ′

x(0) = 2.

2) Ecrire un script Matlab pour calculer numériquement la


solution avec le schéma d’Euler et comparer avec la solution
exacte. Représenter les deux solutions sur l’intervalle [0, 2] sur
le même graphe.
3) Même question avec le schéma de Runge-Kutta d’ordre 4.
4) Même question avec le solveur ode45 de Matlab.
5) Vérifier numériquement l’ordre de convergence des
schémas d’Euler et Runge-Kutta.

28
Exercice 6
1) Résoudre à la main l’équation différentielle

x (t) = 2x(t) − 3y(t) + 3et ,


 ′

y (t) = −x(t) + y(t) − et ,

 ′

 x(0) = 1,
y(0) = 0.

On pourra se ramener à une équation différentielle d’ordre 2 à


1 inconnue, par élimination. 2) Ecrire un script Matlab pour
calculer numériquement la solution avec le schéma d’Euler et
comparer avec la solution exacte. Représenter les deux
solutions sur l’intervalle [0, 2] sur le même graphe, avec un
graphe poour chaque composante x et y.
3) Même question avec le schéma de Runge-Kutta d’ordre 4.
4) Même question avec le solveur ode45 de Matlab.
5) Vérifier numériquement l’ordre de convergence des
schémas d’Euler et Runge-Kutta.
29
Application à la modélisation des épidémies
◮ Les individus sains S (pour “susceptibles” en anglais)
◮ Les individus contaminés I (pour “infected” en anglais)
◮ Les individus soit guéris, soit morts R (pour “recovered”en
anglais)
Etude de l’évolution des effectifs de chaque catégorie en
fonction du temps S(t), I(t) et R(t).
Hypothèses :
◮ L’augmentation du groupe des contaminés est
proportionnel au nombre d’individus contaminés et
d’individus sains rSI, avec r > 0 une constante. Le nombre
d’individus sains décroı̂t inversement.
◮ La transition du groupe des individus contaminés vers le
groupe des individus “guéris” se fait proportionnellement
au nombre de contaminés aI avec une constante a. Donc
1/a mesure le temps passé dans le groupe contaminé.
◮ On néglige le temps d’incubation de la maladie, les
transitions du groupe S au groupe I sont instantanées.
30
Modèle de Kermack-McKendrick

dS


 = −rSI,
 dt


dI
(SIR) = rSI − aI, (1)
 dt
 dR = aI.



dt
Pour une population donnée N = S + I + R constante, la
propagation de l’épidémie varie suivant les valeurs des
constantes r et a et des conditions initiales

 S(0) = S0 ,
I(0) = I0 = N − S0 , (2)
R(0) = 0.

31
Exercice 3
1. Résoudre le système (SIR) avec le schéma de
Runge-Kutta d’ordre 4. Paramétriser le programme de
manière à pouvoir faire varier facilement les coefficients et
les conditions initiales.
2. Tracer sur le même graphe l’évolution des trois groupes en
fonction du temps
3. Pour a, r et N fixés, faire varier S0 et I0 et à chaque fois
tracer I(t) en fonction de S(t). Qu’observe-t-on ?
dI
4. Un peu de maths... Calculer dS et intégrer. Quel est le
nombre maximum de personnes contaminés au cours de
l’épidémie, en fonction de N et ρ = a/r . Retrouver ce
résultat sur les simulations numériques précédentes.
dS
5. Calculer dR et intégrer. En déduire une équation
différentielle scalaire pour R uniquement. Intégrer
numériquement.
6. Un exemple vécu dans un pensionnat de garçons en
Angleterre en 1978 : N = 763, S0 = 762, I0 = 1, ρ = 202,
r = 2.18 × 10−3 /jour. Tracer S et I en fonction du temps. 32