# -*- tcl -*- # eliptic.test -- # Test cases for the ::math::special package (Elliptic integrals) # # This file contains a collection of tests for one or more of the Tcllib # procedures. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 2004 by Arjen Markus. All rights reserved. # # RCS: @(#) $Id: elliptic.test,v 1.12 2007/08/21 17:33:00 andreas_kupries Exp $ # ------------------------------------------------------------------------- source [file join \ [file dirname [file dirname [file join [pwd] [info script]]]] \ devtools testutilities.tcl] testsNeedTcl 8.5;# statistics,linalg! testsNeedTcltest 2.1 support { useLocal math.tcl math useLocal constants.tcl math::constants useLocal linalg.tcl math::linearalgebra ;# for statistics useLocal statistics.tcl math::statistics useLocal polynomials.tcl math::polynomials } testing { useLocal special.tcl math::special } # ------------------------------------------------------------------------- # As the values were given with four digits, an absolute # error is most appropriate proc matchNumbers {expected actual} { set match 1 foreach a $actual e $expected { #puts "abs($a-$e) = [expr {abs($a-$e)}]" if {abs($a-$e) > 0.1e-5} { set match 0 break } } return $match } ::tcltest::customMatch numbers matchNumbers # ------------------------------------------------------------------------- test "Elliptic-1.0" "Complete elliptic integral of the first kind" \ -match numbers -body { set result {} foreach k2 {0.0 0.1 0.2 0.4 0.5 0.7 0.8 0.95} { set k [expr {sqrt($k2)}] lappend result [::math::special::elliptic_K $k] } set result } -result {1.570796 1.612441 1.659624 1.777519 1.854075 2.075363 2.257205 2.908337} test "Elliptic-2.0" "Complete elliptic integral of the second kind" \ -match numbers -body { set result {} foreach k2 {0.0 0.1 0.2 0.4 0.5 0.7 0.8 0.95} { set k [expr {sqrt($k2)}] lappend result [::math::special::elliptic_E $k] } set result } -result {1.570796 1.530758 1.489035 1.399392 1.350644 1.241671 1.17849 1.060474} # Jacobi elliptic functions: cn, sn and dn set um_pairs { 0 0 0 0.1 0 0.8 0.1 0.1 0.1 0.2 0.1 0.5 0.1 0.7 0.1 0.8 0.2 0.01 0.2 0.1 0.2 0.5 0.3 0.01 0.3 0.1 0.3 0.5 0.4 0.01 0.5 0.01 0.5 0.1 0.6 0.1 0.7 0.1 0.8 0.1 0.8 0.5 0.9 0.01 0.9 0.1 0.9 0.5 0.99 0.5 } test "Elliptic-3.1" "Jacobi elliptic cn function" \ -match numbers -body { set result {} foreach {u m} $um_pairs { set k [expr {sqrt($m)}] lappend result [::math::special::cn $u $k] } set result } -result {1.000000 1.000000 1.000000 0.995006 0.995007 0.995012 0.995016 0.995017 0.980069 0.980093 0.980198 0.955350 0.955467 0.955986 0.921101 0.877678 0.878530 0.827220 0.768165 0.702062 0.722917 0.622418 0.629653 0.660895 0.602576} test "Elliptic-3.2" "Jacobi elliptic sn function" \ -match numbers -body { set result {} foreach {u m} $um_pairs { set k [expr {sqrt($m)}] lappend result [::math::special::sn $u $k] } set result } -result {0.000000 0.000000 0.000000 0.0998169 0.0998003 0.0997507 0.0997176 0.0997011 0.198656 0.198540 0.198022 0.295478 0.295098 0.293413 0.389323 0.479252 0.477687 0.561878 0.640252 0.712115 0.690935 0.782685 0.776876 0.750478 0.798062} test "Elliptic-3.3" "Jacobi elliptic dn function" \ -match numbers -body { set result {} foreach {u m} $um_pairs { set k [expr {sqrt($m)}] lappend result [::math::special::dn $u $k] } set result } -result {1.000000 1.000000 1.000000 0.999502 0.999003 0.997509 0.996514 0.996016 0.999803 0.998027 0.990148 0.999563 0.995636 0.978241 0.999242 0.998851 0.988525 0.984088 0.979289 0.974315 0.872528 0.996932 0.969354 0.847580 0.825560} # End of test cases testsuiteCleanup