Équations différentielles et champs de vecteurs

mercredi 27 mai 2009
par  Alain BUSSER

Dans cet article, on compare divers outils permettant de dessiner les champs de vecteurs avec des logiciels libres, et on verra que la création de l’outil est d’autant plus aisée que celui-ci est peu dynamique, donc peu intéressant...

Pour une équation différentielle du premier ordre y’=f(x,y), le champ de vecteurs est formé de vecteurs dont le quotient ordonnée/abscisse est égal à f(x,y) où x et y sont les coordonnées de l’origine du vecteur. Alors les solutions de l’équation différentielle « suivent les flèches », ce qui montre immédiatement qu’il y a toujours une solution sauf si
 le vecteur est vertical : Dans ce cas la fonction y(x) n’est pas dérivable
 il n’y a pas de vecteur du tout (singularité), ce qui peut arriver si
— le champ de vecteur s’annule : f(x,y)=0
— l’équation différentielle n’est pas définie : f(x,y) n’existe pas.

Pratiquement tous les logiciels de calcul formel (Maple, Maxima, Derive, Yacas, xcas, etc.) ou matriciel (MatLab, SciLab, Euler Math Toolbox, etc.) permettent de dessiner plus ou moins facilement un champ de vecteurs, mais seuls ceux qui sont libres peuvent être utilisés à domicile par les élèves qui peuvent facilement télécharger n’importe quel logiciel mais n’en ont le droit que si les logiciels en question sont libres...

Les exemples suivants concernent tous la même équation différentielle y’=-2xy vue avec des logiciels divers.


Euler Math Toolbox

Le logiciel Euler Math Toolbox est très facile à utiliser pour dessiner un champ de vecteurs en même temps que la solution numérique de l’équation différentielle. Ainsi, en ajoutant le code suivant à l’exemple qui est fourni avec Euler :

	vectorfield("-2*x*y",-2,2,0,2);
	linewidth(5); color(2);
	t=0:0.05:2; s=heun("-2*x*y",t,1); hold; plot(t,s); hold;
	t=0:-0.05:-2; s=heun("-2*x*y",t,1); hold; plot(t,s); hold;
	linewidth(0); color(1);
	title("Solution de l'équation différentielle");

on obtient la figure suivante :

après avoir exporté en « postscript », format dont la qualité est telle que c’est ce fichier qui figure dans le cours.

En résumé, très bonne qualité, et assez facile d’adapter (changer d’équation différentielle ou de cadrage) mais le résultat est statique : si on veut changer de condition initiale on doit recharger le fichier après modification.


SciLab

Le logiciel SciLab est fourni avec des démos, dont une avec champ de vecteurs : On clique sur « demos » puis « simulation » puis « ODE » [1] et « ODE 1D vector field ». On voit alors un champ de vecteurs où, à chaque clic gauche, se crée un point à partir duquel se dessine la solution. En bougeant ce point à la souris, on voit la solution évoluer ! Comme indiqué sur le texte explicatif du début [2], un clic droit termine l’activité.

Il suffit de récupérer le fichier de démo en question (sous SciLab 5.0 lycée il s’appelle « ode_1dvect.dem.sce ») et de l’enregistrer ailleurs, sous un autre nom, puis le jour du TP, de modifier les lignes suivantes :

deff("yprim=f(t,y)","yprim=-2*t*y")
tmin=-3; tmax=3; ymin=-0.5; ymax=1.5;

pour changer d’équation différentielle [3]. Ces modifications sont faites par les étudiants pendant le TP. En une heure, un groupe d’étudiants de BTS traite typiquement 5 à 7 équations différentielles, dont la moitié à coefficients constants, et dont l’exemple ci-dessus, qui produit cette figure

où on n’a cliqué qu’une seule fois pour ne pas alourdir la figure. Les étudiants adorent mettre des dizaines de courbes sur le champ de vecteurs, ce qui les aide à réaliser que sans condition initiale, la solution d’une équation différentielle n’est pas unique [4].

Scilab offre sur Euler l’avantage de permettre de bouger la condition initiale. Mais la programmation est un peu plus difficile qu’avec Euler. Les TPs ont été faits avec la version 4 de SciLab et lorsque la version 5 est parue, elle ne possédait ni gestion de la souris, ni exemples d’équations différentielles. D’où la recherche d’autres outils libres permettant de manipuler la figure (ici déplacer la condition initiale) et de dessiner le champ de vecteurs.


xcas

Le logiciel xcas] est une interface graphique pour giac (une bibliothèque de calcul formel), et un couteau suisse, permettant de manipuler des champs de vecteurs :

En regardant dans l’index à « plot » on trouve assez vite qu’il suffit d’entrer

plotode(-2*t*y,[t,y],[0,1]);
plotfield(-2*t*y,[t,y]);

pour obtenir ce graphique :

dont le principal défaut est qu’il dessine des segments au lieu de vecteurs.

Il ne semble pas que xcas permette de bouger la condition initiale autrement qu’avec des curseurs, et la fluidité laisse à désirer [5].


GeoGebra

En géométrie dynamique, la manipulation de la figure est aisée, mais ici il a fallu donner la solution sous forme analytique, ce qui change pas mal la nature du TP ! On peut bien implémenter la méthode d’Euler, voire celle de Runge-Kutta, en géométrie dynamique mais c’est loin d’être simple...

Avec l’outil « Séquence » [6] de GeoGebra, on a la figure suivante :

