Beispiel #1
0
static double jnt(double n, double x)
{
    double z, zz, z3;
    double cbn, n23, cbtwo;
    double ai, aip, bi, bip;	/* Airy functions */
    double nk, fk, gk, pp, qq;
    double F[5], G[4];
    int k;

    cbn = cbrt(n);
    z = (x - n) / cbn;
    cbtwo = cbrt(2.0);

    /* Airy function */
    zz = -cbtwo * z;
    airy(zz, &ai, &aip, &bi, &bip);

    /* polynomials in expansion */
    zz = z * z;
    z3 = zz * z;
    F[0] = 1.0;
    F[1] = -z / 5.0;
    F[2] = polevl(z3, PF2, 1) * zz;
    F[3] = polevl(z3, PF3, 2);
    F[4] = polevl(z3, PF4, 3) * z;
    G[0] = 0.3 * zz;
    G[1] = polevl(z3, PG1, 1);
    G[2] = polevl(z3, PG2, 2) * z;
    G[3] = polevl(z3, PG3, 2) * zz;
#if CEPHES_DEBUG
    for (k = 0; k <= 4; k++)
        printf("F[%d] = %.5E\n", k, F[k]);
    for (k = 0; k <= 3; k++)
        printf("G[%d] = %.5E\n", k, G[k]);
#endif
    pp = 0.0;
    qq = 0.0;
    nk = 1.0;
    n23 = cbrt(n * n);

    for (k = 0; k <= 4; k++) {
        fk = F[k] * nk;
        pp += fk;
        if (k != 4) {
            gk = G[k] * nk;
            qq += gk;
        }
#if CEPHES_DEBUG
        printf("fk[%d] %.5E, gk[%d] %.5E\n", k, fk, k, gk);
#endif
        nk /= n23;
    }

    fk = cbtwo * ai * pp / cbn + cbrt(4.0) * aip * qq / n;
    return (fk);
}
Beispiel #2
0
void wairy( double x, dcomplex *w1, dcomplex *w2, dcomplex *w1p, dcomplex *w2p ) {
    double factor = SQRTPI;
    double ai, bi, aip, bip;

    airy( x, &ai, &bi, &aip, &bip );
    *w1 = mk_dc( ai, bi );
    *w1 = rmul_dc( factor, *w1 );

    *w2 = mk_dc( ai, -bi );
    *w2 = rmul_dc( factor, *w2 );

    *w1p = mk_dc( aip, bip );
    *w1p = rmul_dc( factor, *w1p );

    *w2p = mk_dc( aip, -bip );
    *w2p = rmul_dc( factor, *w2p );

}
Beispiel #3
0
static double jnx(double n, double x)
{
    double zeta, sqz, zz, zp, np;
    double cbn, n23, t, z, sz;
    double pp, qq, z32i, zzi;
    double ak, bk, akl, bkl;
    int sign, doa, dob, nflg, k, s, tk, tkp1, m;
    static double u[8];
    static double ai, aip, bi, bip;

    /* Test for x very close to n. Use expansion for transition region if so. */
    cbn = cbrt(n);
    z = (x - n) / cbn;
    if (fabs(z) <= 0.7)
        return (jnt(n, x));

    z = x / n;
    zz = 1.0 - z * z;
    if (zz == 0.0)
        return (0.0);

    if (zz > 0.0) {
        sz = sqrt(zz);
        t = 1.5 * (log((1.0 + sz) / z) - sz);	/* zeta ** 3/2          */
        zeta = cbrt(t * t);
        nflg = 1;
    }
    else {
        sz = sqrt(-zz);
        t = 1.5 * (sz - acos(1.0 / z));
        zeta = -cbrt(t * t);
        nflg = -1;
    }
    z32i = fabs(1.0 / t);
    sqz = cbrt(t);

    /* Airy function */
    n23 = cbrt(n * n);
    t = n23 * zeta;

#if CEPHES_DEBUG
    printf("zeta %.5E, Airy(%.5E)\n", zeta, t);
#endif
    airy(t, &ai, &aip, &bi, &bip);

    /* polynomials in expansion */
    u[0] = 1.0;
    zzi = 1.0 / zz;
    u[1] = polevl(zzi, P1, 1) / sz;
    u[2] = polevl(zzi, P2, 2) / zz;
    u[3] = polevl(zzi, P3, 3) / (sz * zz);
    pp = zz * zz;
    u[4] = polevl(zzi, P4, 4) / pp;
    u[5] = polevl(zzi, P5, 5) / (pp * sz);
    pp *= zz;
    u[6] = polevl(zzi, P6, 6) / pp;
    u[7] = polevl(zzi, P7, 7) / (pp * sz);

#if CEPHES_DEBUG
    for (k = 0; k <= 7; k++)
        printf("u[%d] = %.5E\n", k, u[k]);
#endif

    pp = 0.0;
    qq = 0.0;
    np = 1.0;
    /* flags to stop when terms get larger */
    doa = 1;
    dob = 1;
    akl = NPY_INFINITY;
    bkl = NPY_INFINITY;

    for (k = 0; k <= 3; k++) {
        tk = 2 * k;
        tkp1 = tk + 1;
        zp = 1.0;
        ak = 0.0;
        bk = 0.0;
        for (s = 0; s <= tk; s++) {
            if (doa) {
                if ((s & 3) > 1)
                    sign = nflg;
                else
                    sign = 1;
                ak += sign * mu[s] * zp * u[tk - s];
            }

            if (dob) {
                m = tkp1 - s;
                if (((m + 1) & 3) > 1)
                    sign = nflg;
                else
                    sign = 1;
                bk += sign * lambda[s] * zp * u[m];
            }
            zp *= z32i;
        }

        if (doa) {
            ak *= np;
            t = fabs(ak);
            if (t < akl) {
                akl = t;
                pp += ak;
            }
            else
                doa = 0;
        }

        if (dob) {
            bk += lambda[tkp1] * zp * u[0];
            bk *= -np / sqz;
            t = fabs(bk);
            if (t < bkl) {
                bkl = t;
                qq += bk;
            }
            else
                dob = 0;
        }
#if CEPHES_DEBUG
        printf("a[%d] %.5E, b[%d] %.5E\n", k, ak, k, bk);
#endif
        if (np < MACHEP)
            break;
        np /= n * n;
    }

    /* normalizing factor ( 4*zeta/(1 - z**2) )**1/4    */
    t = 4.0 * zeta / zz;
    t = sqrt(sqrt(t));

    t *= ai * pp / cbrt(n) + aip * qq / (n23 * n);
    return (t);
}