/// <summary> /// Returns Iv(x) for small <paramref name="x"/> /// </summary> /// <param name="v"></param> /// <param name="x"></param> /// <returns></returns> public static double I_SmallArg(double v, double x) { double prefix; if (v <= DoubleLimits.MaxGamma - 1) { prefix = Math.Pow(x / 2, v) / Math2.Tgamma(v + 1); } else { prefix = StirlingGamma.PowDivGamma(x / 2, v) / v; } if (prefix == 0) return prefix; double series = HypergeometricSeries.Sum0F1(v + 1, x * x / 4); return prefix * series; }
/// <summary> /// Series evaluation for Jv(x), for small x /// </summary> /// <param name="v"></param> /// <param name="x"></param> /// <returns></returns> public static double J_SmallArg(double v, double x) { Debug.Assert(v >= 0); // See http://functions.wolfram.com/Bessel-TypeFunctions/BesselJ/06/01/04/01/01/0003/ // Converges rapidly for all x << v. // Most of the error occurs calculating the prefix double prefix; if (v <= DoubleLimits.MaxGamma - 1) prefix = Math.Pow(x / 2, v) / Math2.Tgamma(v + 1); else prefix = StirlingGamma.PowDivGamma(x / 2, v)/v; if (prefix == 0) return prefix; double series = HypergeometricSeries.Sum0F1(v + 1, -x * x / 4); return prefix * series; }