Class BracketingNthOrderBrentSolver

All Implemented Interfaces:
BaseUnivariateSolver<UnivariateFunction>, BracketedUnivariateSolver<UnivariateFunction>, UnivariateSolver

public class BracketingNthOrderBrentSolver extends AbstractUnivariateSolver implements BracketedUnivariateSolver<UnivariateFunction>
This class implements a modification of the Brent algorithm.

The changes with respect to the original Brent algorithm are:

  • the returned value is chosen in the current interval according to user specified AllowedSolution,
  • the maximal order for the invert polynomial root search is user-specified instead of being invert quadratic only

The given interval must bracket the root.

  • Constructor Details

    • BracketingNthOrderBrentSolver

      public BracketingNthOrderBrentSolver()
      Construct a solver with default accuracy and maximal order (1e-6 and 5 respectively)
    • BracketingNthOrderBrentSolver

      public BracketingNthOrderBrentSolver(double absoluteAccuracy, int maximalOrder) throws MathIllegalArgumentException
      Construct a solver.
      Parameters:
      absoluteAccuracy - Absolute accuracy.
      maximalOrder - maximal order.
      Throws:
      MathIllegalArgumentException - if maximal order is lower than 2
    • BracketingNthOrderBrentSolver

      public BracketingNthOrderBrentSolver(double relativeAccuracy, double absoluteAccuracy, int maximalOrder) throws MathIllegalArgumentException
      Construct a solver.
      Parameters:
      relativeAccuracy - Relative accuracy.
      absoluteAccuracy - Absolute accuracy.
      maximalOrder - maximal order.
      Throws:
      MathIllegalArgumentException - if maximal order is lower than 2
    • BracketingNthOrderBrentSolver

      public BracketingNthOrderBrentSolver(double relativeAccuracy, double absoluteAccuracy, double functionValueAccuracy, int maximalOrder) throws MathIllegalArgumentException
      Construct a solver.
      Parameters:
      relativeAccuracy - Relative accuracy.
      absoluteAccuracy - Absolute accuracy.
      functionValueAccuracy - Function value accuracy.
      maximalOrder - maximal order.
      Throws:
      MathIllegalArgumentException - if maximal order is lower than 2
  • Method Details

    • getMaximalOrder

      public int getMaximalOrder()
      Get the maximal order.
      Returns:
      maximal order
    • doSolve

      protected double doSolve()
      Method for implementing actual optimization algorithms in derived classes.
      Specified by:
      doSolve in class BaseAbstractUnivariateSolver<UnivariateFunction>
      Returns:
      the root.
    • doSolveInterval

      protected BracketedUnivariateSolver.Interval doSolveInterval()
      Find a root and return the containing interval.
      Returns:
      an interval containing the root such that both end points meet the convergence criteria.
    • solve

      public double solve(int maxEval, UnivariateFunction f, double min, double max, AllowedSolution allowedSolution) throws MathIllegalArgumentException, MathIllegalStateException
      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.
      Throws:
      MathIllegalArgumentException - if the arguments do not satisfy the requirements specified by the solver.
      MathIllegalStateException - if the allowed number of evaluations is exceeded.
    • solve

      public double solve(int maxEval, UnivariateFunction f, double min, double max, double startValue, AllowedSolution allowedSolution) throws MathIllegalArgumentException, MathIllegalStateException
      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.
      Throws:
      MathIllegalArgumentException - if the arguments do not satisfy the requirements specified by the solver.
      MathIllegalStateException - if the allowed number of evaluations is exceeded.
    • 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.