Exemple #1
0
 public void EllipticFSpecialCases()
 {
     foreach (double phi in TestUtilities.GenerateUniformRealValues(0.0, Math.PI / 2.0, 4))
     {
         Assert.IsTrue(TestUtilities.IsNearlyEqual(AdvancedMath.EllipticF(phi, 0.0), phi));
     }
 }
Exemple #2
0
 public void EllipticFBetaRelationship()
 {
     foreach (double phi in TestUtilities.GenerateUniformRealValues(0.0, Math.PI / 2.0, 8))
     {
         Assert.IsTrue(TestUtilities.IsNearlyEqual(
                           AdvancedMath.EllipticF(phi, 1.0 / Math.Sqrt(2.0)),
                           AdvancedMath.Beta(1.0 / 2.0, 1.0 / 4.0, 1.0 - MoreMath.Pow(Math.Cos(phi), 4)) / Math.Sqrt(8.0)
                           ));
     }
 }
Exemple #3
0
 public void EllipticFCompleteAgreement()
 {
     foreach (double k in TestUtilities.GenerateRealValues(0.01, 1.0, 8))
     {
         Assert.IsTrue(TestUtilities.IsNearlyEqual(
                           AdvancedMath.EllipticF(Math.PI / 2.0, k),
                           AdvancedMath.EllipticK(k)
                           ));
     }
 }
Exemple #4
0
        /// <summary>
        /// See this paper: http://archive.bridgesmathart.org/2016/bridges2016-179.pdf
        /// This logically belongs in HyperbolicModels.cs, but I didn't want the dependency on Meta.Numerics in R3.Core.
        /// </summary>
        public static Vector3D SquareToPoincare(Vector3D s)
        {
            double  K_e = AdvancedMath.EllipticF(Math.PI / 2, 1.0 / Math.Sqrt(2));
            Complex a   = new Complex(1, -1) / Math.Sqrt(2);
            Complex b   = new Complex(1, 1) / 2;
            Complex z   = s;

            Complex result = a * JacobiCn(K_e * (b * z - 1), 1 / Math.Sqrt(2));

            return(Vector3D.FromComplex(result));
        }
Exemple #5
0
 public void JacobiAsInverse()
 {
     foreach (double k in TestUtilities.GenerateRealValues(1.0E-2, 1.0, 3))
     {
         foreach (double u in TestUtilities.GenerateRealValues(1.0E-1, Math.PI, 3))
         {
             Assert.IsTrue(TestUtilities.IsNearlyEqual(
                               AdvancedMath.EllipticF(Math.Asin(AdvancedMath.JacobiSn(u, k)), k), u
                               ));
         }
     }
 }
Exemple #6
0
 public void EllipticFIntegral()
 {
     foreach (double k in TestUtilities.GenerateRealValues(1.0E-2, 1.0, 8))
     {
         foreach (double phi in TestUtilities.GenerateUniformRealValues(0.0, Math.PI / 2.0, 4))
         {
             Assert.IsTrue(TestUtilities.IsNearlyEqual(
                               FunctionMath.Integrate(t => AdvancedMath.EllipticF(t, k) / Math.Sqrt(1.0 - MoreMath.Pow(k * Math.Sin(t), 2)), Interval.FromEndpoints(0.0, phi)),
                               MoreMath.Pow(AdvancedMath.EllipticF(phi, k), 2) / 2.0
                               ));
         }
     }
 }
Exemple #7
0
 public void EllipticFDisplacement()
 {
     foreach (int m in TestUtilities.GenerateUniformIntegerValues(-100, 100, 4))
     {
         foreach (double phi in TestUtilities.GenerateUniformRealValues(-Math.PI / 2.0, +Math.PI / 2.0, 4))
         {
             foreach (double k in TestUtilities.GenerateRealValues(1.0E-4, 1.0, 4))
             {
                 Assert.IsTrue(TestUtilities.IsNearlyEqual(
                                   AdvancedMath.EllipticF(m * Math.PI + phi, k),
                                   2 * m * AdvancedMath.EllipticK(k) + AdvancedMath.EllipticF(phi, k)
                                   ));
             }
         }
     }
 }
Exemple #8
0
        public void EllipticFIntegration()
        {
            foreach (double k in TestUtilities.GenerateRealValues(1.0E-2, 1.0, 8))
            {
                Func <double, double> f = delegate(double t) {
                    double z = k * Math.Sin(t);
                    return(1.0 / Math.Sqrt(1.0 - z * z));
                };

                foreach (double phi in TestUtilities.GenerateUniformRealValues(0.0, Math.PI / 2.0, 8))
                {
                    Interval i = Interval.FromEndpoints(0.0, phi);

                    Assert.IsTrue(TestUtilities.IsNearlyEqual(
                                      FunctionMath.Integrate(f, i), AdvancedMath.EllipticF(phi, k)
                                      ));
                }
            }
        }