Source PostScript (rungekutta.pps)

Retour Texte non formaté
%% 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