TP n°2 :

APPROXIMATION D’EQUATIONS DIFFERENTIELLES

On désigne par I0 un intervalle de ú non réduit à un point et t0 un point fixé dans I; on se donne une fonction f définie et continue sur I0 ´ ú m à valeurs dans ú m, et on cherche à trouver une fonction y continue et dérivable sur l’intervalle I0, à valeurs dans ú m, telle que :

" t Î I0, y¢ (t) = f(t,y(t)) (¤)

(E)

y(t0) = y0 [$]

Ce problème (E) s’appelle un problème de Cauchy pour le système différentiel (¤) ; la condition [$] s’appelle une condition de Cauchy. Une fonction y qui vérifie ces équations est appelée une intégrale de ce système différentiel.

Dans ce TP nous nous focaliserons sur les intervalles I0 de la forme [t0,t0+T] qui seront une subdivision d’un intervalle [a,b]. Dans de nombreux exemples physiques, la variable t représente le temps ; l’instant t0 est alors appelé instant initial et la condition [$] est appelé condition initiale.

L’équation (¤) est dite du premier ordre car elle ne fait intervenir qu’une dérivée première de la fonction y.

Principes d’analyse numérique :

On désire trouver une approximation de la fonction y. On choisit des points xi (º ti) Î [a,b]. On cherche alors une approximation yi de y(xi). Il existe 2 cas :

xn-1, xn-2, ..., xn-k

yn-1, yn-2, ..., yn-k

Ce sont les méthodes à plusieurs pas.

Pour approcher (E), on choisit un ensemble fini de points x: a = x0 < x1 < ... < xN = b, et on calcule les valeurs approchées yi de y(xi). En fait, pour plus de commodité dans les calculs, on imposera aux points xi d’être équidistants. On définit le pas de l’approximation : h = (b – a) / N, alors xi = a + i*h i = 0, 1, 2, ..., N

 

LA METHODE D’EULER EXPLICITE :

En xn, la solution y de (E) vérifie : y(xn+1) = y(xn) + h.f(xn,y(xn)) + h.e (h) avec e ® 0 quand h® 0.

La méthode d’Euler explicite suggérée par cette relation consiste à approcher y(xn) par la suite yn donnée par :

y0 = a

yn+1 = yn + h.f(xn,yn)

Présentation de la fonction :

La fonction eulerexpl calcule une solution approchée du problème de Cauchy défini plus haut par la méthode d’Euler explicite. Pour approcher ce système, nous considérons l’intervalle [a,b] qui va être subdiviser en N intervalles dont le pas est noté h. f est la fonction vérifiant de système différentiel (¤) 

Soit y0 une condition initiale du problème, l’instruction [X,y]=eulerexpl(‘f’,a,b,h,y0) renvoie le vecteur X contenant les points de la subdivision, ainsi que y – la solution approchée cherchée.

 

Interprétation graphique de cette méthode :

Le point A0 est connu : A0(a,a ).

On peut donc calculer la tangente à la courbe y(x) en ce point :

la pente est donnée par y¢ (a) = f(a,a ). L’approximation consiste à

confondre la courbe et sa tangente. On remplace le point inconnu

par A1 point de même abscisse, mais situé sur la tangente T0.

De proche en proche on construira A1, A2, …, AN.

Algorithme de la fonction eulerexpl:


%fonction donnant une solution approchée d’une équation différentielle %ordinaire du premier ordre à un pas par la méthode d’Euler explicite :

function [X,y] = eulerexpl (namef,a,b,h,y0)

%namef : nom de la fonction f à 2 variables x et y vérifiant le syst. diff.

%h : pas supposé constant – il s’agit d’un réel. Si le pas est variable – %il s’agit d’un vecteur de même dimension que X

%y0 : condition initiale

%X : vecteur contenant les points de subdivision de [a,b]

%y : solution approchée de l’EDO

X=a:h:b; %points équidistants

N=length(X);

y(1,:)=y0; %le 1er itéré correspond à la condition initiale

%calcul du ième itéré :

for i=1:N-1, y(i+1,:)=y(i,:)+h*feval(namef,X(i),y(i,:)); end;


Pour gagner du temps, on peut remplacer le " feval " par la fonction elle-même soit en écrivant directement son expression calculée en (X(i),y(i,:)), soit en la définissant dans la fonction " eulerexpl " par un " inline " par exemple :


function [X,y] = eulerexpl2(a,b,h,y0)

X=a:h:b;

N=length(X);

g=inline(‘2*y’,‘x’,‘y’); %il faut bien préciser les 2 variables

y(1,:)=y0;

for i=1:N-1, y(i+1,:)=y(i,:)+h*g(X(i),y(i,:)); end;


Un exemple de comparaison de temps de calcul entre ces 2 fonctions nous est donné en page 24.

La figure 13 nous présente diverses représentations graphiques de solutions approchées d’équations différentielles du 1er ordre par la méthode d’Euler explicite ainsi que la représentation de la véritable solution obtenu par calcul sur papier. Les systèmes sont les suivants :

Nous avons choisi 2 exemples purement mathématiques alors que les 2 derniers ont été empruntés à la physique.

J Le troisième système illustre une décharge de condensateur : un circuit électrique comprenant un condensateur de capacité C = 4.10-4 F et une résistance ohmique R = 1000 W est fermé à l’instant t = 0 où la charge du condensateur est Q = 10 C. La décharge du condensateur est décrite par l’équation différentielle :

que l’on va réécrire sous la forme :  

J Enfin, le dernier exemple est le problème du parachutiste ou d’une chute en milieu résistant : un parachutiste de masse m = 70 kg est lancé à l’instant t = 0 avec une vitesse v0 = 4 m/s, on cherche sa vitesse à chaque instant sachant que la résistance k = 10 N /m de l’air est proportionnelle à sa vitesse (on pose g = 9.81 N/m²).

En considérant le principe fondamental de la dynamique, l’équation différentielle est :

Voyons voir quelle peut être l’erreur maximale commise par cette méthode :

Extrait de la feuille de commande d’une session de Matlab calculant les diverses erreurs maximales :


[X,y]=eulerexpl2(0,5,0.01,1); %Pour le 1er exemple :

" Y=(-3*exp(-X)+4).*exp(2*X); W=abs(Y-y'); E=0;

" for i=1:length(X),if W(i)>E,E=W(i);end;end

" E

E =

7.9800e+003

%Il faut relativiser cette valeur car d’après le graphe, l’erreur maximale %se situe sur la borne supérieure de l’intervalle où les 2 fonctions ont %pour valeur :

