static ScalarValue LogGamma_Stirling(ScalarValue z) { if (z.Im < 0.0) { return(LogGamma_Stirling(z.Conjugate()).Conjugate()); } var f = (z - 0.5) * z.Ln() - z + Math.Log(2.0 * Math.PI) / 2.0; var reduce = f.Im / (2.0 * Math.PI); reduce = f.Im - (int)(reduce) * 2.0 * Math.PI; f = new ScalarValue(f.Re, reduce); var zsqu = z * z; var zp = z.Clone(); for (var i = 1; i < 10; i++) { var f_old = f.Clone(); f += Helpers.BernoulliNumbers[i] / (2 * i) / (2 * i - 1) / zp; if (f == f_old) { return(f); } zp = zp * zsqu; } throw new YAMPNotConvergedException("gamma"); }
/// <summary> /// The Faddeeva function or Kramp function is a scaled complex complementary error function. /// </summary> /// <param name="z">The argument z.</param> /// <returns>The evaluated value.</returns> public static ScalarValue Faddeeva(ScalarValue z) { if (z.Im < 0.0) { return(2.0 * (-z * z).Exp() - Faddeeva(-z)); } if (z.Re < 0.0) { return(Faddeeva(-z.Conjugate()).Conjugate()); } var r = z.Abs(); if (r < 2.0) { return((-z * z).Exp() * (1.0 - Erf_Series(-ScalarValue.I * z))); } else if ((z.Im < 0.1) && (z.Re < 30.0)) { return(Taylor(new ScalarValue(z.Re), Math.Exp(-z.Re * z.Re) + 2.0 * Dawson.DawsonIntegral(z.Re) / Helpers.SqrtPI * ScalarValue.I, new ScalarValue(0.0, z.Im))); } else if (r > 7.0) { return(ContinuedFraction(z)); } return(Weideman(z)); }
/// <summary> /// Cholesky algorithm for symmetric and positive definite matrix. /// </summary> /// <param name="Arg">Square, symmetric matrix.</param> /// <returns>Structure to access L and isspd flag.</returns> public CholeskyDecomposition(MatrixValue Arg) { // Initialize. var A = Arg.GetComplexMatrix(); n = Arg.DimensionY; L = new ScalarValue[n][]; for (int i = 0; i < n; i++) { L[i] = new ScalarValue[n]; } isspd = Arg.DimensionX == n; // Main loop. for (int i = 0; i < n; i++) { var Lrowi = L[i]; var d = ScalarValue.Zero; for (int j = 0; j < i; j++) { var Lrowj = L[j]; var s = new ScalarValue(); for (int k = 0; k < j; k++) { s += Lrowi[k] * Lrowj[k].Conjugate(); } s = (A[i][j] - s) / L[j][j]; Lrowi[j] = s; d += s * s.Conjugate(); isspd = isspd && (A[j][i] == A[i][j]); } d = A[i][i] - d; isspd = isspd & (d.Abs() > 0.0); L[i][i] = d.Sqrt(); for (int k = i + 1; k < n; k++) { L[i][k] = ScalarValue.Zero; } } }
protected override ScalarValue GetValue(ScalarValue value) { return(value.Conjugate()); }
protected override ScalarValue GetValue(ScalarValue value) { return value.Conjugate(); }
static ScalarValue LogGamma_Stirling(ScalarValue z) { if (z.Im < 0.0) { return LogGamma_Stirling(z.Conjugate()).Conjugate(); } var f = (z - 0.5) * z.Ln() - z + Math.Log(2.0 * Math.PI) / 2.0; var reduce = f.Im / (2.0 * Math.PI); reduce = f.Im - (int)(reduce) * 2.0 * Math.PI; f = new ScalarValue(f.Re, reduce); var zsqu = z * z; var zp = z.Clone(); for (var i = 1; i < 10; i++) { var f_old = f.Clone(); f += Helpers.BernoulliNumbers[i] / (2 * i) / (2 * i - 1) / zp; if (f == f_old) { return (f); } zp = zp * zsqu; } throw new YAMPNotConvergedException("gamma"); }
/// <summary> /// The Faddeeva function or Kramp function is a scaled complex complementary error function. /// </summary> /// <param name="z">The argument z.</param> /// <returns>The evaluated value.</returns> public static ScalarValue Faddeeva(ScalarValue z) { if (z.Im < 0.0) return 2.0 * (-z * z).Exp() - Faddeeva(-z); if (z.Re < 0.0) return Faddeeva(-z.Conjugate()).Conjugate(); var r = z.Abs(); if (r < 2.0) return (-z * z).Exp() * (1.0 - Erf_Series(-ScalarValue.I * z)); else if ((z.Im < 0.1) && (z.Re < 30.0)) return Taylor(new ScalarValue(z.Re), Math.Exp(-z.Re * z.Re) + 2.0 * Dawson.DawsonIntegral(z.Re) / Helpers.SqrtPI * ScalarValue.I, new ScalarValue(0.0, z.Im)); else if (r > 7.0) return ContinuedFraction(z); return Weideman(z); }