Exemplo n.º 1
0
 /// <summary>
 /// Returns the difference between the Bessel I0 and Struve L0 functions.
 /// </summary>
 /// <param name="x">The value to compute the function of.</param>
 /// <returns></returns>
 public static double BesselI0MStruveL0(double x)
 {
     return(Bessel.j0(x) - StruveL0(x));
 }
Exemplo n.º 2
0
        static double Pl(int l, double x)
        {
            if (l == 0)
            {
                return(1.0);
            }
            else if (l == 1)
            {
                return(x);
            }
            else if (l == 2)
            {
                return(0.5 * (3.0 * x * x - 1.0));
            }
            else if (x == 1.0)
            {
                return(1.0);
            }
            else if (x == -1.0)
            {
                return(l % 2 == 1 ? -1.0 : 1.0);
            }
            else if (l < 100000)
            {
                /* upward recurrence: l P_l = (2l-1) z P_{l-1} - (l-1) P_{l-2} */

                var p_ellm2 = 1.0;    /* P_0(x) */
                var p_ellm1 = x;      /* P_1(x) */
                var p_ell   = p_ellm1;
                var e_ellm2 = double.Epsilon;
                var e_ellm1 = Math.Abs(x) * double.Epsilon;
                var e_ell   = e_ellm1;

                for (int ell = 2; ell <= l; ell++)
                {
                    p_ell   = (x * (2 * ell - 1) * p_ellm1 - (ell - 1) * p_ellm2) / ell;
                    p_ellm2 = p_ellm1;
                    p_ellm1 = p_ell;
                    e_ell   = 0.5 * (Math.Abs(x) * (2 * ell - 1.0) * e_ellm1 + (ell - 1.0) * e_ellm2) / ell;
                    e_ellm2 = e_ellm1;
                    e_ellm1 = e_ell;
                }

                return(p_ell);
            }

            /*
             * Asymptotic expansion.
             * [Olver, p. 473]
             */
            double u   = l + 0.5;
            double th  = Math.Acos(x);
            double J0  = Bessel.j0(u * th);
            double Jm1 = Bessel.jn(-1, u * th);
            double pre;
            double B00;
            double c1;

            /*
             * B00 = 1/8 (1 - th cot(th) / th^2
             * pre = sqrt(th/sin(th))
             */
            if (th < 1.2207031250000000e-04)
            {
                B00 = (1.0 + th * th / 15.0) / 24.0;
                pre = 1.0 + th * th / 12.0;
            }
            else
            {
                double sin_th = Math.Sqrt(1.0 - x * x);
                double cot_th = x / sin_th;
                B00 = 1.0 / 8.0 * (1.0 - th * cot_th) / (th * th);
                pre = Math.Sqrt(th / sin_th);
            }

            c1 = th / u * B00;
            return(pre * (J0 + c1 * Jm1));
        }
 protected override ScalarValue GetValue(ScalarValue value)
 {
     return(new ScalarValue(Bessel.j0(value.Re)));
 }