Home
Manual
Packages
Global Index
Keywords
Quick Reference
|
/*
ELLIPSE.I
Complete elliptic integrals.
(Maybe someday can find cn, sn, dn algorithms...)
$Id$
*/
/* Copyright (c) 1994. The Regents of the University of California.
All rights reserved. */
/* ------------------------------------------------------------------------ */
func EllipticK (k)
/* DOCUMENT EllipticK(k)
return E(k), the complete Elliptic Function
integral from 0 to pi/2 of 1/sqrt(1-k^2 *(sin(x))^2) dx
uses the arithmetic/geometric mean method. (Abramowitz & Stegun p598)
k must lie in -1 < k <1.
E(k) diverges as log(4/sqrt(1-k^2)) as k->1
SEE ALSO: EllipticE
*/
{
EPS= 1.E-15;
a= 1.0;
b= sqrt(1.0-k*k);
c= abs(k);
do {
an= 0.5*(a+b);
bn= sqrt(a*b);
cn= 0.5*(a-b);
a= an;
b= bn;
c= cn;
} while (anyof(abs(c)>EPS));
return 0.5*pi/a;
}
func EllipticE (k)
/* DOCUMENT EllipticE(k)
return E(k), the complete Elliptic Function
integral from 0 to pi/2 of sqrt(1-k^2 *(sin(x))^2) dx
k must lie in -1<= k <=1
Uses the arithmetic/geometric mean method. (Abramowitz & Stegun p598)
SEE ALSO: EllipticK
*/
{
EPS= 1.E-15;
/* Separate out k=1 since K diverges and d->1 */
mask= (abs(k)==1.0);
list= where(mask);
if (numberof(list)) E1= array(1.0,numberof(list));
list= where(!mask);
if (numberof(list)) {
c= k(list);
a= 1.0;
b= sqrt(1.0-c*c);
d= 0.0;
twofact= 0.5;
do {
an= 0.5*(a+b);
bn= sqrt(a*b);
cn= 0.5*(a-b);
dn= d + twofact*c*c;
twofact*= 2.0;
a= an;
b= bn;
c= cn;
d= dn;
} while (anyof(abs(c)>EPS));
En1= 0.5*pi*(1.0-d)/a;
}
/* merge k=1 and k!=1 results */
return merge(E1,En1,mask);
}
/* ------------------------------------------------------------------------ */
|