euler_f(f,t0,y0,h):={ local t1,y1; t1:=t0+h; y1:=y0+h*f(t0,y0); return (t1,y1); }Pour tracer le graphe de la solution approchée sur [t0;t1], on écrit :
Pour trouver une solution approchée sur [a;b] de l'équation
différentielle :
y'(t) = f (t, y(t)), y(t0) = y0, avec
t0 [a;b],
il suffit de partager [a;b] en parties égales de longueur h
et d'appliquer plusieurs fois la fonction euler_f avec le pas h
puis avec le pas - h.
Voici le programme qui trace la solution sur [a;b] dans l'écran DispG
et qui utilise la fonction euler_f.
Les derniers segments servent à s'arrêter exactement en a et en b.
trace_sol(f,t0,y0,h,a,b):={ local t1,y1,td0,yd0,l1,j; td0:=t0; yd0:=y0; h:=abs(h); while (t0<b-h){ l1:=euler_f(f,t0,y0,h); t1:=l1[0]; y1:=l1[1]; segment(t0+i*y0,t1+i*y1); t0:= t1; y0:=y1; } segment(t0+i*y0,b+i*(y0+(b-t0)*f(t0,y0))); //on trace avec -h t0:=td0; y0:=yd0; while ( t0>a+h){ l1:=euler_f(f,t0,y0,-h); t1:=l1[0]; y1:=l1[1]; segment(t0+i*y0,t1+i*y1); t0:= t1; y0:=y1; } segment(t0+i*y0,a+i*(y0+(t0-a)*f(t0,y0))); }ou encore pour avoir le dessin dans l'écran graphique obtenu comme réponse, on écrit une fonction qui renvoie la séquencee des segments à dessiner :
trace_euler(f,t0,y0,h,a,b):={ local td0,yd0,l1,j,ls; td0:=t0; yd0:=y0; h:=abs(h); ls:=[]; while (t0<b-h){ l1:=euler_f(f,t0,y0,h); ls:=ls,segment(t0+i*y0,point(l1)); (t0,y0):=l1; } ls:=ls,segment(t0+i*y0,point(euler_f(f,t0,y0,b-t0))); //on trace avec -h en partant de td0 et de yd0 //(td0 et yd0 sont les valeurs du debut) t0:=td0; y0:=yd0; while ( t0>a+h){ l1:=euler_f(f,t0,y0,-h); ls:=ls,segment(t0+i*y0,point(l1)); (t0,y0):=l1; } ls:=ls,segment(t0+i*y0,point(euler_f(f,t0,y0,a-t0))); return ls; }