le champ sous GeoGebra

Le champ a été créé comme une séquence de séquences de vecteurs (!). En effet, une séquence n’a qu’un indice, et chaque séquence est une ligne de vecteurs, allant du point de coordonnées (i, j) au point de coordonnées $(i+\frac{h}{\eta} ;j+\frac{-2hij}{\eta})$ où $\eta=\sqrt{1+(2ij)^2}$ est choisi de telle façon que la norme de chaque vecteur soit égale à 0,1.

Séquence[Séquence[Vecteur[(i, j), (i + 0.1 / sqrt(1 + (2 i j)²), j - 0.2 i j / sqrt(1 + (2 i j)²))], i, -2, 2, 0.2], j, -2, 2, 0.2]

Quand à la solution représentée en rouge, elle a été calculée analytiquement par $f(x)=y(A) \times e^{x(A)^2-x^2}$, où x(A) et y(A) désignent les coordonnées de A. C’est le point A qu’on est censé manipuler bien sûr, et un TP fait par des étudiants autonomes devant leur poste est difficilement envisageable avec ce genre de fichiers [7].


CarMetal

Comme CarMetal ne possède pas d’outil « liste », on ne peut pas construire de champ de vecteurs sous CarMetal. Mais on va bientôt pouvoir, en utilisant le futur langage de script qui sera fourni avec la version 3.0 dudit CarMetal. Le langage utilisé sera javascript et pour l’instant on ne peut le tester qu’avec la version java web start. Mais le fichier obtenu peut s’ouvrir avec la version actuelle de CarMetal, ce qui est suffisant pour l’exemple présent. Donc le « CarScript » pour construire le champ de vecteurs est le suivant :

for(i=-10;i<10;i++){
for(j=-10;j<10;j++){
vx=1/4; //abscisse du vecteur
vy=-2*i*j/16/4; //ordonnée; c'est ici qu'on change le second membre pour une autre équadiff
n=.001+Math.sqrt(vx*vx+vy*vy); //norme (légèrement augmentée pour diviser sans risque)
n=n*10;
vx=vx/n; // on norme les vecteurs
vy=vy/n;
a=Point("",i/4,j/4);Hide(a); // origine du vecteur
b=Point("",i/4+vx,j/4+vy);Hide(b); // son extrémité
v=Vector("",a,b);SetColor(v,"green");SetThickness(v,"normal"); // sa couleur (elle pourrait dépendre de i et j)
}}

et le fichier obtenu (après avoir mis la solution exacte) est le suivant :

le champ sous carmetal

Du fait que le code est écrit ligne après ligne, l’écriture de ce genre de script par les étudiants en salle d’informatique est tout à fait envisageable, sauf que ce sera difficile de le faire avant le cours sur la formule analytique qui donne la solution ! Ou alors, il faudrait, ce qui est parfaitement réalisable, implémenter la méthode d’Euler en javascript dans le script ci-dessus...


Réponses aux questions posées pendant le séminaire du 27 mai

Peut-on faire un fichier général, où il reste possible de modifier les coefficients (réels ou fonctions) de l’équation différentielle, dans l’optique d’un TP ?

Vraisemblablement oui, du moins avec GeoGebra :

Dans l’exemple ci-dessous, en cliquant-droit sur l’une des fonctions a(x) et b(x) (en bleu clair) il est possible de les « redéfinir », c’est-à-dire de les remplacer par d’autres fonctions (pour une équation différentielle sans second membre). Toutefois GeoGebra résiste

 aux fonctions a(x) et b(x) qui ne sont pas définies partout ;
 aux fonctions a(x) s’annulant, ce qui empêcherait l’équation différentielle d’être définie.

En téléchargeant le fichier ci-dessous, on peut le modifier de façon que par exemple a(x) et b(x) soient des polynômes dont les coefficients soient des curseurs, et le fichier « marchera » mieux. Voici donc la version BTS sans second membre :

équadiff sans second membre

Et maintenant (spécial terminale S) la version à coefficients constants (l’asymptote est en pointillés clairs). Ici les coefficients sont des curseurs et le fichier peut donc être manipulé en ligne :

équadiff coefficients constants

Et enfin la recherche d’une primitive (en première S ?)


[1« ordinary differential equation », acronyme anglais pour « équadiff »

[2que les étudiants ne lisent pas, même après l’avoir traduit en français...

[3à part qu’il a fallu aussi, la première fois, traduire les premières lignes en français

[4Par contre les bacheliers S ont eu un peu de mal à voir le rapport entre cette activité et ce qu’ils avaient vu en terminale, et se sont sentis rassurés quand ils ont vu qu’il y avait des formules à apprendre pour déterminer analytiquement la solution de l’équation différentielle...

[5c’est visiblement un défaut des logiciels de calcul formel par rapport aux logiciels de calcul numérique

[6Cette construction n’est plus nécessaire aujourd’hui puisque GeoGebra est maintenant muni d’une instruction « ChampVecteurs » ; il suffit donc d’écrire ChampVecteurs[-2*x*y] pour avoir le dessin des vecteurs ; toutefois ceux-ci sont représentés sans flèche, comme dans Xcas

[7sauf en utilisant la fonction « primitive » de GeoGebra (intégrale indéfinie), et la formule $y=k\,e^{\int \frac{-b}{a} dt}$ qui figure dans les formulaires de BTS.


Commentaires