Jacobi Elliptic Functions

This module implements the 12 Jacobi elliptic functions, along with their inverses and the Jacobi amplitude function.

Jacobi elliptic functions can be thought of as generalizations of both ordinary and hyperbolic trig functions. There are twelve Jacobian elliptic functions. Each of the twelve corresponds to an arrow drawn from one corner of a rectangle to another.

n ------------------- d
|                     |
|                     |
|                     |
s ------------------- c

Each of the corners of the rectangle are labeled, by convention, s, c, d, and n. The rectangle is understood to be lying on the complex plane, so that s is at the origin, c is on the real axis, and n is on the imaginary axis. The twelve Jacobian elliptic functions are then pq(x), where p and q are one of the letters s, c, d, n.

The Jacobian elliptic functions are then the unique doubly-periodic, meromorphic functions satisfying the following three properties:

  1. There is a simple zero at the corner p, and a simple pole at the corner q.
  2. The step from p to q is equal to half the period of the function pq(x); that is, the function pq(x) is periodic in the direction pq, with the period being twice the distance from p to q. pq(x) is periodic in the other two directions as well, with a period such that the distance from p to one of the other corners is a quarter period.
  3. If the function pq(x) is expanded in terms of x at one of the corners, the leading term in the expansion has a coefficient of 1. In other words, the leading term of the expansion of pq(x) at the corner p is x; the leading term of the expansion at the corner q is 1/x, and the leading term of an expansion at the other two corners is 1.

We can write

pq(x)=pr(x)qr(x)

where p, q, and r are any of the letters s, c, d, n, with the understanding that ss=cc=dd=nn=1.

Let

u=ϕ0dθ1msin2θ,

then the Jacobi elliptic function sn(u) is given by

snu=sinϕ

and cn(u) is given by

cnu=cosϕ

and

dnu=1msin2ϕ.

To emphasize the dependence on m, one can write sn(u|m) for example (and similarly for cn and dn). This is the notation used below.

For a given k with 0<k<1 they therefore are solutions to the following nonlinear ordinary differential equations:

  • sn(x;k) solves the differential equations

    d2ydx2+(1+k2)y2k2y3=0 and (dydx)2=(1y2)(1k2y2).
  • cn(x;k) solves the differential equations

    d2ydx2+(12k2)y+2k2y3=0 and (dydx)2=(1y2)(1k2+k2y2).
  • dn(x;k) solves the differential equations

    d2ydx2(2k2)y+2y3=0 and (dydx)2=y2(1k2y2).

    If K(m) denotes the complete elliptic integral of the first kind (named elliptic_kc in Sage), the elliptic functions sn(x|m) and cn(x|m) have real periods 4K(m), whereas dn(x|m) has a period 2K(m). The limit m0 gives K(0)=π/2 and trigonometric functions: sn(x|0)=sinx, cn(x|0)=cosx, dn(x|0)=1. The limit m1 gives K(1) and hyperbolic functions: sn(x|1)=tanhx, cn(x|1)=sechx, dn(x|1)=sechx.

REFERENCES:

AUTHORS:

  • David Joyner (2006): initial version
  • Eviatar Bach (2013): complete rewrite, new numerical evaluation, and addition of the Jacobi amplitude function
class sage.functions.jacobi.InverseJacobi(kind)

Bases: sage.symbolic.function.BuiltinFunction

Base class for the inverse Jacobi elliptic functions.

class sage.functions.jacobi.Jacobi(kind)

Bases: sage.symbolic.function.BuiltinFunction

Base class for the Jacobi elliptic functions.

class sage.functions.jacobi.JacobiAmplitude

Bases: sage.symbolic.function.BuiltinFunction

The Jacobi amplitude function am(x|m)=x0dn(t|m)dt for K(m)xK(m), F(am(x|m)|m)=x.

sage.functions.jacobi.inverse_jacobi(kind, x, m, **kwargs)

The inverses of the 12 Jacobi elliptic functions. They have the property that

pq(arcpq(x|m)|m)=pq(pq1(x|m)|m)=x.

INPUT:

  • kind – a string of the form 'pq', where p, q are in c, d, n, s
  • x – a real number
  • m – a real number; note that m=k2, where k is the elliptic modulus

EXAMPLES:

sage: jacobi('dn', inverse_jacobi('dn', 3, 0.4), 0.4)
3.00000000000000
sage: inverse_jacobi('dn', 10, 1/10).n(digits=50)
2.4777736267904273296523691232988240759001423661683*I
sage: inverse_jacobi_dn(x, 1)
arcsech(x)
sage: inverse_jacobi_dn(1, 3)
0
sage: m = var('m')
sage: z = inverse_jacobi_dn(x, m).series(x, 4).subs(x=0.1, m=0.7)
sage: jacobi_dn(z, 0.7)
0.0999892750039819...
sage: inverse_jacobi_nd(x, 1)
arccosh(x)
sage: inverse_jacobi_nd(1, 2)
0
sage: inverse_jacobi_ns(10^-5, 3).n()
5.77350269202456e-6 + 1.17142008414677*I
sage: jacobi('sn', 1/2, 1/2)
jacobi_sn(1/2, 1/2)
sage: jacobi('sn', 1/2, 1/2).n()
0.470750473655657
sage: inverse_jacobi('sn', 0.47, 1/2)
0.499098231322220
sage: inverse_jacobi('sn', 0.4707504, 0.5)
0.499999911466555
sage: P = plot(inverse_jacobi('sn', x, 0.5), 0, 1)
sage.functions.jacobi.inverse_jacobi_f(kind, x, m)

Internal function for numerical evaluation of a continous complex branch of each inverse Jacobi function, as described in [Tee1997]. Only accepts real arguments.

sage.functions.jacobi.jacobi(kind, z, m, **kwargs)

The 12 Jacobi elliptic functions.

INPUT:

  • kind – a string of the form 'pq', where p, q are in c, d, n, s
  • z – a complex number
  • m – a complex number; note that m=k2, where k is the elliptic modulus

EXAMPLES:

sage: jacobi('sn', 1, 1)
tanh(1)
sage: jacobi('cd', 1, 1/2)
jacobi_cd(1, 1/2)
sage: RDF(jacobi('cd', 1, 1/2))
0.7240097216593705
sage: (RDF(jacobi('cn', 1, 1/2)), RDF(jacobi('dn', 1, 1/2)),
....:  RDF(jacobi('cn', 1, 1/2) / jacobi('dn', 1, 1/2)))
(0.5959765676721407, 0.8231610016315962, 0.7240097216593705)
sage: jsn = jacobi('sn', x, 1)
sage: P = plot(jsn, 0, 1)
sage.functions.jacobi.jacobi_am_f(x, m)

Internal function for numeric evaluation of the Jacobi amplitude function for real arguments. Procedure described in [Eh2013].