Example of use : the Runge-Kutta algorithm
package require math::bigfloat
namespace import ::math::bigfloat::*
# compute y'=f(t,y) with the initial value y(0)
# here t0..tn and n are the steps and their number
# f is the function (with two arguments : t and y)
# y0 is y(0)
proc RungeKutta4 {t0 tn f y0 n} {
# f(x_0)=current value
set t $t0
# y(initial_value)
set y $y0
set step [div [sub $tn $t0] [fromstr $n]]
set half_step [div $step [fromstr 2]]
# from x_1 to x_N
for {set i 0} {$i < $n} {incr i} {
set k1 [$f $t $y]
set k2 [$f [add $t $half_step] [add $y [mul $half_step $k1]]]
set k3 [$f [add $t $half_step] [add $y [mul $half_step $k2]]]
set k4 [$f [add $t $step] [add $y [mul $step $k3]]]
set slope [div [add [div [add $k1 $k4] [fromstr 2]] [add $k2 $k3]] [fromstr 3]]
set y [add $y [mul $slope $step]]
set t [add $t $step]
}
# the return value is a bigfloat
return $y
}
proc ident {t y} {
set y
}
# y'(t)=y(t) and y(0)=1
set x0 [fromstr 0.0 10]
set y0 [fromstr 1.0 10]
set xEnd [fromstr 1.0 10]
set steps 100
puts "With RK4 exp(1)=[tostr [RungeKutta4 $x0 $xEnd ident $y0 $steps]]"
puts "Real value equals : [tostr [exp $xEnd]]"See BigFloat for Tcl.

