GeographicLib: GeographicLib::EllipticFunction Class Reference (original) (raw)

Elliptic integrals and functions. More...

#include <[GeographicLib/EllipticFunction.hpp](EllipticFunction%5F8hpp%5Fsource.html)>

Public Member Functions
Constructor
EllipticFunction (real k2=0, real alpha2=0)
EllipticFunction (real k2, real alpha2, real kp2, real alphap2)
void Reset (real k2=0, real alpha2=0)
void Reset (real k2, real alpha2, real kp2, real alphap2)
Inspector functions.
Math::real k2 () const
Math::real kp2 () const
Math::real alpha2 () const
Math::real alphap2 () const
Complete elliptic integrals.
Math::real K () const
Math::real E () const
Math::real D () const
Math::real KE () const
Math::real Pi () const
Math::real G () const
Math::real H () const
Incomplete elliptic integrals.
Math::real F (real phi) const
Math::real E (real phi) const
Math::real Ed (real ang) const
Math::real Einv (real x) const
Math::real Pi (real phi) const
Math::real D (real phi) const
Math::real G (real phi) const
Math::real H (real phi) const
Incomplete integrals in terms of Jacobi elliptic functions.
Math::real F (real sn, real cn, real dn) const
Math::real E (real sn, real cn, real dn) const
Math::real Pi (real sn, real cn, real dn) const
Math::real D (real sn, real cn, real dn) const
Math::real G (real sn, real cn, real dn) const
Math::real H (real sn, real cn, real dn) const
Periodic versions of incomplete elliptic integrals.
Math::real deltaF (real sn, real cn, real dn) const
Math::real deltaE (real sn, real cn, real dn) const
Math::real deltaEinv (real stau, real ctau) const
Math::real deltaPi (real sn, real cn, real dn) const
Math::real deltaD (real sn, real cn, real dn) const
Math::real deltaG (real sn, real cn, real dn) const
Math::real deltaH (real sn, real cn, real dn) const
Elliptic functions.
Math::real am (real x) const
Math::real am (real x, real &sn, real &cn, real &dn) const
void sncndn (real x, real &sn, real &cn, real &dn) const
Math::real Delta (real sn, real cn) const
Static Public Member Functions
Symmetric elliptic integrals.
static real RF (real x, real y, real z)
static real RF (real x, real y)
static real RC (real x, real y)
static real RG (real x, real y, real z)
static real RG (real x, real y)
static real RJ (real x, real y, real z, real p)
static real RD (real x, real y, real z)

Elliptic integrals and functions.

This provides the elliptic functions and integrals needed for Ellipsoid, GeodesicExact, and TransverseMercatorExact. Two categories of function are provided:

In the latter case, an object is constructed giving the modulus k (and optionally the parameter α2). The modulus is always passed as its square _k_2 which allows k to be pure imaginary (_k_2 < 0). (Confusingly, Abramowitz and Stegun call m = _k_2 the "parameter" and n = α2 the "characteristic".)

In geodesic applications, it is convenient to separate the incomplete integrals into secular and periodic components, e.g.,

\[ E(\phi, k) = (2 E(k) / \pi) [ \phi + \delta E(\phi, k) ] \]

where δ_E_(φ, k) is an odd periodic function with period π.

The computation of the elliptic integrals uses the algorithms given in

with the additional optimizations given in https://dlmf.nist.gov/19.36.i. The computation of the Jacobi elliptic functions uses the algorithm given in

The notation follows https://dlmf.nist.gov/19 and https://dlmf.nist.gov/22

Example of use:

#include

#include

#include

#include

using namespace std;

