/// <summary>Find a solution of the equation f(x)=0.</summary> /// <param name="f">The function to find roots from.</param> /// <param name="lowerBound">The low value of the range where the root is supposed to be.</param> /// <param name="upperBound">The high value of the range where the root is supposed to be.</param> /// <param name="accuracy">Desired accuracy. The root will be refined until the accuracy or the maximum number of iterations is reached. Example: 1e-14.</param> /// <param name="maxIterations">Maximum number of iterations. Example: 100.</param> public static double OfFunction(Func <double, double> f, double lowerBound, double upperBound, double accuracy = 1e-8, int maxIterations = 100) { if (!ZeroCrossingBracketing.ExpandReduce(f, ref lowerBound, ref upperBound, 1.6, maxIterations, maxIterations * 10)) { throw new NonConvergenceException("The algorithm has failed, exceeded the number of iterations allowed or there is no root within the provided bounds."); } if (Brent.TryFindRoot(f, lowerBound, upperBound, accuracy, maxIterations, out var root)) { return(root); } if (Bisection.TryFindRoot(f, lowerBound, upperBound, accuracy, maxIterations, out root)) { return(root); } throw new NonConvergenceException("The algorithm has failed, exceeded the number of iterations allowed or there is no root within the provided bounds."); }
/// <summary>Find a solution of the equation f(x)=0.</summary> /// <param name="f">The function to find roots from.</param> /// <param name="lowerBound">The low value of the range where the root is supposed to be.</param> /// <param name="upperBound">The high value of the range where the root is supposed to be.</param> /// <param name="accuracy">Desired accuracy. The root will be refined until the accuracy or the maximum number of iterations is reached. Example: 1e-14.</param> /// <param name="maxIterations">Maximum number of iterations. Example: 100.</param> public static double OfFunction(Func <double, double> f, double lowerBound, double upperBound, double accuracy = 1e-8, int maxIterations = 100) { double root; if (!ZeroCrossingBracketing.Expand(f, ref lowerBound, ref upperBound, 1.6, 100)) { throw new NonConvergenceException(Resources.RootFindingFailed); } if (Brent.TryFindRoot(f, lowerBound, upperBound, accuracy, maxIterations, out root)) { return(root); } if (Bisection.TryFindRoot(f, lowerBound, upperBound, accuracy, maxIterations, out root)) { return(root); } throw new NonConvergenceException(Resources.RootFindingFailed); }