%% syntaxe : a f x0 y0 h baserungekutta --> depose les points, calcules par
%% la methode de Runge-Kutta (à pas fixe), de la courbe sur
%% [x0, a] de la fonction h solution de l'equa diff y' = f (x, y)
%% verifiant h (x0) = y0
%% Plus precisement :
%% yn+1 = yn + (1/6) (k1 + 2k2 + 2k3 + k4)
%% avec
%% k1 = h f(xn, yn)
%% k2 = h f(xn + .5h, yn + .5 k1)
%% k3 = h f(xn + .5 h, yn + .5 k2)
%% k4 = h f(xn + h, yn + k3)
%% attention : on peut avoir a < x0, mais dans ce cas h doit etre negatif
%% autre syntaxe : a f x0 y0 n baserungekutta ou n est le nombre de points
%% calcules. Il y aura alors n+1 points deposes sur la pile : (x0, y0)
%% plus les n suivants
/baserungekutta {
14 dict begin
/v@r exch def
/y0 exch def
/x0 exch def
/@f exch def %% y'= @f (x, y)
/a exch def
/yn+1 0 def
/xn x0 def
/yn y0 def
/k1 0 def
/k2 0 def
/k3 0 def
/k4 0 def
v@r isinteger { %% si v@r est entier
/n v@r def %% c'est que c'est le nombre de points
/h a x0 sub n div def
} { %% sinon, v@r n'est pas entier
/h v@r def %% et c'est le pas
/n a x0 sub h div truncate cvi def
} ifelse
x0 y0
%% sur [x0, a]
n {
/k1 h xn yn @f mul store
/k2 h xn .5 h mul add yn .5 k1 mul add @f mul store
/k3 h xn .5 h mul add yn .5 k2 mul add @f mul store
/k4 h xn h add yn k3 add @f mul store
/yn+1 yn k1 2 k2 mul add 2 k3 mul add k4 add 6 div add store
/yn yn+1 store
/xn xn h add store
xn yn
} repeat
end
} def
%% syntaxe : a b f x0 y0 h Rungekutta --> depose les points, calcules par
%% la methode de Runge-Kutta (à pas fixe), de la courbe sur
%% [a, b] de la fonction h solution de l'equa diff y' = f (x, y)
%% verifiant h (x0) = y0
%% Plus precisement :
%% yn+1 = yn + (1/6) (k1 + 2k2 + 2k3 + k4)
%% avec
%% k1 = h f(xn, yn)
%% k2 = h f(xn + .5h, yn + .5 k1)
%% k3 = h f(xn + .5 h, yn + .5 k2)
%% k4 = h f(xn + h, yn + k3)
%% autre syntaxe : a b f x0 y0 h Rungekutta ou n est le nb de points
%% sur chacun des intervalle [a, x0] et [x0, b]
/Rungekutta {
6 dict begin
/@h exch def %% le pas, ou le nb de points
/y@ exch def
/x@ exch def
/@@f exch def %% y'= @f (x, y)
/@b exch def
/@a exch def
%% sur [a, x0]
@a x@ lt {
[
@a {@@f} x@ y@ @h dup isinteger not {neg} if baserungekutta
]
reversep aload pop
x@ @b lt {
pop pop
} if
} if
%% sur [x0, b]
x@ @b lt {
@b {@@f} x@ y@ @h baserungekutta
} if
end
} def
%% syntaxe : f x0 y0 h rungekutta --> depose les points, calcules par
%% la methode de Runge-uyya, de la courbe sur [xmin, xmax] de la
%% fonction h solution de l'equa diff y' = f (x, y) verifiant h (x0) = y0
/rungekutta {
xmax 5 1 roll
xmin 6 1 roll
Rungekutta
} def
%% %% syntaxe : a f x0 y0 h baserungekutta --> depose les points, calcules par
%% %% la methode de Runge-Kutta (à pas fixe), de la courbe sur
%% %% [x0, a] de la fonction h solution de l'equa diff y' = f (x, y)
%% %% verifiant h (x0) = y0
%% %% Plus precisement :
%% %% yn+1 = yn + (1/6) (k1 + 2k2 + 2k3 + k4)
%% %% avec
%% %% k1 = h f(xn, yn)
%% %% k2 = h f(xn + .5h, yn + .5 k1)
%% %% k3 = h f(xn + .5 h, yn + .5 k2)
%% %% k4 = h f(xn + h, yn + k3)
%% %% attention : on peut avoir a < x0, mais dans ce cas h doit etre negatif
%% /baserungekutta {
%% 12 dict begin
%% /h exch def %% le pas
%% /y0 exch def
%% /x0 exch def
%% /@f exch def %% y'= @f (x, y)
%% /a exch def
%% /yn+1 0 def
%% /xn x0 def
%% /yn y0 def
%% /k1 0 def
%% /k2 0 def
%% /k3 0 def
%% /k4 0 def
%%
%% x0 y0
%% %% sur [x0, a]
%% a x0 sub h div truncate cvi {
%% /k1 h xn yn @f mul store
%% /k2 h xn .5 h mul add yn .5 k1 mul add @f mul store
%% /k3 h xn .5 h mul add yn .5 k2 mul add @f mul store
%% /k4 h xn h add yn k3 add @f mul store
%% /yn+1 yn k1 2 k2 mul add 2 k3 mul add k4 add 6 div add store
%% /yn yn+1 store
%% /xn xn h add store
%% xn yn
%% } repeat
%% end
%% } def
%%
%% %% syntaxe : a b f x0 y0 h Rungekutta --> depose les points, calcules par
%% %% la methode de Runge-Kutta (à pas fixe), de la courbe sur
%% %% [a, b] de la fonction h solution de l'equa diff y' = f (x, y)
%% %% verifiant h (x0) = y0
%% %% Plus precisement :
%% %% yn+1 = yn + (1/6) (k1 + 2k2 + 2k3 + k4)
%% %% avec
%% %% k1 = h f(xn, yn)
%% %% k2 = h f(xn + .5h, yn + .5 k1)
%% %% k3 = h f(xn + .5 h, yn + .5 k2)
%% %% k4 = h f(xn + h, yn + k3)
%% /Rungekutta {
%% 6 dict begin
%% /@h exch def %% le pas
%% /y@ exch def
%% /x@ exch def
%% /@@f exch def %% y'= @f (x, y)
%% /@b exch def
%% /@a exch def
%%
%% %% sur [a, x0]
%% @a x@ lt {
%% [
%% @a {@@f} x@ y@ @h neg baserungekutta
%% ]
%% reversep aload pop
%% x@ @b lt {
%% pop pop
%% } if
%% } if
%%
%% %% sur [x0, b]
%% x@ @b lt {
%% @b {@@f} x@ y@ @h baserungekutta
%% } if
%%
%% end
%% } def
%%
%% %% syntaxe : f x0 y0 h rungekutta --> depose les points, calcules par
%% %% la methode de Runge-uyya, de la courbe sur [xmin, xmax] de la
%% %% fonction h solution de l'equa diff y' = f (x, y) verifiant h (x0) = y0
%% /rungekutta {
%% xmax 5 1 roll
%% xmin 6 1 roll
%% Rungekutta
%% } def
|