Пример #1
0
 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));
        }
Пример #3
0
 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));
         }
     }
 }
Пример #4
0
 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)
                               ));
         }
     }
 }
Пример #5
0
        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)
                                      ));
                }
            }
        }
Пример #7
0
 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
                               ));
         }
     }
 }