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)); } }
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) )); } }
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) )); } }
/// <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)); }
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 )); } } }
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 )); } } }
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) )); } } } }
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) )); } } }