\ elip12 Complete Elliptic Integrals ACM Algorithms #55 and # 56 \ Forth Scientific Library Algorithm #28 \ Evaluates the Complete Elliptic Integral of the first kind, \ K[k] = int_0^{\pi/2} 1/Sqrt{ 1 - k^2 Sin^2(v)} dv \ and of the second kind, \ E[k] = int_0^{\pi/2} Sqrt{ 1 - k^2 Sin^2(v)} dv \ Note: \ Uses the MODULUS k (the parameter m = k^2). \ These algorithms are not suitable for k = 1, and the accuracy \ breaks down very near k = 1 ( 0.999999 ) \ These evaluations are by polynomial expansions, the accuracy is \ controlled by the polynomial coefficients to about 7 places. \ This is an ANS Forth program requiring: \ 1. The Floating-Point word set \ 3. Uses the words 'FLOAT' and Array to create floating point arrays. \ 4. The word '}' to dereference a one-dimensional array. \ 5. Uses the word '}Horner' (FSL #3) for fast polynomial evaluation. \ 6. The compilation of the test code is controlled by \ the conditional compilation words in the Programming-Tools wordset \ 7. This program requires a FLOATING-STACK of at least 16 floats. \ Collected Algorithms from ACM, Volume 1 Algorithms 1-220, \ 1980; Association for Computing Machinery Inc., New York, \ ISBN 0-89791-017-6 \ (c) Copyright 1994 Everett F. Carter. Permission is granted by the \ author to use this software for any application provided this \ copyright notice is preserved. \ ( ELIP12 V1.1 3 December 1994 EFC ) \ 16 constant floating-stack \ include lib/ansfloat.4th \ include lib/fsl-util.4th [UNDEFINED] K[k] [IF] [UNDEFINED] }horner [IF] include lib/horner.4th [THEN] [UNDEFINED] fln [IF] include lib/flnflog.4th [THEN] 4 FLOAT [*] 1 [+] ARRAY K-Coefs1{ 4 FLOAT [*] 1 [+] ARRAY K-Coefs2{ 3 FLOAT [*] 1 [+] ARRAY E-Coefs1{ 4 FLOAT [*] 1 [+] ARRAY E-Coefs2{ FLOAT K-Coefs1{ FSL-ARRAY FLOAT K-Coefs2{ FSL-ARRAY FLOAT E-Coefs1{ FSL-ARRAY FLOAT E-Coefs2{ FSL-ARRAY :THIS K-Coefs1{ DOES> (FSL-ARRAY) ; :THIS K-Coefs2{ DOES> (FSL-ARRAY) ; :THIS E-Coefs1{ DOES> (FSL-ARRAY) ; :THIS E-Coefs2{ DOES> (FSL-ARRAY) ; : init-coefs S" 0.5" S>FLOAT K-Coefs1{ 0 } F! S" 0.12475074" S>FLOAT K-Coefs1{ 1 } F! S" 0.060118519" S>FLOAT K-Coefs1{ 2 } F! S" 0.010944912" S>FLOAT K-Coefs1{ 3 } F! S" 1.3862944" S>FLOAT K-Coefs2{ 0 } F! S" 0.097932891" S>FLOAT K-Coefs2{ 1 } F! S" 0.054544409" S>FLOAT K-Coefs2{ 2 } F! S" 0.032024666" S>FLOAT K-Coefs2{ 3 } F! S" 0.24969795" S>FLOAT E-Coefs1{ 0 } F! S" 0.08150224" S>FLOAT E-Coefs1{ 1 } F! S" 0.01382999" S>FLOAT E-Coefs1{ 2 } F! 1 S>F E-Coefs2{ 0 } F! S" 0.44479204" S>FLOAT E-Coefs2{ 1 } F! S" 0.085099193" S>FLOAT E-Coefs2{ 2 } F! S" 0.040905094" S>FLOAT E-Coefs2{ 3 } F! ; : K[k] ( -- ) ( F: k -- K[k] ) \ ACM Algorithm #55 FDUP F* 1 S>F FSWAP F- FDUP K-Coefs2{ 3 }Horner FSWAP FDUP K-Coefs1{ 3 }Horner FSWAP FLN F* F- ; : E[k] ( -- ) ( F: k -- K[k] ) \ ACM Algorithm #56 FDUP F* 1 S>F FSWAP F- FDUP E-Coefs2{ 3 }Horner FSWAP FDUP E-Coefs1{ 2 }Horner FOVER F* FSWAP FLN F* F- ; fclear init-coefs false [IF] \ test code ========================================== \ convert a modulus angle in degrees to the modulus \ : modulus PI F* 180 S>F F/ FCOS FDUP F* 1 S>F FSWAP F- FSQRT ; \ test driver, calculates the complete elliptic integral of the first \ and second kind compare with Abramowitz & Stegun, \ Handbook of Mathematical Functions, Table 17.1 : EK_test ( -- ) fclear 10 set-precision CR ." m k E(k) exact K(k) exact E(k) K(k) " CR ." 0.0 0.0 1.57079633 1.57079633 " 0 S>F FDUP E[k] F. K[k] F. CR ." 0.44 0.66332495 1.38025877 1.80632756 " S" 0.66332495" S>FLOAT FDUP E[k] F. K[k] F. CR ." 0.75 0.86602539 1.21105603 2.15651565 " S" 0.86602539"S>FLOAT FDUP E[k] F. K[k] F. CR ." 0.96 0.97979589 1.05050223 3.01611249 " S" 0.97979589" S>FLOAT FDUP E[k] F. K[k] F. CR ; EK_test [THEN] [DEFINED] 4TH# [IF] hide K-Coefs1{ hide K-Coefs2{ hide E-Coefs1{ hide E-Coefs2{ hide init-coefs [THEN] [THEN]