" y1=y(length(X))

y1 =

7.9681e+004

" Y1=Y(length(X))

Y1 =

8.7661e+004

%L’erreur commise est donc approximativement de 10% par rapport à ces %valeurs – ce qui est honorable.

" E/y1

ans =

0.1001

" E/Y1

ans =

0.0910

" [X,y]=eulerexpl2(pi/2,6*pi,0.01,1); %Pour le second exemple

" Y=sin(X); W=abs(Y-y'); E=0;

" for i=1:length(X),if W(i)>E,E=W(i);end;end

" E

E =

0.0824

"

" [X,y]=eulerexpl2(0,2,0.1,10); %Pour le 3ème exemple

" Y=10*exp(-X/0.4); W=abs(Y-y'); E=0;

" for i=1:length(X),if W(i)>E,E=W(i);end;end

" E

E =

0.5147

"

" [X,y]=eulerexpl2(0,40,0.1,4); %Pour le 4ème exemple

" Y=68.67+(4-68.67)*exp(-X/7); W=abs(Y-y'); E=0;

" for i=1:length(X), if W(i)>E,E=W(i);end; end

" E

E =

0.1710


Nous pouvons déjà conclure que plus le pas est petit, plus précis est le calcul approché – l’erreur est globalement divisée par 10 entre h = 0.1 et h = 0.01.

Observons alors l’influence de h sur la représentation graphique de la solution approchée – c’est ce que traite la figure 14 – pour le système suivant :

 


h = 0.1000 _ 0.0100 _ 0.0010 _ 0.0001

[E1,E2,E3,E4] = 1.1973 _ 0.1444 _ 0.0147 _ 0.0015 %Erreur maximale dans chaque cas


L’erreur dans cette méthode est due à 2 choses :

Cependant cette méthode permet de diminuer l’erreur de discrétisation lorsque h diminue – donc la limite de yn tend vers y(xn) quand h tend vers 0. C’est la convergence. Nous avons vu également en TD la notion de stabilité – c’est savoir la répercussion des erreurs globales sur les calculs. La condition de stabilité est indispensable pour traiter numériquement une équation différentielle : une petite perturbation sur les données n’entraîne qu’une petite perturbation sur la solution et ceci indépendamment de h. Nous avons vu également la notion de consistance : il faut que la méthode employée – Euler explicite ou autre – approche l’équation différentielle. Ces 3 conditions sont indispensables pour une bonne approximation de la solution d’un système différentiel.

 

METHODE D’EULER IMPLICITE :

On considère la relation : y(xn) = y(xn+1) – h y¢ (xn+1) + he (h) avec e (h)® 0 quand h® 0. Un raisonnement analogue au précédent conduit à approcher y(xn) par la suite yn solution de :

y0 = a

yn+1 = yn + h f(xn+1,yn+1)

Cette méthode est moins simple d’utilisation que la première puisqu’elle fait appel en son sein à la méthode du point fixe ; l’approximation yn étant connue, il n’est pas clair que ce système définisse yn+1 de manière unique – nous l’admettrons cependant (condition précisée au § 1.2 du TP).

Présentation de la fonction :

La fonction eulerimpl3 calcule une solution approchée du problème de Cauchy par la méthode d’Euler implicite. Pour approcher ce système, nous considérons l’intervalle [a,b] qui va être subdiviser en N intervalles dont le pas est noté h. Dans le calcul de la solution, la fonction fait appel à la méthode du point fixe dont une fonction notée pointfix lui est associée.

Soient y0 une condition initiale du problème, eps la précision demandée sur 2 yi – yi-12 2 et nmax le nombre maximale d’itérations intervenant dans la boucle du point fixe , l’instruction [X,y,erreurpf]= eulerimpl3 (a,b,h,y0,eps,nmax) renvoie le vecteur X contenant les points de la subdivision, y – la solution approchée cherchée et erreurpf : erreur à chaque pas sur la solution approchée de Y=G(Y) par la méthode du point fixe..

Algorithme des 2 fonctions utilisées:


%fonction donnant une solution approchée d’une EDO par la méthode d’Euler implicite :

function [X,y,erreurpf] = eulerimpl3(a,b,h,y0,eps,nmax);

%eps : précision demandée sur ½ yi – yi-1½

%nmax : nombre maximal d’itérations pour la méthode du point fixe

%erreurpf : on a soit erreur £ eps ou i ³ nmax

X=a:h:b; %Vecteur contenant la subdivision de [a,b]

N=length(X);

g=inline(‘2*y’,‘x’,‘y’); %par exemple

y(1,:)=y0; %le 1er itéré correspond à la condition initiale

for n=1:N-1,

y1=y(n,:); %calcul du ième itéré en faisant intervenir la boucle du

[Y,erreurpf]=pointfix(g,h,X,n,y1,eps,nmax); %point fixe

y(n+1,:)=Y;

end;


 

 


%fonction mettant en œuvre la méthode du point fixe pour la méthode d’Euler %Implicite:

function [Y,erreurpf]=pointfix(nameg,h,X,n,y1,eps,nmax);

%h:pas de la subdivision

%n=numéro de l’itéré

%y1=y(n,:)

i=0; %initialisation de la boucle " compteur "

y2=y1+h*feval(nameg,X(n+1),y1); %on calcule une 1ère fois y2 en fct de y1

y3=y1;

erreurpf=norm(y2-y1,2); %choix de la norme euclidienne

while (erreurpf>eps) & (i < nmax)

i=i+1; %incrémentation

y1=y2; %on calcule y2 en fct de y1 autant de fois qu’il faut pour que

y2=y3+h*feval(nameg,X(n+1),y1); %|y2-y1|® eps ou que i=nmax

erreurpf=norm(y2-y1,2);

end

Y=y2; %le (n+1)ème itéré est y2


Illustration :

