Académique Documents
Professionnel Documents
Culture Documents
Partie 1
Soient I = [0, T] un intervalle de IR et f : I × IR → IR une fonction continue et considérons le problème
suivant :
Trouver une fonction réelle de classe C1 (I) : x : t 7−→ x(t) telle que
0
x (t) = f(t, x(t)), ∀t ∈ I,
(P)
x(0) = x0 .
Si f est Lipschitzienne par rapport à la deuxième variable, le problème posé ci-dessus admet une unique
solution.
Le problème P est appelé un problème de Cauchy.
On considère tn = nh, pour n = 0, · · · , N avec h = T/N et N un entier naturel donné, une
discrétisation de I et notons xn une approximation de x(tn ).
L’ensemble {x0 , x1 , · · · , xN } représente la solution numérique de l’équation (P).
Pour résoudre P on propose d’étudier les méthodes numériques dites à un pas données par :
xn+1 = xn + hΦ(tn , xn , h)
x(0) = x0 .
| xn − x(tn ) |6 Ch, ∀n = 0, · · · , N.
function [t,x]=eulerexpli(f,x0,T,N)
h=T/N;
t=0:h:T;
x=zeros(1,N+1);
x(1)=x0;
for n=1:N
x(n+1)=x(n)+h*f(t(n),x(n));
end
Page 1 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
Méthode de Heun :
hh
( i
xn+1 = xn + f (tn , xn ) + f (tn + h, xn + hf(tn , xn )) , n = 0, · · · , N − 1,
2
x(0) = x0 .
Code Matlab de la fonction Heun
function [t,x]=heun(f,x0,T,N)
h=T/N;
t=0:h:T;
x=zeros(1,N+1);
x(1)=x0;
for n=1:N
fc=f(t(n),x(n));
x(n+1)=x(n)+h/2*(fc+f(t(n+1),x(n)+h*fc));
end
Les méthodes d’Euler explicite et de Heun sont dites explicites car elles permettent de calculer xn+1 à
partir de xn et elles sont respectivement d’ordre 1 et 2.
x(0) = 2.
2
La solution exacte est g(t) = .
1 + t2
1. Résoudre ce problème à l’aide des méthodes ( Euler explicite et Heun) pour N = 10 et N = 20.
Représenter dans chaque cas les solutions obtenues ainsi que la solution exacte sur un même
graphique. Calculer la norme de l’erreur commise par les deux méthodes
2. Pour déterminer numériquement l’ordre de convergence des deux méthodes, on considère dif-
férentes valeurs de N = 2k , k = 4, · · · , 10.
3. Représenter graphiquement en échelle logarithmique l’erreur
max | x(tn ) − xn |
06n6N
%% N=10
[t1 x1]=eulerexpli(f,2,4,10);
Page 2 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
[t1 x2]=heun(f,2,4,10);
z1=g(t1); % La solution exacte au points ti
subplot(2,1,1)
plot(t1,x1,'r',t1,x2,'b',t1,z1,'--k')
legend('Euler Explicite','Heun','Exacte');
title('Representation de la Solution pour N=10');
xlabel('Temps');
%% N=20
[t2 x3]=eulerexpli(f,2,4,20);
[t2 x4]=heun(f,2,4,20);
z2=g(t2); % La solution exacte au points ti
subplot(2,1,2)
plot(t2,x3,'r',t2,x4,'b',t2,z2,'--k')
legend('Euler Explicite','Heun','Exacte');
title('Representation de la Solution pour N=20');
xlabel('Temps');
Pour l’ordre de convergence on part du fait que si une méthode est d’ordre p alors on peut écrire
l’erreur :
e = |x(tn ) − xn | = Chp
Ainsi
ln(e) = ln(C) + p ln(h)
On trace le graphe de ln(e) en fonction de ln(h) et on déduit p.
Page 3 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
axis([0 1 0 1])
grid on
Dans cette méthode, le calcul de xn+1 est définie implicitement, à chaque étape il faut résoudre
l’équation
g(xn+1 ) = xn+1 − xn − hf(tn + h, xn+1 ) = 0
On utilise par exemple la méthode de Newton vue au TP1 et qui prend x0 = xn comme donnée initiale.
La méthode de Newton correspondante à la fonction g ci-dessus est donnée par :
function [t,x]=eulerimpli(f,df,x0,T,N)
h=T/N;
t=0:h:T;
x=zeros(1,N+1);
x(1)=x0;
prec=10^-4;
for n=1:N
x0=x(n);
x(n+1)=newtonmodif(f,df,x0,x(n),t(n+1),h,prec);
end
Page 4 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
Solution 2 close all, clear all, clc;
f=@(t,x) -t.*x.*x ; % La fonction du probleme
df=@(t,x) -2*t.*x; % La derviee
g=@(t) 2./(1+t.*t); % La solution exacte
%%
[t1 x1]=eulerimpli(f,df,2,4,10); % N=10
[t2 x2]=eulerimpli(f,df,2,4,20); % N=20
z1=g(t1);
z2=g(t2);
subplot(2,1,1)
plot(t1,x1,'r',t1,z1,'--k')
axis ([0 4 0 3])
legend('Euler Implicite','Exacte');
title('Representation de la Solution pour N=10');
xlabel('Temps');
subplot(2,1,2)
plot(t2,x2,'r',t2,z2,'--k')
axis ([0 4 0 3])
legend('Euler Implicite','Exacte');
title('Representation de la Solution pour N=20');
xlabel('Temps');
%Erreur
error1=norm(z1-x1,inf) % N=10
error2=norm(z2-x2,inf) %N=20
A-Stabilité
On va s’intéresser dans cette section au comportement de la solution numérique quand la variable tend
vers l’infini. On dira qu’une méthode numérique est absolument stable, si, pour le pas h fixé, la solution
xn du schéma reste bornée quand n tend vers l’infini. Pour évaluer cette propriété de stabilité on regarde
la réponse du schéma au problème test suivant (TLS test linéaire standard). λ > 0 un réel positif
0
x (t) = −λx(t), ∀t > 0,
P1
x(0) = x0 .
dont la solution est x(t) = x0 e−λt .
Stabilité des méthodes d’Euler :
Pour le TLS le schéma d’Euler explicite peut s’écrire sous la forme
xn+1 = xn + h(−λxn ) = (1 − λh)xn = (1 − λh)n+1 x0
Ainsi la méthode d’Euler explicite est A-stable si et seulement si h < 2/λ.
Le schéma d’Euler implicite s’écrit sous la forme :
xn+1 = xn + h(−λxn+1 ) ⇒ xn+1 = (1 + λh)−n x0
Ainsi, xn → 0 quand n → +∞, et la méthode d’Euler implicite est stable sans condition sur h.
Page 5 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
Exercice 3 Considérons le problème
x(0) = 1.
Pour T = 30, h = T/14, h = T/15 et h = T/60, visualiser les solutions obtenues à l’aide de la
méthode d’Euler Explicite. Commenter les résultats obtenus. ~
%Solution exacte
z=g(t3);
%Graphes
plot(t1,x1,'r',t2,x2,'g',t3,x3,'b',t3,z,'+k','LineWidth',2);
legend('h>2','h=2','h<2','Exacte')
%%%%%% commentaire
%%
% pour h=30/14 > 2 dans ce cas la condition de stabilite n'est pas
%satisfaite, la solution oscille et tend vers l'infini
% pour h=30/60=1/2, dans ce cas la condition de stabilite est satisfaite la ...
solution tend vers 0
Méthode de Runge-Kutta : L’objectif des méthodes de Runge-Kutta est d’augmenter l’ordre des
schémas numériques au moyen des évaluations de f(t, y(t)) intermédiaires. Les méthodes de Runge-
Kutta d’ordre 2 sont données par :
k1 = f(tk , xk )
k2 = f(tk + αh, xk + βhk1 )
xk+1 = xk + c1 hk1 + c2 hk2
avec
c1 + c2 = 1, αc1 = 1/2, βc2 = 1/2.
Page 6 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
Code Matlab de Runge-Kutta 2 pour c1 = 1/2 :
function [t x]=rung2edo(f,x0,T,N)
h=T/N;
t=0:h:T;
n=length(t);
%c1=0.5;% schema de HEUN
c1=0.5;
c2=1-c1;
alpha=0.5/c1;
beta=0.5/c2;
x=ones(n,1)*x0;
for i=1:n-1
k1=f(t(i),x(i));
k2=f(t(i)+alpha*h,x(i)+beta*h*k1);
x(i+1)=x(i)+c1*h*k1+c2*h*k2;
end
La méthode de Runge-Kutta d’ordre 4 la plus célèbre est donnée par le tableau :
0 0
1 1
2 2
0
1 1
2
0 2
0
1 0 0 1 0
1 2 2 1
6 6 6 6
k1 = f(tk , xk )
h h
k2 = f(tk + , xk + k1 )
2 2
h h
k3 = f(tk + , xk + k2 )
2 2
k4 = f(tk + h, xk + hk3 )
h
xk+1 = xk + (k1 + 2k2 + 2k3 + k4 )
6
Code Matlab de Runge-kutta 4 :
function [t x]=rung4edo(f,x0,T,N)
h=T/N;
t=0:h:T;
n=length(t);
x=ones(n,1)*x0;
for i=1:n-1
k1=f(t(i),x(i));
k2=f(t(i)+1/2*h,x(i)+1/2*h*k1);
k3=f(t(i)+1/2*h,x(i)+1/2*h*k2);
k4=f(t(i)+h,x(i)+h*k3);
x(i+1)=x(i)+1/6*h*(k1+2*k2+2*k3+k4);
end
Page 7 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
Exercice 4 : Considérons le problème suivant :
0 1
x (t) = −x(t) − cos(t) , ∀t ∈ [0, 2],
10
x(0) = 1.
%% N=16
N=16;
[t2 x3]=rung2edo(f,1,2,N);
[t2 x4]=rung4edo(f,1,2,N);
z2=g(t2);
figure(2);
plot(t2,x3,'r',t2,x4,'b',t2,z2,'+k')
legend('Runge-kutta 2','Runge-Kutta 4','Exacte');
title('Representation de la Solution pour N=16');
xlabel('N');
%% Erreurs
N=2;
err1=zeros(10,1);
err2=zeros(10,1);
for k=1:10
N=2*N;
[t yy1]=rung2edo(f,1,2,N);
[t,yy2]=rung4edo(f,1,2,N);
exact=g(t);
err1(k)=norm(yy1-exact');
Page 8 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
err2(k)=norm(yy2-exact');
end
format long;
table(err1,err2, 'VariableNames',{'Erreur Runge 2','Erreur Runge 4'})
Partie 2 rappel
Problème : on cherche à résoudre un système d’équations différentielles ordinaires (EDO, en anglais
ODE) du premier ordre :
0
x1 = f 1 (x1 , x2 , ..., xn , t)
x 0 = f (x , x , ..., x , t)
2 2 1 2 n
...
0
xn = f 3 (x1 , x2 , ..., xn , t)
avec les conditions initiales xi 0 (0) = xi0 pour i = 1...n.
Rappelons que tout système ou équation différentielle d’ordre supérieur peut se ramener simplement
à cette forme canonique, utilisée dans tous les solveurs d’EDO.
La définition d’un tel système repose sur la définition de n fonctions de n + 1 variables. Ces fonctions
devront être programmées dans une fonction MATLAB sous la forme canonique suivante :
sol = sol(:);
end
Les xi et les xi 0 sont regroupés dans des vecteurs, ce qui fait que la forme de cette fonction est
exploitable quel que soit le nombre d’équations du système différentiel.
La dernière ligne est nécessaire car la fonction doit renvoyer un vecteur colonne et non un vecteur
ligne.
Ensuite, pour résoudre cette équation différentielle, il faut appeler un solveur et lui transmettre au
minimum :
• le nom de la fonction.
• les bornes d’intégration (tmin et tmax ).
• les conditions initiales.
Le solveur fournit en sortie un vecteur colonne représentant les instants d’intégration t , et une
matrice dont la première colonne représente les x1 calculés à ces instants, la deuxième les x2 , et la
nième les xn .
L’appel du solveur prend donc en général la forme suivante :
Page 9 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
[t, y] = ode45 ('f', [tmin tmax], [y10 y20 ... yn0] );
y1 = y(:,1);
y2 = y(:,2);
...
yn = y(:,n);
plot(t, y1, t, y2) % par exemple on trace y1(t) et y2(t)
Les lignes x1 = ... servent à extraire les différentes fonctions xi dans des colonnes simples.
Les principales fonctions de MATLAB qui permettent la résolution des équations différentielles sont :
• ode23 : Méthode de Runge-Kutta d’ordre 2,3.
• ode45 : Méthode de Runge-Kutta d’ordre 4,5 (la plus utilisée)
MATLAB prend une erreur relative max de 10−4 par défaut, et qu’il est toujours possible de modifier
cette valeur, ainsi que bien d’autres paramètres grâce à la routine de gestion des options odeset.
Exercice 5 : Exemple.
On considère le problème (
y0 = 1 + y2
y(0) = 0.
% On definit la fonction
function sol=fct(x,y)
sol = 1+y.^2;
end
plot(x,y,'o',X,Y)
grid on;
legend('Solution','tan(X)')
title('EDO');
Page 10 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
xlabel('Axe des x');
ylabel('Axe des y');
%%%%%
clear all;
clc;
plot(x,y,x,z,'o')
legend('f(x)','f''(x)')
title('EDO');
xlabel('Axe des x');
ylabel('Axe des y');
Page 11 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
Solution 7 En posant x1 = y et x2 = y0 , on se ramène à la forme canonique :
(
x1 0 = x2
x2 0 = −bx2 − a(1 + εcos(t))x1
Ecrivons la fonction fct4.m définissant cette équation dans un fichier fct4.m. On passera les
paramètres de l’équation dans une directive global :
global a b epsilon
sol(1) = y(2);
sol(2) = -b*y(2) -a*(1+epsilon*cos(t))*y(1);
sol = sol(:);
end
global a b epsilon
% Parametres
a = 0.1;
b = 0.2;
epsilon=1;
% Temps final
tfinal = 5*pi;
% Conditions initiales
y01 = 1e-2;
y02 = 1e-1;
y1 = y(:,1); % Extraction de y1 et y2
y2 = y(:,2);
subplot(2,2,1)
plot(t,y1) % y1 fonction du temps
% (represente y(t) pour l'EDO originale)
subplot(2,2,2)
plot(t,y2) % y2 fonction du temps
% (repr?sente dy(t)/dt pour l'EDO originale)
subplot(2,1,2)
plot(y1,y2) % Plan y2 en fct de y1
Il est possible de définir le système d’équations différentielles à résoudre par l’intermédiaire d’une
fonction anonyme et non pas avec une fonction externe.
Avec une fonction anonyme, l’exemple précédent est résolu ainsi :
Page 12 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020
a=0.1;
b=0.2;
epsilon=1;
%
fct4= @(t,y) [y(2); -b*y(2)-a*(1+epsilon*cos(t))*y(1)];
[t,y] = ode45(fct4, [0 5*pi], [1e-2 1e-1]);
%
y1 = y(:,1); % Extraction de y1 et y2
y2 = y(:,2);
subplot(2,2,1)
plot(t,y1) % y1 fonction du temps
% (represente y(t) pour l'EDO originale)
subplot(2,2,2)
plot(t,y2) % y2 fonction du temps
% (represente dy(t)/dt pour l'EDO originale)
subplot(2,1,2)
plot(y1,y2) % Plan y2 en fct de y1
Devoir
1. Implémenter la méthode de Runge-kutta d’ordre 3 du cours.
2. Programmer la méthode Crank-Nicolson.
3. Comparer les méthodes : Runge-kutta d’ordre 2,3, 4 et Crank-Nicolson.
Page 13 de 13
A.ELGHAZI - O.NOUISSER, Date: 17 mai 2020