Updated 2017-03-13 10:11:24 by arjen

Arjen Markus (10 february 2017) MathemaTcl is the name I chose for a collection of mathematical libraries (mostly from Netlib) that can be accessed from Tcl.

You can find the code here: [1].

To build it (or parts of it) you need a C and possibly a Fortran compiler that can build extensions for your version of Tcl.

Currently the following extensions are available:

  • CEPHES - a library for evaluating special mathematical function, such as the various Bessel functions and exponential integral functions.
  • FFTPACK - a one-dimensional FFT package (derived from the SLATEC library)
  • GLOBAL - a package to find the global minimum of a function of one or several variables
  • MILLER - a package containing several utilities by Alan Miller (currently: roots of a polynomial and a root of a function within a given interval)
  • QUADPACK - a package for the automatic integration of functions over finite or infinite intervals
  • SPECFUNC - a collection of routines to evaluate special mathematical functions, such as Bessel functions of the first and second kind, exponential integrals and the like.
  • WAVELIB - a library for wavelet transforms

Warning: This is work in progress at the moment. For most packages documentation is now available and several simple demonstrations, but they should be tested more extensively.

The build procedure has now been tested on a variety of systems (plain Windows, Cygwin and MinGw64/MSYS2 as well as Linux)

(updated: 13 march 2017)

Demo edit

# demo_fftpack.tcl --
#     Demonstration of the FFTPACK wrapper
#
#     Note: the transform is not normalised, hence the factor "size"
#
package require tcl_fftpack

set size 101

set transform [::fftpack::createTransform1D $size]

set PI [expr {acos(-1.0)}]

for {set i 0} {$i < $size} {incr i} {
    lappend values [expr {0.4+cos(2.0*$PI*$i/100.0)+sin(4.0*$PI*$i/100.0)}]
}

set oldvalues $values

set transformed [$transform forward $values]

puts "Transform:"
for {set i 0} {$i < $size/2+1} {incr i} {
    puts [format "%12.4f %12.4f" [lindex $transformed $i 0] [lindex $transformed $i 1]]
}

set reconstructed [$transform backward $transformed]

puts "Reconstructed and old values (unnormalised):"
for {set i 0} {$i < $size} {incr i} {
    puts [format "%12.4f %12.4f" [lindex $reconstructed $i] [expr {$size*[lindex $oldvalues $i]}]]
}