示例#1
0
def _RD(x, y, z):  # used by testElliptic.py
    '''Degenerate symmetric integral of the third kind C{_RD}.

       @return: C{_RD(x, y, z) = _RJ(x, y, z, z)}.

       @see: U{C{_RD} definition<https://DLMF.NIST.gov/19.16.E5>}.
    '''
    # Carlson, eqs 2.28 - 2.34
    m = 1.0
    S = Fsum()
    A = fsum_(x, y, z, z, z) * 0.2
    T = (A, x, y, z)
    Q = _Q(A, T, _TolRD)
    for _ in range(_TRIPS):
        if Q < abs(m * T[0]):  # max 7 trips
            break
        t = T[3]  # z0
        r, s, T = _rsT(T)
        S += 1.0 / (m * s[2] * (t + r))
        m *= 4
    else:
        raise _convergenceError(_RD, x, y, z)

    m *= T[0]  # An
    x = (x - A) / m
    y = (y - A) / m
    z = (x + y) / 3.0
    z2 = z**2
    xy = x * y
    return _Horner(3 * S.fsum(), m * sqrt(T[0]),
                   xy - 6 * z2,
                  (xy * 3 - 8 * z2) * z,
                  (xy - z2) * 3 * z2,
                   xy * z2 * z)
示例#2
0
def _RG(x, y, z=None):
    '''Symmetric integral of the second kind C{_RG}.

       @return: C{_RG(x, y, z)}.

       @see: U{C{_RG} definition<https://DLMF.NIST.gov/19.16.E3>}
             and in Carlson, eq. 1.5.
    '''
    if z is None:
        # Carlson, eqs 2.36 - 2.39
        a, b = sqrt(x), sqrt(y)
        if a < b:
            a, b = b, a
        S = Fsum(0.25 * (a + b)**2)
        m = -0.25  # note, negative
        while abs(a - b) > (_tolRG0 * a):  # max 4 trips
            b, a = sqrt(a * b), (a + b) * 0.5
            m *= 2
            S.fadd_(m * (a - b)**2)
        return S.fsum() * PI_2 / (a + b)

    if not z:
        y, z = z, y
    # Carlson, eq 1.7
    return fsum_(
        _RF(x, y, z) * z,
        _RD_3(x, y, z) * (x - z) * (z - y), sqrt(x * y / z)) * 0.5
示例#3
0
def _RG_(x, y):
    '''Symmetric integral of the second kind C{_RG}.

       @return: C{_RG(x, y)}.

       @see: U{C{_RG} definition<https://DLMF.NIST.gov/19.16.E3>}
             and in Carlson, eq. 1.5.
    '''
    # Carlson, eqs 2.36 - 2.39
    a, b = sqrt(x), sqrt(y)
    if a < b:
        a, b = b, a
    m = 0.25
    S = Fsum(m * (a + b)**2)
    while abs(a - b) > (_TolRG0 * a):  # max 4 trips
        b, a = sqrt(a * b), (a + b) * 0.5
        m *= 2
        S -= m * (a - b)**2
    return S.fsum() * PI_2 / (a + b)
示例#4
0
def _RJ(x, y, z, p):  # used by testElliptic.py
    '''Symmetric integral of the third kind C{_RJ(x, y, z, p)}.

       @return: C{_RJ(x, y, z, p)}.

       @see: U{C{_RJ} definition<https://DLMF.NIST.gov/19.16.E2>} and
             U{Carlson<https://ArXiv.org/pdf/math/9409227.pdf>}.
    '''
    def _xyzp(x, y, z, p):
        return (x + p) * (y + p) * (z + p)

    # Carlson, eqs 2.17 - 2.25
    m = m3 = _1_0
    S = Fsum()
    D = neg(_xyzp(x, y, z, -p))
    A = fsum_(x, y, z, 2 * p) * _0_2
    T = (A, x, y, z, p)
    Q = _Q(A, T, _TolRD)
    for _ in range(_TRIPS):
        if Q < abs(m * T[0]):  # max 7 trips
            break
        _, s, T = _rsT(T)
        d = _xyzp(*s)
        e = D / (m3 * d**2)
        S += _RC(1, 1 + e) / (m * d)
        m *= _4_0
        m3 *= 64
    else:
        raise _convergenceError(_RJ, x, y, z, p)

    m *= T[0]  # An
    x = (A - x) / m
    y = (A - y) / m
    z = (A - z) / m
    xyz = x * y * z
    p  = neg(x + y + z) * _0_5
    p2 = p**2

    e2 = fsum_(x * y, x * z, y * z, -3 * p2)
    return _horner(6 * S.fsum(), m * sqrt(T[0]), e2,
                   fsum_(xyz, 2 * p * e2, 4 * p * p2),
                   fsum_(xyz * 2, p * e2, 3 * p * p2) * p,
                   p2 * xyz)
示例#5
0
def _RJ(x, y, z, p):
    '''Symmetric integral of the third kind C{_RJ}.

       @return: C{_RJ(x, y, z, p)}.

       @see: U{C{_RJ} definition<https://DLMF.NIST.gov/19.16.E2>}.
    '''
    def _xyzp(x, y, z, p):
        return (x + p) * (y + p) * (z + p)

    # Carlson, eqs 2.17 - 2.25
    m = m3 = 1.0
    S = Fsum()
    D = -_xyzp(x, y, z, -p)
    A = fsum_(x, y, z, 2 * p) * 0.2
    T = [A, x, y, z, p]
    Q = _Q(A, T, _tolRD)
    for _ in range(_TRIPS):
        if Q < abs(m * T[0]):  # max 7 trips
            break
        _, s, T = _rsT(T)
        d = _xyzp(*s)
        e = D / (m3 * d**2)
        S.fadd_(_RC(1, 1 + e) / (m * d))
        m *= 4
        m3 *= 64
    else:
        raise EllipticError('no %s convergence' % ('RJ', ))

    S *= 6
    m *= T[0]  # An
    x = (A - x) / m
    y = (A - y) / m
    z = (A - z) / m
    xyz = x * y * z
    p = -(x + y + z) * 0.5
    p2 = p**2

    e2 = fsum_(x * y, x * z, y * z, -3 * p2)
    return _Hf(S.fsum(), m * sqrt(T[0]), e2, fsum_(xyz, 2 * p * e2,
                                                   4 * p * p2),
               fsum_(xyz * 2, p * e2, 3 * p * p2) * p, p2 * xyz)
示例#6
0
def _RG_(x, y):
    '''Symmetric integral of the second kind C{_RG}.

       @return: C{_RG(x, y)}.

       @see: U{C{_RG} definition<https://DLMF.NIST.gov/19.16.E3>} and
             U{Carlson<https://ArXiv.org/pdf/math/9409227.pdf>}.
    '''
    # Carlson, eqs 2.36 - 2.39
    a, b = sqrt(x), sqrt(y)
    if a < b:
        a, b = b, a
    m = 0.25
    S = Fsum(m * (a + b)**2)
    for _ in range(_TRIPS):  # max 4 trips
        if abs(a - b) <= (_TolRG0 * a):
            return S.fsum() * PI_2 / (a + b)
        b, a = sqrt(a * b), (a + b) * 0.5
        m *= 2
        S -= m * (a - b)**2

    raise _convergenceError(_RG_, x, y)