Artemis.Engine.Maths.SpecialFunctions.AiryB C# (CSharp) Method

AiryB() public static method

Return the value of the Airy Bi function at x.
public static AiryB ( double x ) : double
x double
return double
        public static double AiryB(double x)
        {
            double z, zz, t, f, g, uf, ug, k, zeta, theta;

            if (x > MAXAIRY)
                return Double.PositiveInfinity;

            if (x < -2.09)
            {
                t = Math.Sqrt(-x);
                zeta = -2.0 * x * t / 3.0;
                t = Math.Sqrt(t);
                k = SQPII / t;
                z = 1.0 / zeta;
                zz = z * z;
                uf = 1.0 + zz * polevl(zz, AFN, 8) / p1evl(zz, AFD, 9);
                ug = z * polevl(zz, AGN, 10) / p1evl(zz, AGD, 10);
                theta = zeta + 0.25 * Math.PI;
                f = Math.Sin(theta);
                g = Math.Cos(theta);
                return k * (g * uf + f * ug);
            }

            if (x > 8.3203353)
            {
                t = Math.Sqrt(x);
                zeta = 2.0 * x * t / 3.0;
                g = Math.Exp(zeta);
                t = Math.Sqrt(t);
                z = 1.0 / zeta;
                f = z * polevl(z, BN16, 4) / p1evl(z, BD16, 5);
                k = SQPII * g;
                return k * (1.0 + f) / t;
            }

            f = 1.0;
            g = x;
            t = 1.0;
            uf = 1.0;
            ug = x;
            k = 1.0;
            z = x * x * x;
            while (t > MACHEP)
            {
                uf *= z;
                k += 1.0;
                uf /= k;
                ug *= z;
                k += 1.0;
                ug /= k;
                uf /= k;
                f += uf;
                k += 1.0;
                ug /= k;
                g += ug;
                t = Math.Abs(uf / f);
            }
            uf = AIRY_C1 * f;
            ug = AIRY_C2 * g;
            return SQRT3 * (uf + ug);
        }