try {

cout << ell.K() << " " << ell.E() << "\n";

double phi = 20, sn, cn;

Math::sincosd(phi, sn ,cn);

cout << ell.E(phi * Math::degree()) << " "

<< ell.E(sn, cn, ell.Delta(sn, cn))

<< "\n";

cout << fixed << setprecision(16)

<< "RF(1,2,0) = " << EllipticFunction::RF(1,2) << "\n"

<< "RF(2,3,4) = " << EllipticFunction::RF(2,3,4) << "\n"

<< "RC(0,1/4) = " << EllipticFunction::RC(0,0.25) << "\n"

<< "RC(9/4,2) = " << EllipticFunction::RC(2.25,2) << "\n"

<< "RC(1/4,-2) = " << EllipticFunction::RC(0.25,-2) << "\n"

<< "RJ(0,1,2,3) = " << EllipticFunction::RJ(0,1,2,3) << "\n"

<< "RJ(2,3,4,5) = " << EllipticFunction::RJ(2,3,4,5) << "\n"

<< "RD(0,2,1) = " << EllipticFunction::RD(0,2,1) << "\n"

<< "RD(2,3,4) = " << EllipticFunction::RD(2,3,4) << "\n"

<< "RG(0,16,16) = " << EllipticFunction::RG(16,16) << "\n"

<< "RG(2,3,4) = " << EllipticFunction::RG(2,3,4) << "\n"

<< "RG(0,0.0796,4) = " << EllipticFunction::RG(0.0796,4) << "\n";

}

catch (const exception& e) {

cout << "Caught exception: " << e.what() << "\n";

}

}

int main(int argc, const char *const argv[])

Header for GeographicLib::EllipticFunction class.

Header for GeographicLib::Math class.

Elliptic integrals and functions.

Namespace for GeographicLib.

Definition at line 63 of file EllipticFunction.hpp.

GeographicLib::EllipticFunction::EllipticFunction ( real k2 = 0, real alpha2 = 0 ) inline

Constructor specifying the modulus and parameter.

Parameters

[in] k2 the square of the modulus _k_2. _k_2 must lie in (−∞, 1].
[in] alpha2 the parameter α2. α2 must lie in (−∞, 1].

Exceptions

If only elliptic integrals of the first and second kinds are needed, then set α2 = 0 (the default value); in this case, we have Π(φ, 0, k) = F(φ, k), G(φ, 0, k) = E(φ, k), and H(φ, 0, k) = F(φ, k) - D(φ, k).

Definition at line 90 of file EllipticFunction.hpp.

EllipticFunction() [2/2]

GeographicLib::EllipticFunction::EllipticFunction ( real k2, real alpha2, real kp2, real alphap2 ) inline

Constructor specifying the modulus and parameter and their complements.

Parameters

[in] k2 the square of the modulus _k_2. _k_2 must lie in (−∞, 1].
[in] alpha2 the parameter α2. α2 must lie in (−∞, 1].
[in] kp2 the complementary modulus squared _k'_2 = 1 − _k_2. This must lie in [0, ∞).
[in] alphap2 the complementary parameter α'2 = 1 − α2. This must lie in [0, ∞).

Exceptions

GeographicErr if k2, alpha2, kp2, or alphap2 is out of its legal range.

The arguments must satisfy k2 + kp2 = 1 and alpha2 + alphap2 = 1. (No checking is done that these conditions are met.) This constructor is provided to enable accuracy to be maintained, e.g., when k is very close to unity.

Definition at line 112 of file EllipticFunction.hpp.

Reset() [1/2]

void GeographicLib::EllipticFunction::Reset ( real k2 = 0, real alpha2 = 0 ) inline

Reset the modulus and parameter.

Parameters

[in] k2 the new value of square of the modulus _k_2 which must lie in (−∞, ]. done.)
[in] alpha2 the new value of parameter α2. α2 must lie in (−∞, 1].

Exceptions

Definition at line 126 of file EllipticFunction.hpp.

Reset() [2/2]

void GeographicLib::EllipticFunction::Reset ( real k2,
real alpha2,
real kp2,
real alphap2 )

Reset the modulus and parameter supplying also their complements.

Parameters

[in] k2 the square of the modulus _k_2. _k_2 must lie in (−∞, 1].
[in] alpha2 the parameter α2. α2 must lie in (−∞, 1].
[in] kp2 the complementary modulus squared _k'_2 = 1 − _k_2. This must lie in [0, ∞).
[in] alphap2 the complementary parameter α'2 = 1 − α2. This must lie in [0, ∞).

Exceptions

GeographicErr if k2, alpha2, kp2, or alphap2 is out of its legal range.

The arguments must satisfy k2 + kp2 = 1 and alpha2 + alphap2 = 1. (No checking is done that these conditions are met.) This constructor is provided to enable accuracy to be maintained, e.g., when is very small.

