Brent's root solver.
- Template Parameters
-
T | Type for x and f(x) - must be floating point |
Func | Function object describing function to solve where T f(x) = Func::operator()(const T& x) |
- Parameters
-
[out] | numIter | Number of iterations required for convergence to specified tolerance. If equal to MAXITER, the solution is not within specified tolerance. |
[in] | f | Instance of function to solve |
[in] | aPt | Lower bound |
[in] | bPt | Upper bound |
[in] | tol | Tolerance for solve - essentially the spread of the bracket. This can be specified in absolute terms, or, if given by an integer cast to T, the number of significant digits to solve for in x. The default is given by the RootTr class. Note that epsilon is also considered for specifying the spread of the bracket. |
[in] | MAXITER | Maximum iterations. Default (100). If reached, a message is written to cerr but the program otherwise completes |
- Returns
- x where f(x) = 0
Example
* #include <functional>
* #include "RootSolver.H"
* // Func is not allowed to be local until the C++0x standard
* struct Func : public std::unary_function<Real, Real>
* {
* Real operator()(const Real& a_x) const
* {
* return 5*std::pow(a_x, 5) - 3*std::pow(a_x, 3) + a_x;
* }
* };
* void foo()
* {
* int numIter;
* const Real xmin = -1.;
* const Real xmax = 1.;
* const Real x0 = RootSolver::Brent(numIter, Func(), xmin, xmax);
* if (numIter == RootTr<Real>::maxIter)
* {
* std::pout() << "Uh oh\n";
* }
* }
*
References MayDay::Abort(), Abs(), CH_assert, min(), and pout().