Documente Academic
Documente Profesional
Documente Cultură
É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
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 ,
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 .
6
Existence et unicité d’une solution globale
7
Existence et unicité d’une solution locale
|f (t, x) − f (t, x ∗ )| ≤ LB |x − x ∗ |.
8
Méthodes numériques de résolution
avec φ : [0, T ] × Rm × R −→ Rm
9
Méthodes numériques à un pas
10
Méthodes numériques à un pas (suite)
◮ Convergence
◮ 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é
◮ 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
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)
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)
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
[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
x (t) = 2x(t) − t 2 − 3,
′
x(0) = 2.
28
Exercice 6
1) Résoudre à la main l’équation différentielle
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