Definition at line 221 of file EllipticFunction.cpp.

References alpha2(), alphap2(), GeographicLib::Math::infinity(), k2(), kp2(), GeographicLib::Math::pi(), RC(), RD(), RF(), RG(), RJ(), and GeographicLib::Math::sq().

k2()

Math::real GeographicLib::EllipticFunction::k2 ( ) const inline

kp2()

Math::real GeographicLib::EllipticFunction::kp2 ( ) const inline

alpha2()

Math::real GeographicLib::EllipticFunction::alpha2 ( ) const inline

alphap2()

Math::real GeographicLib::EllipticFunction::alphap2 ( ) const inline

K()

Math::real GeographicLib::EllipticFunction::K ( ) const inline

E() [1/3]

Math::real GeographicLib::EllipticFunction::E ( ) const inline

D() [1/3]

Math::real GeographicLib::EllipticFunction::D ( ) const inline

KE()

Math::real GeographicLib::EllipticFunction::KE ( ) const inline

Pi() [1/3]

Math::real GeographicLib::EllipticFunction::Pi ( ) const inline

The complete integral of the third kind.

Returns

Π(α2, k).

Π(α2, k) is defined in https://dlmf.nist.gov/19.2.E7

\[ \Pi(\alpha^2, k) = \int_0^{\pi/2} \frac1{\sqrt{1-k^2\sin^2\phi}(1 - \alpha^2\sin^2\phi)}\,d\phi. \]

Definition at line 238 of file EllipticFunction.hpp.

Referenced by deltaPi(), Pi(), Pi(), GeographicLib::experimental::JacobiConformal::x(), GeographicLib::experimental::JacobiConformal::x(), GeographicLib::experimental::JacobiConformal::y(), and GeographicLib::experimental::JacobiConformal::y().

G() [1/3]

Math::real GeographicLib::EllipticFunction::G ( ) const inline

Legendre's complete geodesic longitude integral.

Returns

G(α2, k).

G(α2, k) is given by

\[ G(\alpha^2, k) = \int_0^{\pi/2} \frac{\sqrt{1-k^2\sin^2\phi}}{1 - \alpha^2\sin^2\phi}\,d\phi. \]

Definition at line 251 of file EllipticFunction.hpp.

Referenced by deltaG(), G(), and G().

H() [1/3]

Math::real GeographicLib::EllipticFunction::H ( ) const inline

Cayley's complete geodesic longitude difference integral.

Returns

H(α2, k).

H(α2, k) is given by

\[ H(\alpha^2, k) = \int_0^{\pi/2} \frac{\cos^2\phi}{(1-\alpha^2\sin^2\phi)\sqrt{1-k^2\sin^2\phi}} \,d\phi. \]

Definition at line 265 of file EllipticFunction.hpp.

Referenced by deltaH(), H(), and H().

F() [1/2]

Math::real GeographicLib::EllipticFunction::F ( real phi ) const

E() [2/3]

Math::real GeographicLib::EllipticFunction::E ( real phi ) const

Ed()

Math::real GeographicLib::EllipticFunction::Ed ( real ang ) const

Einv()

Math::real GeographicLib::EllipticFunction::Einv ( real x ) const

Pi() [2/3]

Math::real GeographicLib::EllipticFunction::Pi ( real phi ) const

The incomplete integral of the third kind.

Parameters

Returns

Π(φ, α2, k).

Π(φ, α2, k) is defined in https://dlmf.nist.gov/19.2.E7

\[ \Pi(\phi, \alpha^2, k) = \int_0^\phi \frac1{\sqrt{1-k^2\sin^2\theta}(1 - \alpha^2\sin^2\theta)}\,d\theta. \]

Definition at line 583 of file EllipticFunction.cpp.

References Delta(), deltaPi(), GeographicLib::Math::pi(), and Pi().

D() [2/3]

Math::real GeographicLib::EllipticFunction::D ( real phi ) const

G() [2/3]

Math::real GeographicLib::EllipticFunction::G ( real phi ) const

Legendre's geodesic longitude integral.

Parameters

Returns

G(φ, α2, k).

