Class BrentSolver
- java.lang.Object
-
- org.apache.commons.numbers.rootfinder.BrentSolver
-
public class BrentSolver extends java.lang.Object
This class implements the Brent algorithm for finding zeros of real univariate functions. The function should be continuous but not necessarily smooth. Thesolve
method returns a zerox
of the functionf
in the given interval[a, b]
to within a tolerance2 eps abs(x) + t
whereeps
is the relative accuracy andt
is 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 double
absoluteAccuracy
Absolute accuracy.private double
functionValueAccuracy
Function accuracy.private double
relativeAccuracy
Relative 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 double
brent(java.util.function.DoubleUnaryOperator func, double lo, double hi, double fLo, double fHi)
Search for a zero inside the provided interval.private static boolean
equalsZero(double value)
Return true if the value is within 1 ULP of zero.double
findRoot(java.util.function.DoubleUnaryOperator func, double min, double max)
Search the function's zero within the given interval.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.
-
-
-
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 > max
orinitial
is 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
-
-