public void ComplexErfFresnel () { // don't let x get too big or we run into problem of accruacy for arguments of large trig-like functions foreach (double x in TestUtilities.GenerateRealValues(1.0E-1, 1.0E2, 16)) { Complex z = Math.Sqrt(Math.PI) * (1.0 - ComplexMath.I) * x / 2.0; Complex w = (1.0 + ComplexMath.I) * AdvancedComplexMath.Erf(z) / 2.0; Assert.IsTrue(TestUtilities.IsNearlyEqual(w.Re, AdvancedMath.FresnelC(x))); Assert.IsTrue(TestUtilities.IsNearlyEqual(w.Im, AdvancedMath.FresnelS(x))); } }
public void ComplexErfSymmetries () { foreach (Complex z in TestUtilities.GenerateComplexValues(1.0E-1, 1.0E3, 16)) { // for large imaginary parts, erf overflows, so don't try them if (z.Im * z.Im > 500.0) continue; //Console.WriteLine("{0} {1} {2} {3}", z, AdvancedComplexMath.Erf(z), AdvancedComplexMath.Erf(-z), AdvancedComplexMath.Erf(z.Conjugate)); Assert.IsTrue(TestUtilities.IsNearlyEqual( AdvancedComplexMath.Erf(-z), -AdvancedComplexMath.Erf(z) )); Assert.IsTrue(TestUtilities.IsNearlyEqual( AdvancedComplexMath.Erf(z.Conjugate), AdvancedComplexMath.Erf(z).Conjugate )); } }
public void ComplexErfFaddevaAgreement () { foreach (Complex z in TestUtilities.GenerateComplexValues(1.0E-1, 1.0E2, 16)) { Complex w = AdvancedComplexMath.Faddeeva(z); Complex erf = AdvancedComplexMath.Erf(-ComplexMath.I * z); Complex erfc = 1.0 - erf; Complex f = ComplexMath.Exp(z * z); Console.WriteLine("z={0} w={1} erf={2} erfc={3} f={4} w'={5} erf'={6}", z, w, erf, erfc, f, erfc / f, 1.0 - f * w); if (Double.IsInfinity(f.Re) || Double.IsInfinity(f.Im) || f == 0.0) continue; //Console.WriteLine("{0} {1}", TestUtilities.IsNearlyEqual(w, erfc / f), TestUtilities.IsNearlyEqual(erf, 1.0 - f * w)); Assert.IsTrue(TestUtilities.IsNearlyEqual( erf, 1.0 - f * w )); } }
public void ComplexErfSpecialCase() { Assert.IsTrue(AdvancedComplexMath.Erf(0.0) == 0.0); }