G(φ, α2, k) is defined by

\[ \begin{align} G(\phi, \alpha^2, k) &= \frac{k^2}{\alpha^2} F(\phi, k) + \biggl(1 - \frac{k^2}{\alpha^2}\biggr) \Pi(\phi, \alpha^2, k) \\ &= \int_0^\phi \frac{\sqrt{1-k^2\sin^2\theta}}{1 - \alpha^2\sin^2\theta}\,d\theta. \end{align} \]

Legendre expresses the longitude of a point on the geodesic in terms of this combination of elliptic integrals in Exercices de Calcul Intégral, Vol. 1 (1811), p. 181, https://books.google.com/books?id=riIOAAAAQAAJ&pg=PA181.

See Geodesics in terms of elliptic integrals for the expression for the longitude in terms of this function.

Definition at line 595 of file EllipticFunction.cpp.

References Delta(), deltaG(), G(), and GeographicLib::Math::pi().

H() [2/3]

Math::real GeographicLib::EllipticFunction::H ( real phi ) const

Cayley's geodesic longitude difference integral.

Parameters

Returns

H(φ, α2, k).

H(φ, α2, k) is defined by

\[ \begin{align} H(\phi, \alpha^2, k) &= \frac1{\alpha^2} F(\phi, k) + \biggl(1 - \frac1{\alpha^2}\biggr) \Pi(\phi, \alpha^2, k) \\ &= \int_0^\phi \frac{\cos^2\theta} {(1-\alpha^2\sin^2\theta)\sqrt{1-k^2\sin^2\theta}} \,d\theta. \end{align} \]

Cayley expresses the longitude difference of a point on the geodesic in terms of this combination of elliptic integrals in Phil. Mag. 40 (1870), p. 333, https://books.google.com/books?id=Zk0wAAAAIAAJ&pg=PA333.

See Geodesics in terms of elliptic integrals for the expression for the longitude in terms of this function.

Definition at line 601 of file EllipticFunction.cpp.

References Delta(), deltaH(), H(), and GeographicLib::Math::pi().

F() [2/2]

Math::real GeographicLib::EllipticFunction::F ( real sn,
real cn,
real dn ) const

The incomplete integral of the first kind in terms of Jacobi elliptic functions.

Parameters

[in] sn = sinφ.
[in] cn = cosφ.
[in] dn = sqrt(1 − _k_2 sin2φ).

Returns

F(φ, k) as though φ ∈ (−π, π].

Definition at line 429 of file EllipticFunction.cpp.

References K(), and RF().

E() [3/3]

Math::real GeographicLib::EllipticFunction::E ( real sn,
real cn,
real dn ) const

The incomplete integral of the second kind in terms of Jacobi elliptic functions.

Parameters

[in] sn = sinφ.
[in] cn = cosφ.
[in] dn = sqrt(1 − _k_2 sin2φ).

Returns

E(φ, k) as though φ ∈ (−π, π].

Definition at line 440 of file EllipticFunction.cpp.

References E(), RD(), and RF().

Pi() [3/3]

Math::real GeographicLib::EllipticFunction::Pi ( real sn,
real cn,
real dn ) const

The incomplete integral of the third kind in terms of Jacobi elliptic functions.

Parameters

[in] sn = sinφ.
[in] cn = cosφ.
[in] dn = sqrt(1 − _k_2 sin2φ).

Returns

Π(φ, α2, k) as though φ ∈ (−π, π].

Definition at line 475 of file EllipticFunction.cpp.

References Pi(), RF(), and RJ().

D() [3/3]

Math::real GeographicLib::EllipticFunction::D ( real sn,
real cn,
real dn ) const

Jahnke's incomplete elliptic integral in terms of Jacobi elliptic functions.

Parameters

[in] sn = sinφ.
[in] cn = cosφ.
[in] dn = sqrt(1 − _k_2 sin2φ).

Returns

D(φ, k) as though φ ∈ (−π, π].

Definition at line 463 of file EllipticFunction.cpp.

References D(), and RD().

G() [3/3]

Math::real GeographicLib::EllipticFunction::G ( real sn,
real cn,
real dn ) const

Legendre's geodesic longitude integral in terms of Jacobi elliptic functions.

