Class BrentSolver
java.lang.Object
org.apache.commons.numbers.rootfinder.BrentSolver
This class implements the
Brent algorithm for finding zeros of real univariate functions.
The function should be continuous but not necessarily smooth.
The
solve
method returns a zero x
of the function f
in the given interval [a, b]
to within a tolerance
2 eps abs(x) + t
where eps
is the relative accuracy and
t
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
FieldsModifier and TypeFieldDescriptionprivate final double
Absolute accuracy.private final double
Function accuracy.private final double
Relative accuracy. -
Constructor Summary
ConstructorsConstructorDescriptionBrentSolver
(double relativeAccuracy, double absoluteAccuracy, double functionValueAccuracy) Construct a solver. -
Method Summary
Modifier and TypeMethodDescriptionprivate double
brent
(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
(DoubleUnaryOperator func, double min, double max) Search the function's zero within the given interval.double
findRoot
(DoubleUnaryOperator func, double min, double initial, double max) Search the function's zero within the given interval, starting from the given estimate.
-
Field Details
-
relativeAccuracy
private final double relativeAccuracyRelative accuracy. -
absoluteAccuracy
private final double absoluteAccuracyAbsolute accuracy. -
functionValueAccuracy
private final double functionValueAccuracyFunction accuracy.
-
-
Constructor Details
-
BrentSolver
public BrentSolver(double relativeAccuracy, double absoluteAccuracy, double functionValueAccuracy) Construct a solver.- Parameters:
relativeAccuracy
- Relative accuracy.absoluteAccuracy
- Absolute accuracy.functionValueAccuracy
- Function value accuracy.
-
-
Method Details
-
findRoot
Search the function's zero within the given interval.- Parameters:
func
- Function to solve.min
- Lower bound.max
- Upper bound.- Returns:
- the root.
- Throws:
IllegalArgumentException
- ifmin > max
.IllegalArgumentException
- if the given interval does not bracket the root.
-
findRoot
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:
IllegalArgumentException
- ifmin > max
orinitial
is not in the[min, max]
interval.IllegalArgumentException
- if the given interval does not bracket the root.
-
brent
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
-