MetaPost Retour à la page précédente Archive (source + images) Fichier au format texte pour télécharger Imprimer le document sans le menu !

Représentation de solutions d'une équation différentielle

Le programme ode des plotutils (outils GNU) permet de calculer des solutions d'un système différentiel. Les résultats étant stockés dans un fichier, il est possible d'en donner une représentation avec MetaPost.

Pour accélérer la procédure, je définis le système tel qu'il sera soumis à ode à l'intérieur du fichier metapost (sous forme de commentaire); les données variables d'une solution à l'autre sont désignées par une chaîne de la forme $n, ainsi, il ne reste qu'à procéder à des substitutions pour obtenir les différents fichiers trajectoire (ce qui est réalisé à l'aide d'un script de pré-traitement).

Les différents fichiers trajectoires et les fichiers de macros metapost utilisés sont dans l'archive.

input geometrie2d;
input courbes;
input graph;
input plusa;

%@ode'système:ed1.ode
% y'= t - exp(y)
% y = $2 
% print t, y
% step $1, $3
%@ode'solution: ed1-1 -4 3 5
%@ode'solution: ed1-2 -3 3 5
%@ode'solution: ed1-3 -2 3 5
%@ode'solution: ed1-4 -1 3 5
%@ode'solution: ed1-5  0 3 5
%@ode'solution: ed1-6  1 3 5
%@ode'solution: ed1-7  2 3 5
%@ode'solution: ed1-8  3 3 5 
%@ode'solution: ed1-9  4 3 5

vardef trajectoire (expr f) =
    save s; gdata(f, s, if i>1:..fi (scantokens s1,scantokens s2))
enddef;

vardef F(expr x,y) = x - exp(y) enddef;

beginfig(1);

    Repere(12,9,5,4.5,1.5,1.5);
    Axes;
    Debut;
	Unites(1);
	Graduations;

	% Tracé du champ de vecteurs
	ahlength := 2;
	ChampVecteurs(F,0.2,0.2,0.4,0.4,0.15,0.5white); 

	trace Representation(ln,0.05,5,50)
	    withpen pencircle scaled 1
	    withcolor (0.8,0.2,0.5);

	for i=1 upto 9:
	    trace trajectoire("ed1-" & decimal i)
		withcolor (0.1,0.6,0.1);
	endfor
	
	Etiquette.rt("$y=\ln x$",1.5,(0.25,-2));
	paLegendeCCO((-1.5,1.75),"$y'=x-e^{y}$");
    Fin;
    
endfig;

vardef F(expr x,y) = -2x*y/(x*x+y*y) enddef;

%@ode'système:ed2.ode
% y' = -2*t*y/(t*t+y*y)
% y  = $2
% print t, y
% step $1, $3

%@ode'eval: 
% for($i=1;$i<=10;$i++) { solution("ed2-$i",-4,-2.25+$i/2,4); }

beginfig(2);

    Repere(12,9,6,4.5,1.5,1.5);
    Axes;
    Debut;
	Unites(1);
	Graduations;


	% Tracé du champ de vecteurs
	ahlength := 2;
	ChampVecteurs(F,0.2,0.2,0.4,0.4,0.15,0.5white); 

	
 	for i=1 upto 10: 
	    trace trajectoire("ed2-" & decimal i) withcolor (0.1,0.6,0.1); 
	endfor

	paLegendeCCO((0,-2.25),"$(x^2+y^2)y'+ 2xy = 0$");
	
    Fin;
    
endfig;

%@ode'système:ed3.ode
% y' = 2*t*y + y*y
% y = $2
% print t, y
% step $1, $3

%@ode'solution: ed3-1 -2 3 1
%@ode'solution: ed3-2 -3 3 2.8

vardef F(expr x,y) = 2x*y + y*y enddef;

beginfig(3);

    Repere(12,9,6,4.5,1.5,1.5);
    Axes;
    Debut;
	Unites(1);
	Graduations;

	trace Droite(origin,(1,-2)) withcolor (0.5,0.2,0.3);
	
	% Tracé du champ de vecteurs
	ahlength := 2;
	ChampVecteurs(F,0.2,0.2,0.4,0.4,0.15,0.5white); 

	for i=1 upto 2:
	    trace trajectoire("ed3-" & decimal i) withcolor (0.1,0.6,0.1);
	endfor
	
	paLegendeCCO((0,-2.25),"$y'=2xy+y^2$");
	
    Fin;
    
endfig;

end