Parameters

[in] sn = sinφ.
[in] cn = cosφ.
[in] dn = sqrt(1 − _k_2 sin2φ).

Returns

G(φ, α2, k) as though φ ∈ (−π, π].

Definition at line 490 of file EllipticFunction.cpp.

References G(), RF(), and RJ().

H() [3/3]

Math::real GeographicLib::EllipticFunction::H ( real sn,
real cn,
real dn ) const

Cayley's geodesic longitude difference integral in terms of Jacobi elliptic functions.

Parameters

[in] sn = sinφ.
[in] cn = cosφ.
[in] dn = sqrt(1 − _k_2 sin2φ).

Returns

H(φ, α2, k) as though φ ∈ (−π, π].

Definition at line 503 of file EllipticFunction.cpp.

References H(), RF(), and RJ().

deltaF()

Math::real GeographicLib::EllipticFunction::deltaF ( real sn,
real cn,
real dn ) const

The periodic incomplete integral of the first kind.

Parameters

[in] sn = sinφ.
[in] cn = cosφ.
[in] dn = sqrt(1 − _k_2 sin2φ).

Returns

the periodic function π F(φ, k) / (2 K(k)) - φ.

Definition at line 517 of file EllipticFunction.cpp.

References F(), K(), and GeographicLib::Math::pi().

Referenced by F().

deltaE()

Math::real GeographicLib::EllipticFunction::deltaE ( real sn,
real cn,
real dn ) const

deltaEinv()

Math::real GeographicLib::EllipticFunction::deltaEinv ( real stau,
real ctau ) const

deltaPi()

Math::real GeographicLib::EllipticFunction::deltaPi ( real sn,
real cn,
real dn ) const

The periodic incomplete integral of the third kind.

Parameters

[in] sn = sinφ.
[in] cn = cosφ.
[in] dn = sqrt(1 − _k_2 sin2φ).

Returns

the periodic function π Π(φ, α2, k) / (2 Π(α2, k)) - φ.

Definition at line 529 of file EllipticFunction.cpp.

References GeographicLib::Math::pi(), and Pi().

Referenced by Pi().

deltaD()

Math::real GeographicLib::EllipticFunction::deltaD ( real sn,
real cn,
real dn ) const

deltaG()

Math::real GeographicLib::EllipticFunction::deltaG ( real sn,
real cn,
real dn ) const

Legendre's periodic geodesic longitude integral.

Parameters

[in] sn = sinφ.
[in] cn = cosφ.
[in] dn = sqrt(1 − _k_2 sin2φ).

Returns

the periodic function π G(φ, k) / (2 G(k)) - φ.

Definition at line 541 of file EllipticFunction.cpp.

References G(), and GeographicLib::Math::pi().

Referenced by G().

deltaH()

Math::real GeographicLib::EllipticFunction::deltaH ( real sn,
real cn,
real dn ) const

am() [1/2]

Math::real GeographicLib::EllipticFunction::am ( real x ) const

am() [2/2]

Math::real GeographicLib::EllipticFunction::am ( real x,
real & sn,
real & cn,
real & dn ) const

The Jacobi amplitude function and associated elliptic functions.

Parameters

[in] x the argument.
[out] sn sn(x, k).
[out] cn cn(x, k).
[out] dn dn(x, k).

Returns

the value of am(x, k)

Definition at line 414 of file EllipticFunction.cpp.

References am(), and Delta().

sncndn()

void GeographicLib::EllipticFunction::sncndn ( real x,
real & sn,
real & cn,
real & dn ) const

The Jacobi elliptic functions.

Parameters

[in] x the argument.
[out] sn sn(x, k).
[out] cn cn(x, k).
[out] dn dn(x, k).

For this routine k is restricted to the interval [0, 1].

Definition at line 315 of file EllipticFunction.cpp.

References GEOGRAPHICLIB_PANIC, and std::swap().

Delta()

Math::real GeographicLib::EllipticFunction::Delta ( real sn, real cn ) const inline

The Δ amplitude function.

Parameters

Returns

Δ = sqrt(1 − _k_2 sin2φ).

Definition at line 607 of file EllipticFunction.hpp.

