Méthode d'Euler

Tracé de polygones

> plot([[1,2],[2,5],[-1,6]]);

[Maple Plot]

> plot([seq([n*Pi/5,sin(n*Pi/5)],n=0..10)]);

[Maple Plot]

Méthode d'Euler sur un exemple simple

La méthode proprement dite

> euler:=gnagna;

Error, attempting to assign to `euler` which is protected

comprendo english ?

> eulerrr:=proc(f,N,pas,y0)
local k,s,y;
y:=evalf(y0):s:=y0;
for k from 0 to N-1
do
y:=y+f(y)*pas:s:=s,y
od;
RETURN([s])
end:

> eulerrr(t->t,10,.1,1);

[1, 1.1, 1.21, 1.331, 1.4641, 1.61051, 1.771561, 1....
[1, 1.1, 1.21, 1.331, 1.4641, 1.61051, 1.771561, 1....

Toolbox

Il faut générer la suite de polygones

> moulinette:=(l,pas,t0)->[seq([t0+k*pas,l[k+1]],k=0..nops(l)-1)];

moulinette := proc (l, pas, t0) options operator, a...

> moulinette(eulerrr(t->t,10,.1,1),.1,0);

[[0., 1], [.1, 1.1], [.2, 1.21], [.3, 1.331], [.4, ...
[[0., 1], [.1, 1.1], [.2, 1.21], [.3, 1.331], [.4, ...

> plot(%);

[Maple Plot]

Comparaison avec la vraie solution

> with(plots):

Warning, the name changecoords has been redefined

> display(plot(moulinette(eulerrr(t->t,10,.1,1),.1,0)),plot(exp,0..1,color=blue));

[Maple Plot]

Résolution numérique de maple

> ?numeric

NDLR : la méthode de Runge-Kutta est grosso-modo une amélioration TRES sensible de la rustique méthode d'Euler

> f:=dsolve({D(y)(t)=y(t),y(0)=1},y(t),type=numeric,range=0..1);

f := proc (rkf45_x) local i, comp_soln_data, odepro...

> ?odeplot

> odeplot(f);

[Maple Plot]

> display(plot(exp,0..1,color=blue),odeplot(f));

[Maple Plot]

Elles sont confondues...

> comparaison_euler:=proc(f,t0,y0,N,pas)
local y;
y:=dsolve({D(y)(t)=f(y(t)),y(t0)=y0},y(t),type=numeric,range=t0..t0+N*pas);
RETURN(display([plot(moulinette(eulerrr(f,N,pas,y0),pas,t0),color=blue),odeplot(y)]))
end;

comparaison_euler := proc (f, t0, y0, N, pas) local...
comparaison_euler := proc (f, t0, y0, N, pas) local...
comparaison_euler := proc (f, t0, y0, N, pas) local...
comparaison_euler := proc (f, t0, y0, N, pas) local...
comparaison_euler := proc (f, t0, y0, N, pas) local...

Influence du pas...

> comparaison_euler(t->t,0,1,5,1);

[Maple Plot]

> comparaison_euler(t->t,0,1,10,.5);

[Maple Plot]

> comparaison_euler(t->t,0,1,100,.05);

[Maple Plot]

> comparaison_euler(t->t,0,1,1000,.005);

[Maple Plot]

Trois nouveaux exemples

Une fonction "qui explose"

> dsolve({D(y)(t)=exp(y(t)),y(0)=0},y(t));

y(t) = ln(-1/(t-1))

> comparaison_euler(exp,0,0,10,.09999);

[Maple Plot]

> comparaison_euler(exp,0,0,100,.009999);

[Maple Plot]

> comparaison_euler(exp,0,0,1000,.0009999);

[Maple Plot]

Un cas "sans solution simple"

> dsolve({D(y)(t)=sin(y(t)),y(0)=1},y(t));

y(t) = arctan(exp(t)/(exp(I)+1)*(2*I-2*I*exp(I))/(1...

> simplify(%);

y(t) = arctan(-2*I*exp(t)*(exp(2*I)-1)/(exp(2*I)+2*...
y(t) = arctan(-2*I*exp(t)*(exp(2*I)-1)/(exp(2*I)+2*...

> comparaison_euler(sin,0,1,10,2);

[Maple Plot]

> comparaison_euler(sin,0,1,20,1);

[Maple Plot]

Un dernier pour la route

> dsolve({D(y)(t)=exp(sin(y(t))),y(0)=0},y(t));

y(t) = RootOf(-t+Int(exp(-sin(_a)),_a = 0 .. _Z))

> comparaison_euler(t->exp(sin(t)),0,0,100,1);

[Maple Plot]

> comparaison_euler(t->exp(sin(t)),0,0,1000,.1);

[Maple Plot]

>

Même Runge et Kutta réunis ont du mal...

> dsolve({D(D(y))(t)-y(t)=0,y(0)=1,D(y)(0)=-1},y(t));

y(t) = exp(-t)

> f:=dsolve({D(D(y))(t)-y(t)=0,y(0)=1,D(y)(0)=-1},y(t),type=numeric);

f := proc (rkf45_x) local i, comp_soln_data, odepro...

> display({odeplot(f,0..1),plot(exp(-t),t=0..1,color=blue)});

[Maple Plot]

Jusque là ça va (les deux courbes sont confondues)...

> display({odeplot(f,0..10),plot(exp(-t),t=0..10,color=blue)});

[Maple Plot]

Exercice : expliquer !