La figure 15 reprend les mêmes exemples que la figure 13. Les résultats sont assez identiques. Nous pouvons cependant noter une défaillance de cette méthode pour le cas 2 avec le système différentiel :

 En effet, sur l’intervalle [p /2,p [ la solution approchée coïncide très bien avec la véritable solution, en revanche dès qu’on se situe dans un intervalle pour x ³ p , la solution n’existe pas. Cette méthode accepte peut être mal le passage de ln y = ln sin(x) + c à y = d*sin(x) ou bien la définition même de la fonction G(x,y) = y*cotan(x). Pour preuve, voyons la feuille de commande suivante :


" length(y1) % y1 : solution approchée par eulerimpl3 du système précédent

ans =

1728

" for i=155:163, y1(i), end,

ans =

0.0306

ans =

0.0206

ans =

0.0107 i=157

ans = Les valeurs tombent brutalement à - ¥

-Inf i=158

ans =

-Inf

ans =

-Inf

ans =

-Inf

ans =

-Inf

ans =

-Inf

" y1(1000:1002)

ans =

NaN …pour devenir inexistantes (Not-a-Number) : il y a une forme indéterminée

NaN


Comparons cependant – lorsque c’est possible – les erreurs maximales commises par cette méthode dans cette série d’exemples :


" [E1,E2,E3,E4] %Ei correspondant au cas i

ans = 9.0377e+003 _ 0.0028 _ 0.4172 _ 0.1689

"

" load l %Pour mémoire avec la méthode d’Euler explicite nous avions trouvé :

" [E1,E2,E3,E4]

ans =

7.9800e+003 _ 0.0824 _ 0.5147 _ 0.1710


On constate que cette méthode est un peu plus précise qu’Euler explicite. Nous pouvons faire également le même genre de remarque quant à l’influence du pas – la figure 16 nous le montre. Cette figure permet aussi de constater que la méthode implicite et la méthode explicite encadre de chaque côté la courbe de la véritable solution. Ici – la méthode implicite est une approximation par excès (courbe au dessus de la courbe " vraie ") alors que l’explicite est une approximation par défaut. Mais leur rôle peut s’inverser suivant le système différentiel à résoudre.

 

LA q –METHODE :

C’est une méthode qui combine les 2 méthodes précédentes.

Pour q Î [0,1] le schéma est le suivant :

y0 = b

yn+1 = yn + (1 – q ) h f(xn,yn) + q h f(xn+1,yn+1)

Pour q = 0, on retrouve la méthode d’Euler explicite, et pour q = 1, la méthode d’Euler implicite. Pour q > 0, on a une équation de point fixe à résoudre.

Présentation de la fonction :

La fonction teta calcule une solution approchée du problème de Cauchy par la q - méthode. Pour approcher le système de Cauchy, nous considérons l’intervalle [a,b] qui va être subdiviser en N intervalles dont le pas est noté h. Dans le calcul de la solution, la fonction fait appel à la méthode du point fixe dont une fonction notée pointfixe lui est associée.

Soient t une valeur de 0£ q £ 1, y0 une condition initiale du problème, eps la précision demandée sur 2 yi – yi-12 2 et nmax le nombre maximal d’itérations intervenant dans la boucle du point fixe , l’instruction [X,y]= teta (a,b,h,y0,t,eps,nmax) renvoie le vecteur X contenant les points de la subdivision, ainsi que y – la solution approchée cherchée.

Algorithme des fonctions utilisées :


%fonction donnant une solution approchée d'une EDO par la q -méthode

function [X,y] = teta (a,b,h,y0,t,eps,nmax); %0£ t£ 1

X=a:h:b; %vecteur contenant les points de équidistants de la subdivision

N=length(X);

g=inline('2*y','x','y'); %g : fonction vérifiant le syst. diff.

y(1,:)=y0; %1er itéré y’(x)=g(x,y(x))

for n=1:N-1, %calcul du (n+1)ème itéré

y1=y(n,:);

[Y,erreurpf]=pointfixe(g,h,X,n,y1,t,eps,nmax); %h:pas de la subdivision

y(n+1,:)=Y;

end;


 


%Fonction mettant en œuvre la méthode du point fixe pour la teta_méthode:

function [Y]=pointfixe(nameg,h,X,n,y1,t,eps,nmax);

i=0; %initialisation de la boucle " compteur "

y2=y1+(1-t)*h*feval(nameg,X(n),y1)+t*h*feval(nameg,X(n+1),y1);

y3=y1;

erreurpf=norm(y2-y1,2); %choix de la norme euclidienne

while (erreurpf>eps) & (i < nmax)

i=i+1;

y1=y2;

y2=y3+(1-t)*h*feval(nameg,X(n),y3)+t*h*feval(nameg,X(n+1),y1);

erreurpf=norm(y2-y1,2);

end

Y=y2;


En guise d’illustration nous avons comparer, d’abord, les temps de calculs, ainsi que le nombre d’opérations effectuées par les différentes méthodes vues jusqu’ici dans ce TP. Nous pouvons voir que la q -méthode est beaucoup plus longue que les autres du fait du nombre d’opérations à effectuer. Mais cet inconvénient devient vite un avantage si on recherche la précision du calcul. A la fin de cette session de Matlab, nous comparons les erreurs maximales commises entre la q –méthode et les formules d’Euler (E1 et E3 : elles coincident parfaitement – cf. figure 17) et entre la q -méthode et la véritable solution (E2 et E4).

Le système à résoudre est :


%Comparaison des temps de calcul de diverses méthodes et des erreurs maximales:

" %Explicite:

" flops(0);tic,[X,y]=teta(0,pi,0.0005,0,0,0.000001,10000);toc,disp(flops)

elapsed_time =

44.0500

175841

" flops(0);tic,[X,ye]=eulerexpl2(0,pi,0.0005,0);toc,disp(flops)

elapsed_time =

4.5000 %on remplace le " feval " par la fonction cos(X) directement

18868 %dans la fonction eulerexpl2

" flops(0);tic,eulerexpl('f',0,pi,0.0005,0);toc,disp(flops)

elapsed_time =

5.8200 %pour le même nbre d’opérations le " feval " ralentit le

18868 %temps de calcul

%Erreur maximale :

" E1=0;W=abs(y-ye);for i=1:length(X), if W(i)>E1, E1=W(i); end;end;

" E2=0;W=abs(y-sin(X)');for i=1:length(X), if W(i)>E2, E2=W(i); end;end;

" %Implicite:

" flops(0);tic,[X,y]=teta(0,pi,0.0005,0,1,0.000001,10000);toc,disp(flops)

elapsed_time =

46.3000

175841

"flops(0);tic,[X,yi,e]=eulerimpl3(0,pi,0.0005,0,0.000001,10000);toc,

disp(flops)

elapsed_time =

26.8600

113051

%Erreur maximale :

" E3=0;W=abs(y-yi);for i=1:length(X), if W(i)>E3, E3=W(i); end;end;

" E4=0;W=abs(y-sin(X)');for i=1:length(X), if W(i)>E4, E4=W(i); end;end;

%Affichage des erreurs maximales obtenues :

" [E1 E2 E3 E4]

ans =

1.0e-003 *

0 _ 0.5000 _ 0 _ 0.5000


On enlèverait la valeur absolue dans le calcul d’erreur, on verrait que E2 = - E4, i.e. que la q - méthode enveloppe la vraie solution.

Voyons pour finir l’influence du q sur le calcul de la solution du système précédent : cf. figure 18.

Nous pouvons affirmer que la q -méthode permet une approximation plus fine que les méthodes d’Euler. En effet, il faut d’abord remarquer que la vraie solution du problème se trouve dans l’espace délimité par les solutions des 2 méthodes d’Euler. D’autre part, suivant la valeur de q , la solution obtenue par la q -méthode balaye cet espace, donc il existe un q (» 0.5) pour lequel cette solution coïncide avec la solution vraie.

 

LA METHODE DU DEVELOPPEMENT DE TAYLOR (ordre 2)

Les méthodes du développement de Taylor vérifient les hypothèses que nous avons faites pour les méthodes à un pas (consistance, stabilité, convergence); malheureusement elles présentent de graves inconvénients du point de vue pratique. En effet, au lieu d’utiliser une seule fonction f nous avons besoin des p fonctions f, f(1), f(2), ..., f(p–1) ce qui mobilise un nombre excessif de mémoires. De plus, lorsque k croît, la complexité des expressions analytiques des fonctions f(k) augmentent énormément. Ces méthodes sont donc en général à éviter sauf peut–être dans des cas très simples (équations linéaires à coefficients constants).

 

METHODES DE RUNGE – KUTTA :

L’avantage des ces méthodes, c’est qu’elles donnent une précision similaire à la méthode de Taylor mais elles ne nécessitent pas de calculs de dérivées de f.

On considère la relation vérifiée par y solution de (E) :

Ces méthodes sont définies par la donnée du tableau et de la suite suivante :

Si la matrice A est strictement triangulaire inférieure, i.e. si i£ j Þ aij = 0, la résolution du système est immédiate : on a yn,1 = yn, on obtient yn,2 à partir de yn et yn,1, yn,3 à partir de yn, yn,1, yn,2 etc... On dit dans ce cas que la méthode de Runge-Kutta est explicite : c’est le cas des méthodes données aux exemples 1, 2 & 3 du TP.

Si la matrice A est triangulaire inférieure, i.e. si i<j Þ aij = 0, la résolution se ramène à résoudre successivement q fois une équation à une inconnue, la méthode de Runge-Kutta est dite alors semi-implicite ; numériquement la résolution est plus facile que dans le cas général où on a un système de q équations à q inconnues. Dans le cas général, on parle de méthode de Runge-Kutta implicite.

Présentation de quelques fonctions :

La fonction rk44 calcule une solution approchée du problème de Cauchy par la méthode de Runge-Kutta à l’ordre 4, c’est la méthode classique. Pour approcher le système différentiel, nous considérons l’intervalle [a,b] qui va être subdiviser en N intervalles dont le pas constant est noté h.

Soient y0 une condition initiale et R le tableau donné en énoncé dans le TP qui nous livrera la matrice A et les 2 vecteurs B et C , l’instruction [X,Y]=rk44(‘f’,a,b,y0,h,R) nous livre, en plus du vecteur X, la solution Y cherchée. f est la fonction vérifiant le système différentiel considéré.

Le tableau est donné dans le TP – mais précisons la suite, qui est déterminée d’après le tableau :

Les composantes ci, bi, et aij sont stockées respectivement dans les vecteurs C, B et dans la matrice A.

Algorithme pour q = 4 , il s’agit de la fonction " rk44 " :


function [X,Y]=RK44(namef,a,b,y0,h,R);

%a et b sont les bornes du segment sur lequel on cherche une solution approchée de l’EDO

%R est le tableau donnant la matrice A et les 2 vecteurs B et C

%h:pas de la subdivision de [a,b]

X=a:h:b;

N=length(X);

Y=0; %préallocation

Y(1,:)=y0; %1er itéré

%extraction des données:

A=zeros(4,4); %préallocation

B=zeros(1,4); %vecteur ligne

C=zeros(4,1); %vecteur colonne

B=R(5,2:5); %extraction de B et de C

C=R(1:4,1);

C=C'; %On écrit C en ligne (transposée)

R(:,1)=[]; %réduction de R pour déterminer A

R(5,:)=[];

A=R;

%APPLICATION DE LA FORMULE ITERATIVE:

for n=1:N-1,

for j=1:4,x(n,j)=X(n)+C(j)*h;end;

y(n,1)=Y(n);

for j=2:4,y(n,j)=Y(n)+A(j,j-1)*h*feval(namef,x(n,j-1),y(n,j-1));end;

T=0; %initialisation pour la somme

for j=1:4,

S=B(j)*feval(namef,x(n,j),y(n,j));

T=T+S;

end;

Y(n+1,:)=Y(n,:)+h*T; (n+1)ème itéré

end;


On peut donner en guise de compléments les algorithmes des 2 premiers exemples du TP :


%Méthode de Runge-Kutta pour q=1

function [y]=RK1(namef,a,b,h,y0,R);

%R=tableau contenant les éléments A,B,C qui fournit une nouvelle suite

X=a:h:b;

N=length(X);

y=zeros(N,1); %préallocation

y(1,:)=y0; %1er itéré

A=R(1,2); %extraction des données

B=R(2,2);

C=R(1,1);

for i=1:N-1,

x(i,1)=X(i)+C*h;

k=0; %initialisation de la boucle " compteur "

y1=y(i,:);

y2=y(i,:)+h*A*feval(namef,x(i,1),y1);

e=norm(y2-y1,2); %utilisation de la boucle

while(e>0.0000001)&(k<10000), %du point fixe pour résoudre

y1=y2; %z(i,1)=H(z(i,1)

y2=y(i,:)+h*A*feval(namef,x(i,1),y2);

e=norm(y2-y1,2);

k=k+1;

end;

z(i,1)=y2;

if A==1, %On retombe sur Euler Implicite

y(i+1,:)=z(i,1);

else y(i+1,:)=y(i,:)+h*B*feval(namef,x(i,1),z(i,1));

end; %z(i,1) est issu de la boucle de point fixe

end;



function [y] = RK2 (a,b,y0,h); %Méthode de Runge-Kutta pour q=2

Global c; %écrire avant l’appel de la fonction dans la feuille de commande %de Matlab

X=a:h:b;

N=length(X);

y=0;

y(1,:)=y0;

for i=1:N-1,

y(i+1,:)=y(i,:)+h*(1-(1/(2*c)))*2*y(i,:)+...

(h/(2*c))*2*(y(i,:)+c*h*2*y(i,:));

end;


Dans cette dernière méthode, pour c = ½ on obtient la méthode d’Euler modifiée ; pour c=1, la méthode de Heun.

Ce qui serait intéressant c’est d’écrire un algorithme pour q quelconque, mais le problème est que les formules générales pour trouver yn,i font intervenir yn,1, yn,2, ...., yn,i ,…, yn,q d’où … problème.

 

COMPARAISON DES ERREURS MAXIMALES & TEMPS DE CALCUL :

Nous supposons l’équation différentielle linéaire : y¢ =2y, y(0)=1 sur [0,1]. Le pas de discrétisation est choisi constant – noté h : nous avons les résultats suivant :

Extrait de la feuille de commande d’une session de Matlab nous présentant le temps de calcul, le nombre d’opérations effectuées et finalement l’erreur maximale commise par chacune des méthodes vues jusqu’ici :


" R=[0 0 0 0 0;0.5 0.5 0 0 0;0.5 0 0.5 0 0;1 0 0 1 0;0 1/6 1/3 1/3 1/6];

%Tableau pour la méthode de Runge Kutta d’ordre 4

" a=0;b=1;h=0.1;y0=1; %définition des paramètres

" flops(0);tic,[x,y1]=eulerexpl2(a,b,h,y0);toc,disp(flops); %EULER EXPLICITE

elapsed_time =

0

69

" %flops nous donne le nombre d'opérations effectuées par la fonction

" flops(0);tic,[x,y2]=eulerimpl3(a,b,h,y0,0.00001,1000);toc,disp(flops); %EULER IMPLICTE

elapsed_time =

0.2200

859

" flops(0);tic,[x,y3]=teta(a,b,h,y0,0.5,0.00001,1000);toc,disp(flops); %q -METHODE (q =0.5)

elapsed_time =

0.2200

1005

" global c;c=0.5;

" flops(0);tic,[x,y4]=rk2('f',a,b,y0,h);toc,disp(flops); %Euler modifié

elapsed_time =

0

209

" global c;c=1;

" flops(0);tic,[x,y5]=rk2('f',a,b,y0,h);toc,disp(flops); %Heun

elapsed_time =

0

209

" global c;c=1.5;

" flops(0);tic,[x,y6]=rk2('f',a,b,y0,h);toc,disp(flops); %RK2 (a =1.5)

elapsed_time =

0

209

" flops(0);tic,[x,y7]=rk44('f',a,b,y0,h,R);toc,disp(flops); %RK4 CLASSIQUE

elapsed_time =

0.0600

459

" %La véritable solution est y(x)=exp(2*x);

" Y=exp(2*x);

" e1=abs(Y'-y1);e2=abs(Y'-y2);e3=abs(Y'-y3);e4=abs(Y'-y4);e5=abs(Y'-y5);e6=abs(Y'-y6);e7=abs(Y'-y7);

" E1=0;for i=1:length(x), if e1(i)>E1, E1=e1(i);end;end; % euler explicite

" E2=0;for i=1:length(x), if e2(i)>E2, E2=e2(i);end;end; % euler implicite

" E3=0;for i=1:length(x), if e3(i)>E3, E3=e3(i);end;end; % q -méthode avec q = 0.5

" E4=0;for i=1:length(x), if e4(i)>E4, E4=e4(i);end;end; % RK2 avec a = 0.5

" E5=0;for i=1:length(x), if e5(i)>E5, E5=e5(i);end;end; % RK2 avec a = 1

" E6=0;for i=1:length(x), if e6(i)>E6, E6=e6(i);end;end; % RK2 avec a = 1.5

" E7=0;for i=1:length(x), if e7(i)>E7, E7=e7(i);end;end; % RK4

"

" [E1 E2 E3 E4 E5 E6 E7] % h = 0.1

ans =

1.1973 _ 1.9241 _ 0.0497 _ 0.0844 _ 0.0844 _ 0.0844 _ 0.0002


Au niveau du temps de calcul, Euler explicite et Runge – Kutta à l’ordre 2 sont très rapide d’autant plus que Runge – Kutta est assez précise dans l’approximation de la solution. Nous pouvons d’ailleurs constater que dans la méthode de RK2 le résultat est indépendant de a . Nous concluons également que la méthode RK4 est la méthode la plus précise pour un coût pas trop élevé comparé à Euler implicite et la q -méthode.

Reprenons ces calculs pour un pas de h = 0.01 :


R=[0 0 0 0 0;0.5 0.5 0 0 0;0.5 0 0.5 0 0;1 0 0 1 0;0 1/6 1/3 1/3 1/6];

" a=0;b=1;h=0.01;y0=1;

" flops(0);tic,[x,y1]=eulerexpl2(a,b,h,y0);toc,disp(flops);

elapsed_time =

0.1100

429

" flops(0);tic,[x,y2]=eulerimpl3(a,b,h,y0,0.00001,1000);toc,disp(flops);

elapsed_time =

0.6600

3909

" flops(0);tic,[x,y3]=teta(a,b,h,y0,0.5,0.00001,1000);toc,disp(flops);

elapsed_time =

0.9900

5133

" global c;c=0.5;

" flops(0);tic,[x,y4]=rk2('f',a,b,y0,h);toc,disp(flops); %Euler modifié

elapsed_time =

0.0600

1919

" global c;c=1;

" flops(0);tic,[x,y5]=rk2('f',a,b,y0,h);toc,disp(flops); %Heun

elapsed_time =

0.0600

1919

" global c;c=1.5;

" flops(0);tic,[x,y6]=rk2('f',a,b,y0,h);toc,disp(flops);

elapsed_time =

0.0500

1919

" flops(0);tic,[x,y7]=rk44('f',a,b,y0,h,R);toc,disp(flops);

elapsed_time =

0.2200

4419

" %La véritable solution est y(x)=exp(2*x);

" Y=exp(2*x);

" e1=abs(Y'-y1);e2=abs(Y'-y2);e3=abs(Y'-y3);e4=abs(Y'-y4);e5=abs(Y'-y5);e6=abs(Y'-y6);e7=abs(Y'-y7);

" E1=0;for i=1:length(x), if e1(i)>E1, E1=e1(i);end;end;

E2=0;for i=1:length(x), if e2(i)>E2, E2=e2(i);end;end;

E3=0;for i=1:length(x), if e3(i)>E3, E3=e3(i);end;end;

E4=0;for i=1:length(x), if e4(i)>E4, E4=e4(i);end;end;

E5=0;for i=1:length(x), if e5(i)>E5, E5=e5(i);end;end;

E6=0;for i=1:length(x), if e6(i)>E6, E6=e6(i);end;end;

E7=0;for i=1:length(x), if e7(i)>E7, E7=e7(i);end;end;

" format long e

" [E1 E2 E3 E4 E5 E6 E7] % h = 0.01

ans =

Columns 1 through 3

1.444099806783132e-001 _ 1.512933740827185e-001 _ 4.807693843513761e-004

Columns 4 through 6

9.704838383681746e-004 _ 9.704838383628456e-004 _ 9.704838383557402e-004

Column 7

1.937854499090008e-008


Cela confirme nos conclusions précédentes – donnons pour finir les résultats pour h = 0.0001 :


" R=[0 0 0 0 0;0.5 0.5 0 0 0;0.5 0 0.5 0 0;1 0 0 1 0;0 1/6 1/3 1/3 1/6];

" a=0;b=1;h=0.0001;y0=1;

" flops(0);tic,[x,y1]=eulerexpl2(a,b,h,y0);toc,disp(flops);

elapsed_time =

23.5100

40029

" flops(0);tic,[x,y2]=eulerimpl3(a,b,h,y0,0.00001,1000);toc,disp(flops);

elapsed_time =

46.8500

200029

" flops(0);tic,[x,y3]=teta(a,b,h,y0,0.5,0.00001,1000);toc,disp(flops);

elapsed_time =

75.5200

320029

" global c;c=0.5;

" flops(0);tic,[x,y4]=rk2('f',a,b,y0,h);toc,disp(flops); %Euler modifié

elapsed_time =

17.3000

190019

" global c;c=1;

" flops(0);tic,[x,y5]=rk2('f',a,b,y0,h);toc,disp(flops); %Heun

elapsed_time =

17.2500

190019

" global c;c=1.5;

" flops(0);tic,[x,y6]=rk2('f',a,b,y0,h);toc,disp(flops);

elapsed_time =

17.2500

190019

" flops(0);tic,[x,y7]=rk44('f',a,b,y0,h,R);toc,disp(flops);

elapsed_time =

129.6300

440019

" %La véritable solution est y(x)=exp(2*x);

" Y=exp(2*x);

" e1=abs(Y'-y1);e2=abs(Y'-y2);e3=abs(Y'-y3);e4=abs(Y'-y4);e5=abs(Y'-y5);e6=abs(Y'-y6);e7=abs(Y'-y7);

" E1=0;for i=1:length(x), if e1(i)>E1, E1=e1(i);end;end;

E2=0;for i=1:length(x), if e2(i)>E2, E2=e2(i);end;end;

E3=0;for i=1:length(x), if e3(i)>E3, E3=e3(i);end;end;

E4=0;for i=1:length(x), if e4(i)>E4, E4=e4(i);end;end;

E5=0;for i=1:length(x), if e5(i)>E5, E5=e5(i);end;end;

E6=0;for i=1:length(x), if e6(i)>E6, E6=e6(i);end;end;

E7=0;for i=1:length(x), if e7(i)>E7, E7=e7(i);end;end;

" format long e

" [E1 E2 E3 E4 E5 E6 E7] % h = 0.0001

ans =

Columns 1 through 3

1.477466475936495e-003 _ 1.477564878477722e-003 _ 9.850594029359172e-008

Columns 4 through 6

9.850595894533852e-008 _ 9.850593674087804e-008 _ 9.850597137983640e-008

Column 7

1.776356839400250e-014


Ce dernier résultat pour la méthode RK4 est vraiment excellent puisqu’on se rapproche de la précision relative du logiciel :


" eps

ans =

2.220446049250313e-016


Donc, parmi toutes ces méthodes, on retiendra la méthode classique de Runge-Kutta (q=4) pour une bonne approximation de la solution malgré un coût élevé ou la méthode d’Euler explicite pour une rapidité de calcul au détriment d’une approximation somme toute grossière par rapport à d’autres solveurs. L’utilisateur devra donc choisir entre le résultat ou la rapidité.

 

Application à la chimie ou le " BRUSSELATOR " :

Il modélise des réactions chimiques oscillantes. La variable y est définie dans ú ², c’est donc un couple [y1,y2] dont chaque composante dépend de x : on écrit : y(x) = [y1(x),y2(x)]. Le problème à résoudre possède donc 2 équations et 2 conditions initiales :

Nous allons définir une fonction brusselator(x,y) définie de ú ² dans ú ²  et calculons une solution approchée du système par 4 méthodes : Euler explicite (eulerexpld2), Euler implicite (eulerimpld), Runge-Kutta classique ( rk44d) et enfin par un solveur Matlab nommé ODE45.


function h=brusselator(x,y); %fct de R² ds R²

%y(x) peut être soit un vecteur colonne, soit un vecteur ligne peu importe

%le résultat par contre sera un vecteur colonne (;)

h=[1+y(1)^2*y(2)-4.4*y(1);3.4*y(1)-y(1)^2*y(2)];


Présentation des différents solveurs :

La fonction eulerexpld2 résout le système posé précédemment par la méthode d’Euler explicite. L’instruction [X,y1,y2]=eulerexpld2(‘brusselator’,0,20,0.01,[1 3]) nous livre le vecteur X contenant les points de la subdivision de [a,b] dont le pas h constant est pris égal à 0.01 ainsi que les 2 composantes du vecteur y – solution approchée du problème. y0 = [1 3] est la condition initiale du problème.

Algorithme de la fonction eulerexpld2 :


function [X,y1,y2]=Eulerexpld2(namef,a,b,h,y0)

%namef:nom de la fonction vérifiant le système différentiel

%y0=condition initiale est un vecteur de dimension 2

X=a:h:b;

N=length(X);

y1(1,:)=y0(1); %initialisation des 2 composantes de y

y2(1,:)=y0(2); %les 2 premiers itérés correspondent aux 2 composantes

%de la condition initiale

for i=1:N-1,

g=feval(namef,X(i),[y1(i,:);y2(i,:)]); %g a 2 composantes puisque

y1(i+1,:)=y1(i,:)+h*g(1); %nous évaluons [y1(i),y2(i)]

y2(i+1,:)=y2(i,:)+h*g(2); %avec la fct brusselator

end;


La fonction eulerimpld résout le problème par la méthode d’Euler implicite. Soient eps l’erreur relative entre 2 termes consécutifs dans la méthode du point fixe et nmax le nombre maximal d’itérations, l’instruction [X,y1,y2]=eulerimpld(0,20,0.01,[1 3],eps,nmax) nous livre le vecteur X contenant les points de la subdivision de [a,b] dont le pas h constant vaut également 0.01 ainsi que les 2 composantes du vecteur y – solution approchée du problème.

y0 = [1 3] est la condition initiale du problème. C’est un vecteur à 2 dimensions car le mouvement est contenu dans un plan.

 Algorithme de la fonction eulerimpld :


function [X,y1,y2]=eulerimpld(a,b,h,y0,eps,nmax);

X=a:h:b;

N=length(X);

g=inline('[1+y(1)^2*y(2)-4.4*y(1),3.4*y(1)-y(1)^2*y(2)]','x','y');

y1(1)=y0(1); %définition de la fonction " brusselator " à l’intérieur

y2(1)=y0(2); %même de la fonction " eulerimpld "

for n=1:N-1,

i=0; %initialisation du compteur

u=[y1(n),y2(n)];

v=[y1(n),y2(n)]+h*g(X(n+1),u); %Méthode

e=norm(u-v,2); %du point fixe

while (e>eps)&(i<nmax),

u=v;

v=[y1(n),y2(n)]+h*g(X(n+1),v);

e=norm(u-v,2);

i=i+1;

end;

y1(n+1)=v(1); %les 2 (n+1)èmes itérés

y2(n+1)=v(2);

end;


La fonction rk44d résout le problème par la méthode de Runge-Kutta classique. Soit R le tableau contenant la matrice A et les 2 vecteurs B et C définis dans le paragraphe sur les méthodes de Runge-Kutta, l’instruction [X,y1,y2]=rk44d(‘brusselator’,0,20,[1 3],0.01,R) nous livre le vecteur X contenant les points de la subdivision de [a,b] dont le pas h constant vaut également 0.01 ainsi que les 2 composantes du vecteur y – solution approchée du problème.

Nous avons choisi l’ordre 4 pour cette méthode car d’après les conclusions déjà établies, RK4 nous fournit une assez bonne approximation de la solution.

Algorithme de la fonction rk44d :


function [X,y1,y2]=RK44d(namef,a,b,y0,h,R);

X=a:h:b;

N=length(X);

y1(1)=y0(1);

y2(1)=y0(2);

%extraction des données:

A=zeros(4,4); %préallocation

B=zeros(1,4);

C=zeros(4,1);

B=R(5,2:5);

C=R(1:4,1);

C=C'; %On écrit C en ligne

R(:,1)=[];

R(5,:)=[];

A=R;

%résolution:

for n=1:N-1,

for j=1:4,x(n,j)=X(n)+C(j)*h;end;

Y1(n,1)=y1(n);

Y2(n,1)=y2(n);

for j=2:4,

M=feval(namef,x(n,j-1),[Y1(n,j-1),Y2(n,j-1)]);

Y1(n,j)=y1(n)+A(j,j-1)*h*M(1);

Y2(n,j)=y2(n)+A(j,j-1)*h*M(2);

end;

T=[0,0];

for j=1:4,

S=B(j)*feval(namef,x(n,j),[Y1(n,j),Y2(n,j)]);

T(1)=T(1)+S(1);

T(2)=T(2)+S(2);

end;

y1(n+1)=Y1(n)+h*T(1);

y2(n+1)=Y2(n)+h*T(2);

end;


Illustration :

La figure 19 affiche les représentations graphiques des composantes de y obtenues par les diverses méthodes précédentes. Nous avons opté pour un pas de 0.01 car d’une part les temps de calculs ne sont pas trop long et d’autre part les résultats sont assez acceptables (cf. page suivante). La fonction ode45 de Matlab calcule automatiquement le pas – nous pouvons donc constater d’après la forme des courbes que le pas choisi est proche du pas calculé par ode45.

Extrait de la feuille de commande d’une session de Matlab comparant les temps de calcul et le nombre d’opérations effectuées :


" flops(0);tic,eulerexpld2('brusselator',0,20,0.01,[1 3]);toc,disp(flops) %Euler explicite

elapsed_time =

2.5300

30019

" flops(0);tic,eulerimpld(0,20,0.01,[1 3],0.0001,100);toc,disp(flops) %Euler implicite

elapsed_time =

10.3800

122604

" R=[0 0 0 0 0;0.5 0.5 0 0 0;0.5 0 0.5 0 0;1 0 0 1 0;0 1/6 1/3 1/3 1/6] ;

" flops(0);tic,rk44d('brusselator',0,20,[1 3],0.01,R);toc,disp(flops) %Runge-Kutta classique

elapsed_time =

15.6500

252019

" flops(0);tic,[t,y]=ode45('brusselator',[0,20],[1 3]);toc,disp(flops) %ode45

elapsed_time =

3.5200

33497

Regardons le pas d’ode45 :

" length(t)

ans =

213

" t(15)-t(14),t(100)-t(99),t(213)-t(212)

ans =

0.2212

ans =

0.1383

ans =

0.1643


Finalement, le pas d’ode45 n’est pas réellement proche de h=0.01. Nous pouvons alors penser que pour l’approximation de la solution de ce problème, il ne suffit que d’une grossière subdivision de [0 20] puisque apparemment hode45 << 0.01. En traçant la courbe, paramétrée par les 2 composantes de la solution trouvée par quelques solveurs, nous constatons cependant que pour h=0.01, on se rapproche bien de la solution d’ode45.

C’est ce qu’indique la figure suivante :

 

Paramétrisation de quelques solutions obtenues

 

Application à LA MECANIQUE CELESTE :

Le mouvement d’un corps céleste de masse négligeable dans un champ de gravité de 2 corps en rotation circulaire l’un autour de l’autre, est décrit par les équations figurant sur le TP. Ce problème modélise la trajectoire d’un vaisseau spatial allant de la Terre à la Lune . Nous sommes en présence d’un problème dont l’équation peut s’écrire dans sa globalité sous la forme : Y² = f(Y,Y¢ ). Il faut donc se ramener à un problème du type Z¢ = g(Z). Pour cela nous allons écrire les vecteurs Z et Z¢ de la manière suivante :

Nous venons de définir une fonction celeste qui associe à un vecteur de ú 4 un autre vecteur de ú 4. Il faut également précisé que si Z¢ =celeste(Z), il faut le comprendre comme Z¢ (x)=celeste(Z(x)). Son algorithme est le suivant :


function [h]=celeste(x,z); %fonction décrivant le système diff. considéré

mu=0.012277471; %rapport des masses des 2 corps

mu2=1-mu;

r1=((z(1)+mu)^2+z(2)^2)^(1/2);

r2=((z(1)-mu2)^2+z(2)^2)^(1/2);

f1=z(1)+2*z(4)-mu2*(z(1)+mu)/(r1^3)-mu*(z(1)-mu2)/(r2^3);

f2=z(2)-2*z(3)-mu2*z(2)/(r1^3)-mu*z(2)/(r2^3);

h=[z(3);z(4);f1;f2]; %celeste nous retourne un vecteur colonne


La résolution du système peut se faire grâce au solveur ode45 dont la syntaxe est la suivante :


" xn=11.124340337266085135; %borne sup de l’intervalle [a,b]

" [x,z]=ode45('celeste',[0 xn],[0.994;0;0;-2.031732629557336836]);

" plot(z(:,1),z(:,2)) %courbe paramétrée


Le résultat nous est fourni par la figure 20. Nous voyons clairement que l’orbite est périodique : la fusée par de la Terre en direction de la Lune, tourne autour d’elle 2 fois de suite mais pendant ces 2 tours le satellite naturel de la Terre se déplace – c’est ce qu’indique les 2 positions marquées " Lune " sur la courbe – puis regagne la Terre au même point car la durée de rotation de la Terre est beaucoup plus longue que celle de la Lune du fait de son diamètre.

Nous pouvons également utiliser d’autres solveurs déjà vus dans ce TP : Euler explicite, Runge-Kutta classique, par exemple. Contrairement à ode45 qui calcule automatiquement le pas, nous devons procéder par approches successives pour obtenir une orbite périodique. Les figures 20 bis et 20 ter, montre l’influence du pas, donc du nombre de points de la subdivision [0 xn] sur l’orbite cherchée. Nous sommes amenés à constater que plus h diminue, plus on se rapproche d’une trajectoire fermée.

Nous avons modifier nos fonctions de bases pour essayer d’améliorer la rapidité des calculs.

Affichons simplement les algorithmes :


function [X,y]=Eulerexplc(namef,a,b,N,y0)

X=linspace(a,b,N);

h=X(1)-X(2);

y(1,:)=y0';

for i=1:N-1,

y(i+1,:)=y(i,:)+h*(feval(namef,X(i),y(i,:))');

end;


 


function [X,Y]=RK4c(namef,a,b,y0,n);

X=linspace(a,b,n);

h=X(2)-X(1);

N=length(X);

Y=zeros(N,length(y0)); %préallocation

Y(1,:)=y0';

b=[1/6,1/3,1/3,1/6];

for i=1:N-1,

x1=X(i);

x2=x1+0.5*h;

x3=x2;

x4=x1+h;

y1=Y(i,:);

y2=y1+0.5*h*feval(namef,x1,y1)';

y3=y1+0.5*h*feval(namef,x2,y2)';

y4=y1+h*feval(namef,x3,y3)';

Y(i+1,:)=y1+h*(b(1)*(feval(namef,x1,y1)')+b(2)*(feval(namef,x2,y2)')...

+b(3)*(feval(namef,x3,y3)')+b(4)*(feval(namef,x4,y4)'));

end;


 La feuille de commande de la session de Matlab suivante, compare ces 3 solveurs sur le temps de calcul et le nombre d’opérations effectuées :


" flops(0);tic,[t,y]=ode45('celeste',[0 xn],z0);toc;disp(flops)

elapsed_time =

0.5500

78695

" flops(0);tic,[x1,y1]=eulerexplc('celeste',0,xn,20000,z0);toc;disp(flops)

elapsed_time =

218.6100

939976

" flops(0);tic,[x1,y1]=eulerexplc('celeste',0,xn,35000,z0);toc;disp(flops)

elapsed_time =

6.529000000000000e+002

1644976

" flops(0);tic,[x1,y1]=eulerexplc('celeste',0,xn,45000,z0);toc;disp(flops)

elapsed_time =

1.059840000000000e+003

2114976

" flops(0);tic,[x,y1]=rk4c('celeste',0,xn,z0,2000);toc,disp(flops)

elapsed_time =

11.87000000000000

627709

" flops(0);tic,[x,y1]=rk4c('celeste',0,xn,z0,3500);toc,disp(flops)

elapsed_time =

20.49000000000000

1098709

" flops(0);tic,[x,y1]=rk4c('celeste',0,xn,z0,5000);toc,disp(flops)

elapsed_time =

29.28000000000000

1569709


Nous voyons nettement que ode45 est beaucoup plus rapide que les 2 autres fonctions. De plus, ode45 calcule un pas non constant, ce qui permet une meilleure approximation des solutions, puisque cette fonction peut rapprocher les points de la subdivision ou les éloigner suivant les variations de la fonction.

 

CONCLUSION :

L’erreur de discrétisation de la méthode d’Euler est proportionnelle à h  (démonstration faite dans le livre de M.CROUZEIX / A.L. MIGNOT); nous avons montré qu’il existe des méthodes à un pas – telle que la méthode de Runge-Kutta – pour lesquelles cette erreur est proportionnelle à hp avec p>1, la méthode est dite alors d’ordre p. Le coût en calculs d’un pas d’une méthode d’ordre p augmente avec p, mais ceci est largement compensé par le fait que, pour une même précision, le nombre de pas demandé décroisse avec p. Nous avons pu également constater que ces méthodes accumulent moins d’erreurs donc reculent ainsi les limites en précision imposées par l’ordinateur.

Les méthodes à un pas calculent une valeur approchée yn+1 à l’instant tn+1, en utilisant uniquement la valeur approchée y; l’utilisation de plusieurs valeurs approchées yn, yn-1, … permet d’obtenir à précision égale des méthodes de coût moins élevé ; ces méthodes sont appelées méthodes à pas multiples. Parmi ces méthodes, les méthodes d’Adams sont celles qui paraissent les plus efficaces lorsque le problème différentiel est bien conditionné. Mais ces méthodes peuvent devenir trop coûteuses pour un problème mal conditionné, voire totalement inefficaces sur un problème raide. Il peut être alors intéressant d’utiliser la méthode des différentiations rétrogrades (toutes les formes implicites des méthodes vues dans ce TP) car elle présente de meilleurs propriétés de stabilité. Donc même si nous n’avons pas vu les méthodes d’Adams, nous pouvons tout aussi bien obtenir de bonnes approximations avec l’ensemble des méthodes vues dans ce TP.

Il est intéressant de savoir approcher une solution d’équations différentielles car bon nombre d’entre elles apparaissent en physique, en chimie, en astronomie,… au moment de la mise en équation d’un phénomène ; la compréhension du mécanisme, l’élaboration d’un modèle et la mise en œuvre des éventuelles applications pratiques, dépendent dans la plupart des cas du fait qu’on trouve ou non des solutions à ces équations.




Retour vers sommaire de Licence