Referenced by am(), D(), E(), Ed(), Einv(), F(), G(), GeographicLib::GeodesicLineExact::GenPosition(), H(), Pi(), GeographicLib::experimental::JacobiConformal::x(), and GeographicLib::experimental::JacobiConformal::y().

RF() [1/2]

Math::real GeographicLib::EllipticFunction::RF ( real x, real y, real z ) static

Symmetric integral of the first kind R F.

Parameters

Returns

R F(x, y, z).

R F is defined in https://dlmf.nist.gov/19.16.E1

\[ R_F(x, y, z) = \frac12 \int_0^\infty\frac1{\sqrt{(t + x) (t + y) (t + z)}}\, dt, \]

where at most one of arguments, x, y, z, can be zero and those arguments that are nonzero must be positive. If one of the arguments is zero, it is more efficient to call the two-argument version of this function with the non-zero arguments.

Definition at line 24 of file EllipticFunction.cpp.

Referenced by E(), F(), G(), H(), Pi(), GeographicLib::AuxLatitude::Rectifying(), Reset(), and RG().

RF() [2/2]

Math::real GeographicLib::EllipticFunction::RF ( real x, real y ) static

RC()

Math::real GeographicLib::EllipticFunction::RC ( real x, real y ) static

Degenerate symmetric integral of the first kind R C.

Parameters

Returns

R C(x, y) = R F(x, y, y).

R C is defined in https://dlmf.nist.gov/19.2.E17

\[ R_C(x, y) = \frac12 \int_0^\infty\frac1{\sqrt{t + x}(t + y)}\,dt, \]

where x ≥ 0 and y > 0.

Definition at line 76 of file EllipticFunction.cpp.

Referenced by Reset(), and RJ().

RG() [1/2]

Math::real GeographicLib::EllipticFunction::RG ( real x, real y, real z ) static

Symmetric integral of the second kind R G.

Parameters

Returns

R G(x, y, z).

R G is defined in Carlson, eq 1.5

\[ R_G(x, y, z) = \frac14 \int_0^\infty[(t + x) (t + y) (t + z)]^{-1/2} \biggl( \frac x{t + x} + \frac y{t + y} + \frac z{t + z} \biggr)t\,dt, \]

where at most one of arguments, x, y, z, can be zero and those arguments that are nonzero must be positive. See also https://dlmf.nist.gov/19.23.E6_5. If one of the arguments is zero, it is more efficient to call the two-argument version of this function with the non-zero arguments.

Definition at line 91 of file EllipticFunction.cpp.

References RD(), RF(), and RG().

Referenced by GeographicLib::AuxLatitude::RectifyingRadius(), Reset(), and RG().

RG() [2/2]

Math::real GeographicLib::EllipticFunction::RG ( real x, real y ) static

RJ()

Math::real GeographicLib::EllipticFunction::RJ ( real x, real y, real z, real p ) static

Symmetric integral of the third kind R J.

Parameters

[in] x
[in] y
[in] z
[in] p

Returns

R J(x, y, z, p).

R J is defined in https://dlmf.nist.gov/19.16.E2

\[ R_J(x, y, z, p) = \frac32 \int_0^\infty [(t + x) (t + y) (t + z)]^{-1/2} (t + p)^{-1}\, dt, \]

where p > 0, and x, y, z are nonnegative with at most one of them being 0.

Definition at line 123 of file EllipticFunction.cpp.

References RC(), and GeographicLib::Math::sq().

Referenced by G(), H(), Pi(), and Reset().

RD()

Math::real GeographicLib::EllipticFunction::RD ( real x, real y, real z ) static

Degenerate symmetric integral of the third kind R D.

Parameters

Returns

R D(x, y, z) = R J(x, y, z, z).

R D is defined in https://dlmf.nist.gov/19.16.E5

\[ R_D(x, y, z) = \frac32 \int_0^\infty[(t + x) (t + y)]^{-1/2} (t + z)^{-3/2}\, dt, \]

where x, y, z are positive except that at most one of x and y can be 0.

Definition at line 177 of file EllipticFunction.cpp.

Referenced by D(), E(), GeographicLib::AuxLatitude::Rectifying(), Reset(), and RG().


The documentation for this class was generated from the following files: