ChronoMath, une chronologie des MATHÉMATIQUES
à l'usage des professeurs de mathématiques, des étudiants et des élèves des lycées & collèges
 

Méthode des différences finies          programme JavaScript
     Méthode d'Euler pour la résolution approchée d'une équation différentielle

La résolution d'une équation différentielle

x J, (x,y,y',y",...) = 0, y = f(x)

par différences finies consiste à discrétiser l'intervalle d'étude J = [a,b] sur lequel repose l'équation. On recherche une solution approchée sous la forme d'un nuage de points (xi, yi), yi = f(xi). Les xi sont connus, les yi sont l'objet de la recherche.

Considérons le cas d'une équation différentielle du 1er ordre, se ramenant à la forme simple :

y' = φ(x,y), avec xo , yo donnés                 problème de Cauchy

On sait qu'une approximation de y' = (x) est donnée, pour h "petit", par le quotient des différences finies Δy/Δx (taux d'accroissement) :

Comme dans le cas de l'intégration approchée, subdivisons J en n sous-intervalles (de même amplitude pour simplifier l'algorithme) :

a = xo  < x1 < x2 < ... < xn= b , xi = a + ih, h = (b - a)/n

Si yn désigne l'approximation de f(xn), on peut écrire alors écrire :

Notre équation différentielle y' =  φ(x,y) s'écrit alors :

yn+1 - yn = hφ(xn,yn),   xo, yo donnés

en espérant que le processus est convergent, ce qui est généralement le cas. Cependant, la précision est d'ordre 1 (en 1/h). Ce qui est faible. Pour des équations non pathologiques (évitez d'intégrer au voisinage d'une asymptote de la courbe intégrale...), il y a peu d'espoir d'un résultat satisfaisant si h > 1/1000 : évitez d'intégrer sur des intervalle de forte amplitude.

Pour une étude rigoureuse de la méthode (consistance, choix judicieux de h, convergence, erreur commise), on pourra se reporter aux références indiquées in fine et tout particulièrement à l'excellent livre de Claude Brezinski (professeur honoraire de l'université des sciences et techniques de Lille) : Algorithmique numérique : on ne peut que très difficilement faire mieux à ce sujet : que "la parole" lui soit donnée !

La représentation graphique du nuage de points M(xi, yi) obtenus fournit une approximation de la courbe intégrale dont on peut ensuite rechercher une équation approchée (polynomiale, logarithmique, exponentielle) par diverses méthodes d'approximation polynomiale ou non, comme par les moindres carrés, fournissant une expression acceptable de f.

Approximation et polynômes orthogonaux :

Pour une fonction ne posant pas de problème aux bornes de J, il peut être plus judicieux d'utiliser la dérivée symétrique :

conduisant à :

L'algorithme se programme très facilement. On peut bien entendu l'améliorer pour contrôler la convergence et évaluer l'erreur commise.

Programmation de la méthode en JavaScript :
 

  Pour tester ce programme vous devez entrer votre fonction φ(x,y) en utilisant une syntaxe comprise par le langage JavaScript. L'instruction with (Math), placée en début de procédure, évite à l'utilisateur de préciser Math devant chaque fonction mathématique utilisée. Les opérations et fonctions usuelles sont les suivantes :

 fonctions mathématiques usuelles

Le programme utilise par défaut l'équation différentielle  y' + y + 1 = ex   y(0) = 1/2 dont la solution exacte est : y = e-x + ½ex- 1


Avec Internet Explorer, pensez à refermer les fenêtres d'affichage avant de relancer le programme, sinon... rien ne se passe !

<SCRIPT LANGUAGE="JavaScript">
var x,y,z,fonc
var pi=3.141592653589793;
var e=2.7182818284590452;

function go()
{
with (Math)
{
fonc="exp(x)-y-1"
a=0;b=1
fonc=prompt("Entrez votre équo. diff. :",fonc)

a=eval(prompt("Intervalle [a,b]. Entrez a :",a));if (a==null) {return};
b=eval(prompt("Intervalle [a,b]. Entrez b :",b));if (b==null) {return};

xo=a;yo="1/2";
yo=eval(prompt("xo="+a+". Entrez yo :",yo));if (yo==null) {return};


n=40;
n=eval(prompt("Entrez n :",n));if (n==null) {return};
h=(b-a)/n;
nn=0;
//document.body.style.overflow='visible';

wdow=open("","","height=720,width=450","scrollbars=yes");
wdow.document.write("<PRE>");
wdow.document.writeln("x"+"0"+"="+xo+" y"+"0"+"="+yo)
xn=xo;yn=yo
while(nn<n)
{
nn++;
xn = xn+h;xnn=Math.floor(xn*1000+.5)/1000
yn=yn+h*f(xn,yn);ynn=Math.floor(yn*1000+.5)/1000
wdow.document.writeln("x"+nn+"="+xnn+" y"+nn+"="+ynn)
}
}
}

function f(x,y)
{
with(Math)
{
z=eval(fonc)
return z
}
}
</SCRIPT>


Comparaison entre la solution approchée (nuage de points, n = 40) et la solution exacte
avec l'excellentissime logiciel gratuit Graphmatica (capture d'écran) :

  Pour en savoir plus :


© Serge Mehl - www.chronomath.com