> | restart; |
> | fact:=2:N_0:=16: |
On calcule differentes séries de valeurs approchées avec N croissant suivant une suite géométrique de raison fact de premier terme N_0
> |
Approximations successives pour y'=y
On étudie les équations différentielles sur l'intervalle [t_0,t_max]
ici [t_0,t_max]=[0,5]
> | t_0:=0:t_max:=5:y_0:=1:f:=(t,y)->y: |
la condition initiale est donnée par y(t_0)=y_0
ici y(0)=1
l'Equation différentielle de référence est
> | EDO:=diff(y(t),t)=f(t,y(t)); |
> |
> | On place dans la variable Courbes: |
> | 5 courbes intégrales approchées calculées pour N prenant les 5 premières valeurs de la suite géométrique annoncée ci-dessus: 16, 32, 64, 128, 256 |
> | Courbes:=seq(Interpol(Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))),i=0..4): |
> |
On trace ces différentes courbes en prenant les couleurs successives bleu, rouge, noir, vert, orange (pour N croissant)
> | plot([Courbes],t_0..t_max,color=[blue,red,black,green,orange]); |
On observe que la précision des courbes intégrales augmente au fur et à mesure que N augmente
Par manque de capacité, sans doute, le tracé de la dernière courbe correspondant à N=256 "s'arrête" avant t_max
Approximations successives pour y'=-ty
On étudie les équations différentielles sur l'intervalle [t_0,t_max]
ici [t_0,t_max]=[0,1]
> | t_0:=0:t_max:=1:y_0:=1:f:=(t,y)->-y*t: |
la condition initiale est donnée par y(t_0)=y_0
ici y(0)=1
l'Equation différentielle de référence est
> | EDO:=diff(y(t),t)=f(t,y(t)); |
> | On place dans la variable Courbes: |
> | 5 courbes intégrales approchées calculées pour N prenant les 5 premières valeurs de la suite géométrique annoncée ci-dessus: 16, 32, 64, 128, 256 |
> | Courbes:=seq(Interpol(Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))),i=0..4): |
> |
> |
On trace ces différentes courbes en prenant les couleurs successives bleu, rouge, noir, vert, orange (pour N croissant)
> | plot([Courbes],t_0..t_max,color=[blue,red,black,green,orange]); |
> |
> |
> |
> |
Approximations successives pour y'=1/racine(t+10^-9)
On étudie les équations différentielles sur l'intervalle [t_0,t_max]
ici [t_0,t_max]=[0,0.001]
> | t_0:=0:t_max:=.001:y_0:=1:f:=(t,y)->1/sqrt(t+0.000000001): |
la condition initiale est donnée par y(t_0)=y_0
ici y(0)=1
l'Equation différentielle de référence est
> | EDO:=diff(y(t),t)=f(t,y(t)); |
> | On place dans la variable Courbes: |
> | 5 courbes intégrales approchées calculées pour N prenant les 5 premières valeurs de la suite géométrique annoncée ci-dessus: 16, 32, 64, 128, 256 |
> | Courbes:=seq(Interpol(Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))[1],Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))[2]),i=0..4): |
> |
On trace ces différentes courbes en prenant les couleurs successives bleu, rouge, noir, vert, orange (pour N croissant)
> | plot([Courbes],t_0..t_max,color=[blue,red,black,green,orange]); |
ici on observe que l'approximation est mauvaise pour des petites valeurs de N et meilleure pour N grand, est-elle pour autant assez fine.
En fait l'approximation d'Euler est mise à rude épreuve puisque pour t=0 la tangente de la solution exacte est quasi verticale et donc l'identification entre corde et tangente est d'autant moins bonne.
> |
Faisons un "Zoom" sur ces courbes...
On travaille cette fois-ci sur l'intervalle [t_0,t_max]=[0,0.00001]
> | t_max:=.00001: |
> | Courbes:=seq(Interpol(Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))[1],Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))[2]),i=0..4): |
> | plot([Courbes],t_0..t_max,color=[blue,red,black,green,orange]); |
> |
> | Malgre la finesse de la subdivision (on o maillé un trés petit intervalle avec N instants), les variations entre les différentes approximations restent élèvées
En effet la solution a une tangente quasi verticale à l'origine ce qui entraine par la méthode d'Euler de grandes déviations dans le calcul des valeurs voisines |
Approximations successives pour y'=sin[1/(t+10^-9)]
On étudie les équations différentielles sur l'intervalle [t_0,t_max]
ici [t_0,t_max]=[0,1]
> | t_0:=0:t_max:=1:y_0:=1:f:=(t,y)->sin(1/(t+0.000000001)): |
la condition initiale est donnée par y(t_0)=y_0
ici y(0)=1
l'Equation différentielle de référence est
> | EDO:=diff(y(t),t)=f(t,y(t)); |
> | On place dans la variable Courbes: |
> | 5 courbes intégrales approchées calculées pour N prenant les 5 premières valeurs de la suite géométrique annoncée ci-dessus: 32, 64, 128, 256,1024 |
> | Courbes:=seq(Interpol(Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))[1],Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))[2]),i=1..5): |
> |
On trace ces différentes courbes en prenant les couleurs successives bleu, rouge, noir, vert, orange (pour N croissant)
> | plot([Courbes],t_0..t_max,color=[blue,red,black,green,orange]); |
> |
les courbes à grande échelle semblent assez proches les unes des autres et donc probablement assez fidéles à la solution exacte.
Regardons les courbes sur une plus petite echelle, ce qui doit encore ameliorer la justesse du résultat
Faisons un "Zoom" sur ces courbes...
On travaille cette fois-ci sur l'intervalle [t_0,t_max]=[0,0.1]
> | t_max:=.1: |
> | Courbes:=seq(Interpol(Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))[1],Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))[2]),i=0..4): |
> | plot([Courbes],t_0..t_max,color=[blue,red,black,green,orange]); |
les courbes semblent ici bien plus chaotiques et peu proches les unes des autres
Regardons à plus petite échelle
Faisons un "Zoom" sur ces courbes...
On travaille cette fois-ci sur l'intervalle [t_0,t_max]=[0,0.0001]
> | t_max:=.0001: |
> | Courbes:=seq(Interpol(Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))[1],Euler(f,t_0,y_0,N_0*fact^i,(t_max-t_0)/(N_0*fact^i))[2]),i=0..4): |
> | plot([Courbes],t_0..t_max,color=[blue,red,black,green,orange]); |
Ici la fonction sin(1/t) fluctue énormément au voisinage de 0, ce qui explique que pour des petites valeurs (malgré un maillage plus fin) l'approximation est moins fidèle