public void IntegerBesselSpecialCase() { Assert.IsTrue(AdvancedMath.BesselJ(0, 0.0) == 1.0); Assert.IsTrue(AdvancedMath.BesselJ(1, 0.0) == 0.0); Assert.IsTrue(AdvancedMath.BesselY(0, 0.0) == Double.NegativeInfinity); Assert.IsTrue(AdvancedMath.BesselY(1, 0.0) == Double.NegativeInfinity); }
public void BesselAtZero() { // Normal Bessel \nu = 0 Assert.IsTrue(AdvancedMath.BesselJ(0, 0.0) == 1.0); Assert.IsTrue(AdvancedMath.BesselJ(0.0, 0.0) == 1.0); Assert.IsTrue(Double.IsNegativeInfinity(AdvancedMath.BesselY(0, 0.0))); Assert.IsTrue(Double.IsNegativeInfinity(AdvancedMath.BesselY(0.0, 0.0))); SolutionPair jy0 = AdvancedMath.Bessel(0.0, 0.0); Assert.IsTrue(jy0.FirstSolutionValue == 1.0); Assert.IsTrue(jy0.FirstSolutionDerivative == 0.0); Assert.IsTrue(Double.IsNegativeInfinity(jy0.SecondSolutionValue)); Assert.IsTrue(Double.IsPositiveInfinity(jy0.SecondSolutionDerivative)); // Normal Bessel 0 < \nu < 1 Assert.IsTrue(AdvancedMath.BesselJ(0.1, 0.0) == 0.0); Assert.IsTrue(Double.IsNegativeInfinity(AdvancedMath.BesselY(0.1, 0.0))); SolutionPair jyf = AdvancedMath.Bessel(0.9, 0.0); Assert.IsTrue(jyf.FirstSolutionValue == 0.0); Assert.IsTrue(jyf.FirstSolutionDerivative == Double.PositiveInfinity); Assert.IsTrue(Double.IsNegativeInfinity(jyf.SecondSolutionValue)); Assert.IsTrue(Double.IsPositiveInfinity(jyf.SecondSolutionDerivative)); // Normal Bessel \nu = 1 Assert.IsTrue(AdvancedMath.BesselJ(1, 0.0) == 0.0); Assert.IsTrue(AdvancedMath.BesselJ(1.0, 0.0) == 0.0); Assert.IsTrue(Double.IsNegativeInfinity(AdvancedMath.BesselY(1, 0.0))); Assert.IsTrue(Double.IsNegativeInfinity(AdvancedMath.BesselY(1.0, 0.0))); SolutionPair jy1 = AdvancedMath.Bessel(1.0, 0.0); Assert.IsTrue(jy1.FirstSolutionValue == 0.0); Assert.IsTrue(jy1.FirstSolutionDerivative == 0.5); Assert.IsTrue(Double.IsNegativeInfinity(jy1.SecondSolutionValue)); Assert.IsTrue(Double.IsPositiveInfinity(jy1.SecondSolutionDerivative)); // Normal Bessel \nu > 1 Assert.IsTrue(AdvancedMath.BesselJ(2, 0.0) == 0.0); Assert.IsTrue(AdvancedMath.BesselJ(1.2, 0.0) == 0.0); Assert.IsTrue(Double.IsNegativeInfinity(AdvancedMath.BesselY(2, 0.0))); Assert.IsTrue(Double.IsNegativeInfinity(AdvancedMath.BesselY(1.2, 0.0))); SolutionPair jy2 = AdvancedMath.Bessel(1.7, 0.0); Assert.IsTrue(jy2.FirstSolutionValue == 0.0); Assert.IsTrue(jy2.FirstSolutionDerivative == 0.0); Assert.IsTrue(Double.IsNegativeInfinity(jy2.SecondSolutionValue)); Assert.IsTrue(Double.IsPositiveInfinity(jy2.SecondSolutionDerivative)); }
public void IntegerBesselNegativeOrder() { foreach (int n in TestUtilities.GenerateIntegerValues(1, 1000, 4)) { foreach (double x in TestUtilities.GenerateRealValues(1.0E-4, 1.0E6, 8)) { int s = (n % 2 == 0) ? +1 : -1; Assert.IsTrue(AdvancedMath.BesselJ(-n, x) == s * AdvancedMath.BesselJ(n, x)); Assert.IsTrue(AdvancedMath.BesselY(-n, x) == s * AdvancedMath.BesselY(n, x)); } } }
public void IntegerBesselRecurrence() { foreach (int n in TestUtilities.GenerateIntegerValues(1, 1000, 4)) { foreach (double x in TestUtilities.GenerateRealValues(1.0E-4, 1.0E6, 16)) { Assert.IsTrue(TestUtilities.IsSumNearlyEqual( AdvancedMath.BesselJ(n - 1, x), AdvancedMath.BesselJ(n + 1, x), 2 * n / x * AdvancedMath.BesselJ(n, x) )); Assert.IsTrue(TestUtilities.IsSumNearlyEqual( AdvancedMath.BesselY(n - 1, x), AdvancedMath.BesselY(n + 1, x), 2 * n / x * AdvancedMath.BesselY(n, x) )); } } }
public void BesselY0Integral() { // Abromowitz & Stegen 9.1.19 Interval r = Interval.FromEndpoints(0.0, Math.PI / 2.0); foreach (double x in TestUtilities.GenerateRealValues(1.0E-2, 1.0E2, 8)) { Func <double, double> f = delegate(double t) { double s = Math.Sin(t); return(Math.Cos(x * Math.Cos(t)) * (AdvancedMath.EulerGamma + Math.Log(2.0 * x * s * s))); }; double Y0 = 4.0 / (Math.PI * Math.PI) * FunctionMath.Integrate(f, r).Estimate.Value; Assert.IsTrue(TestUtilities.IsNearlyEqual(AdvancedMath.BesselY(0, x), Y0)); } }
public void SphericalBesselRealBesselAgreement() { foreach (int n in TestUtilities.GenerateIntegerValues(1, 100, 8)) { foreach (double x in TestUtilities.GenerateRealValues(1.0E-4, 1.0E4, 16)) { Assert.IsTrue(TestUtilities.IsNearlyEqual( AdvancedMath.SphericalBesselJ(n, x), Math.Sqrt(Math.PI / 2.0 / x) * AdvancedMath.BesselJ(n + 0.5, x) )); Assert.IsTrue(TestUtilities.IsNearlyEqual( AdvancedMath.SphericalBesselY(n, x), Math.Sqrt(Math.PI / 2.0 / x) * AdvancedMath.BesselY(n + 0.5, x) )); } } }
public void IntegerBesselCrossProduct() { foreach (int n in TestUtilities.GenerateIntegerValues(1, 1000, 4)) { foreach (double x in TestUtilities.GenerateRealValues(1.0E-4, 1.0E6, 8)) { double Jn = AdvancedMath.BesselJ(n, x); double Jp = AdvancedMath.BesselJ(n + 1, x); double Yn = AdvancedMath.BesselY(n, x); double Yp = AdvancedMath.BesselY(n + 1, x); if (Double.IsInfinity(Yn)) { continue; } Assert.IsTrue(TestUtilities.IsSumNearlyEqual( Jp * Yn, -Jn * Yp, 2.0 / Math.PI / x )); } } }