Class BaseSecantSolver

All Implemented Interfaces:
BaseUnivariateSolver<UnivariateFunction>, BracketedUnivariateSolver<UnivariateFunction>, UnivariateSolver
Direct Known Subclasses:
IllinoisSolver, PegasusSolver, RegulaFalsiSolver

public abstract class BaseSecantSolver extends AbstractUnivariateSolver implements BracketedUnivariateSolver<UnivariateFunction>
Base class for all bracketing Secant-based methods for root-finding (approximating a zero of a univariate real function).

Implementation of the Regula Falsi and Illinois methods is based on the following article: M. Dowell and P. Jarratt, A modified regula falsi method for computing the root of an equation, BIT Numerical Mathematics, volume 11, number 2, pages 168-174, Springer, 1971.

Implementation of the Pegasus method is based on the following article: M. Dowell and P. Jarratt, The "Pegasus" method for computing the root of an equation, BIT Numerical Mathematics, volume 12, number 4, pages 503-508, Springer, 1972.

The Secant method is not a bracketing method, so it is not implemented here. It has a separate implementation.

  • Field Details

    • DEFAULT_ABSOLUTE_ACCURACY

      protected static final double DEFAULT_ABSOLUTE_ACCURACY
      Default absolute accuracy.
      See Also:
  • Constructor Details

    • BaseSecantSolver

      protected BaseSecantSolver(double absoluteAccuracy, BaseSecantSolver.Method method)
      Construct a solver.
      Parameters:
      absoluteAccuracy - Absolute accuracy.
      method - Secant-based root-finding method to use.
    • BaseSecantSolver

      protected BaseSecantSolver(double relativeAccuracy, double absoluteAccuracy, BaseSecantSolver.Method method)
      Construct a solver.
      Parameters:
      relativeAccuracy - Relative accuracy.
      absoluteAccuracy - Absolute accuracy.
      method - Secant-based root-finding method to use.
    • BaseSecantSolver

      protected BaseSecantSolver(double relativeAccuracy, double absoluteAccuracy, double functionValueAccuracy, BaseSecantSolver.Method method)
      Construct a solver.
      Parameters:
      relativeAccuracy - Maximum relative error.
      absoluteAccuracy - Maximum absolute error.
      functionValueAccuracy - Maximum function value error.
      method - Secant-based root-finding method to use
  • Method Details

    • solve

      public double solve(int maxEval, UnivariateFunction f, double min, double max, AllowedSolution allowedSolution)
      Solve for a zero in the given interval. A solver may require that the interval brackets a single zero root. Solvers that do require bracketing should be able to handle the case where one of the endpoints is itself a root.
      Specified by:
      solve in interface BracketedUnivariateSolver<UnivariateFunction>
      Parameters:
      maxEval - Maximum number of evaluations.
      f - Function to solve.
      min - Lower bound for the interval.
      max - Upper bound for the interval.
      allowedSolution - The kind of solutions that the root-finding algorithm may accept as solutions.
      Returns:
      A value where the function is zero.
    • solve

      public double solve(int maxEval, UnivariateFunction f, double min, double max, double startValue, AllowedSolution allowedSolution)
      Solve for a zero in the given interval, start at startValue. A solver may require that the interval brackets a single zero root. Solvers that do require bracketing should be able to handle the case where one of the endpoints is itself a root.
      Specified by:
      solve in interface BracketedUnivariateSolver<UnivariateFunction>
      Parameters:
      maxEval - Maximum number of evaluations.
      f - Function to solve.
      min - Lower bound for the interval.
      max - Upper bound for the interval.
      startValue - Start value to use.
      allowedSolution - The kind of solutions that the root-finding algorithm may accept as solutions.
      Returns:
      A value where the function is zero.
    • solve

      public double solve(int maxEval, UnivariateFunction f, double min, double max, double startValue)
      Solve for a zero in the given interval, start at startValue. A solver may require that the interval brackets a single zero root. Solvers that do require bracketing should be able to handle the case where one of the endpoints is itself a root.
      Specified by:
      solve in interface BaseUnivariateSolver<UnivariateFunction>
      Overrides:
      solve in class BaseAbstractUnivariateSolver<UnivariateFunction>
      Parameters:
      maxEval - Maximum number of evaluations.
      f - Function to solve.
      min - Lower bound for the interval.
      max - Upper bound for the interval.
      startValue - Start value to use.
      Returns:
      a value where the function is zero.
    • solveInterval

      public BracketedUnivariateSolver.Interval solveInterval(int maxEval, UnivariateFunction f, double min, double max, double startValue) throws MathIllegalArgumentException, MathIllegalStateException
      Solve for a zero in the given interval and return a tolerance interval surrounding the root.

      It is required that the starting interval brackets a root or that the function value at either end point is 0.0.

      Specified by:
      solveInterval in interface BracketedUnivariateSolver<UnivariateFunction>
      Parameters:
      maxEval - Maximum number of evaluations.
      f - Function to solve.
      min - Lower bound for the interval.
      max - Upper bound for the interval. Must be greater than min.
      startValue - start value to use. Must be in the interval [min, max].
      Returns:
      an interval [ta, tb] such that for some t in [ta, tb] f(t) == 0.0 or has a step wise discontinuity that crosses zero. Both end points also satisfy the convergence criteria so either one could be used as the root. That is the interval satisfies the condition (| tb - ta | <= absolute accuracy + max(ta, tb) * relative accuracy) or ( max(|f(ta)|, |f(tb)|) <= BaseUnivariateSolver.getFunctionValueAccuracy()) or there are no floating point numbers between ta and tb. The width of the interval (tb - ta) may be zero.
      Throws:
      MathIllegalArgumentException - if the arguments do not satisfy the requirements specified by the solver.
      MathIllegalStateException - if the allowed number of evaluations is exceeded.
    • doSolve

      protected final double doSolve() throws MathIllegalStateException
      Method for implementing actual optimization algorithms in derived classes.
      Specified by:
      doSolve in class BaseAbstractUnivariateSolver<UnivariateFunction>
      Returns:
      the root.
      Throws:
      MathIllegalStateException - if the algorithm failed due to finite precision.
    • doSolveInterval

      protected final BracketedUnivariateSolver.Interval doSolveInterval() throws MathIllegalStateException
      Find a root and return the containing interval.
      Returns:
      an interval containing the root such that the selected end point meets the convergence criteria.
      Throws:
      MathIllegalStateException - if convergence fails.