Class BrentSolver
- java.lang.Object
-
- org.apache.commons.numbers.rootfinder.BrentSolver
-
public class BrentSolver extends java.lang.ObjectThis class implements the Brent algorithm for finding zeros of real univariate functions. The function should be continuous but not necessarily smooth. Thesolvemethod returns a zeroxof the functionfin the given interval[a, b]to within a tolerance2 eps abs(x) + twhereepsis the relative accuracy andtis the absolute accuracy.The given interval must bracket the root.
The reference implementation is given in chapter 4 of
Algorithms for Minimization Without Derivatives, Richard P. Brent, Dover, 2002
-
-
Field Summary
Fields Modifier and Type Field Description private doubleabsoluteAccuracyAbsolute accuracy.private doublefunctionValueAccuracyFunction accuracy.private doublerelativeAccuracyRelative accuracy.
-
Constructor Summary
Constructors Constructor Description BrentSolver(double relativeAccuracy, double absoluteAccuracy, double functionValueAccuracy)Construct a solver.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private doublebrent(java.util.function.DoubleUnaryOperator func, double lo, double hi, double fLo, double fHi)Search for a zero inside the provided interval.private static booleanequalsZero(double value)Return true if the value is within 1 ULP of zero.doublefindRoot(java.util.function.DoubleUnaryOperator func, double min, double max)Search the function's zero within the given interval.doublefindRoot(java.util.function.DoubleUnaryOperator func, double min, double initial, double max)Search the function's zero within the given interval, starting from the given estimate.
-
-
-
Method Detail
-
findRoot
public double findRoot(java.util.function.DoubleUnaryOperator func, double min, double max)Search the function's zero within the given interval.- Parameters:
func- Function to solve.min- Lower bound.max- Upper bound.- Returns:
- the root.
- Throws:
java.lang.IllegalArgumentException- ifmin > max.java.lang.IllegalArgumentException- if the given interval does not bracket the root.
-
findRoot
public double findRoot(java.util.function.DoubleUnaryOperator func, double min, double initial, double max)Search the function's zero within the given interval, starting from the given estimate.- Parameters:
func- Function to solve.min- Lower bound.initial- Initial guess.max- Upper bound.- Returns:
- the root.
- Throws:
java.lang.IllegalArgumentException- ifmin > maxorinitialis not in the[min, max]interval.java.lang.IllegalArgumentException- if the given interval does not bracket the root.
-
brent
private double brent(java.util.function.DoubleUnaryOperator func, double lo, double hi, double fLo, double fHi)Search for a zero inside the provided interval. This implementation is based on the algorithm described at page 58 of the bookAlgorithms for Minimization Without Derivatives, Richard P. Brent, Dover 0-486-41998-3
- Parameters:
func- Function to solve.lo- Lower bound of the search interval.hi- Higher bound of the search interval.fLo- Function value at the lower bound of the search interval.fHi- Function value at the higher bound of the search interval.- Returns:
- the value where the function is zero.
-
equalsZero
private static boolean equalsZero(double value)
Return true if the value is within 1 ULP of zero.- Parameters:
value- Value- Returns:
- true if zero within a 1 ULP tolerance
-
-