...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
#include <boost/math/quadrature/tanh_sinh.hpp> #include <boost/math/quadrature/exp_sinh.hpp> #include <boost/math/quadrature/sinh_sinh.hpp> namespace boost{ namespace math{ namespace quadrature { template<class Real> class tanh_sinh { public: tanh_sinh(size_t max_refinements = 15, const Real& min_complement = tools::min_value<Real>() * 4) template<class F> auto integrate(const F f, Real a, Real b, Real tolerance = tools::root_epsilon<Real>(), Real* error = nullptr, Real* L1 = nullptr, std::size_t* levels = nullptr)->decltype(std::declval<F>()(std::declval<Real>())) const; template<class F> auto integrate(const F f, Real tolerance = tools::root_epsilon<Real>(), Real* error = nullptr, Real* L1 = nullptr, std::size_t* levels = nullptr)->decltype(std::declval<F>()(std::declval<Real>())) const; }; template<class Real> class exp_sinh { public: exp_sinh(size_t max_refinements = 9); template<class F> auto integrate(const F f, Real a, Real b, Real tol = sqrt(std::numeric_limits<Real>::epsilon()), Real* error = nullptr, Real* L1 = nullptr, size_t* levels = nullptr)->decltype(std::declval<F>()(std::declval<Real>())) const; template<class F> auto integrate(const F f, Real tol = sqrt(std::numeric_limits<Real>::epsilon()), Real* error = nullptr, Real* L1 = nullptr, size_t* levels = nullptr)->decltype(std::declval<F>()(std::declval<Real>())) const; }; template<class Real> class sinh_sinh { public: sinh_sinh(size_t max_refinements = 9); template<class F> auto integrate(const F f, Real tol = sqrt(std::numeric_limits<Real>::epsilon()), Real* error = nullptr, Real* L1 = nullptr, size_t* levels = nullptr)->decltype(std::declval<F>()(std::declval<Real>())) const; }; }}}
These three integration routines provide robust general purpose quadrature,
each having a "native" range over which quadrature is performed.
For example, the sinh_sinh
quadrature integrates over the entire real line, the tanh_sinh
over (-1, 1), and the exp_sinh
over (0, ∞). The latter integrators also have auxiliary ranges which are handled
via a change of variables on the function being integrated, so that the
tanh_sinh
can handle integration
over (a, b), and exp_sinh
over /(a, ∞) and(-∞, b)/.
Like the other quadrature routines in Boost, these routines support both real and complex-valued integrands.
The integrate
methods which
do not specify a range always integrate over the native range of the method,
and generally are the most efficient and produce the smallest code, on the
other hand the methods which do specify the bounds of integration are the
most general, and use argument transformations which are generally very robust.
The following table summarizes the ranges supported by each method:
Integrator |
Native range |
Other supported ranges |
Comments |
---|---|---|---|
tanh_sinh |
(-1,1) |
(a,b) |
Special care is taken for endpoints at or near zero to ensure that abscissa values are calculated without the loss of precision that would normally occur. Likewise when transforming to an infinite endpoint, the additional information which tanh_sinh has internally on abscissa values is used to ensure no loss of precision during the transformation. |
exp_sinh |
(0,∞) |
(a,∞) |
|
sinh_sinh |
(-∞,∞) |