Runge-Kutta method: Difference between revisions

OCaml implementation
(→‎{{header|REXX}}: added the REXX language. -- ~~~~)
(OCaml implementation)
Line 410:
 
for i from 1 step 10 thru 101 do print(x[i], " ", y[i], " ", y[i] - s[i]);</lang>
=={{header|OCaml}}==
<lang ocaml>let y' t y = t *. sqrt y
let exact t = let u = 0.25*.t*.t +.1.0 in u*.u
 
let rk4_step (y,t) h =
let k1 = h *. y' t y in
let k2 = h *. y' (t +. 0.5*.h) (y +. 0.5*.k1) in
let k3 = h *. y' (t +. 0.5*.h) (y +. 0.5*.k2) in
let k4 = h *. y' (t +. h) (y +. k3) in
(y +. (k1+.k4)/.6.0 +. (k2+.k3)/.3.0, t +. h)
 
let rec loop h n (y,t) =
if n mod 10 = 1 then
Printf.printf "t = %f,\ty = %f,\terr = %g\n" t y (abs_float (y-.exact t));
if n < 102 then loop h (n+1) (rk4_step (y,t) h)
 
let _ = loop 0.1 1 (1.0, 0.0)</lang>
Output:<pre>t = 0.000000, y = 1.000000, err = 0
t = 1.000000, y = 1.562500, err = 1.45722e-07
t = 2.000000, y = 3.999999, err = 9.19479e-07
t = 3.000000, y = 10.562497, err = 2.90956e-06
t = 4.000000, y = 24.999994, err = 6.23491e-06
t = 5.000000, y = 52.562489, err = 1.08197e-05
t = 6.000000, y = 99.999983, err = 1.65946e-05
t = 7.000000, y = 175.562476, err = 2.35177e-05
t = 8.000000, y = 288.999968, err = 3.15652e-05
t = 9.000000, y = 451.562459, err = 4.07232e-05
t = 10.000000, y = 675.999949, err = 5.09833e-05</pre>
 
=={{header|Perl 6}}==
Anonymous user