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); }
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 ); }
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); }