double_exponential.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Copyright Nick Thompson, 2017
  2. // Use, modification and distribution are subject to the
  3. // Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt
  5. // or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #include <iostream>
  7. #include <cmath>
  8. #include <boost/math/quadrature/tanh_sinh.hpp>
  9. #include <boost/math/quadrature/sinh_sinh.hpp>
  10. #include <boost/math/quadrature/exp_sinh.hpp>
  11. using boost::math::quadrature::tanh_sinh;
  12. using boost::math::quadrature::sinh_sinh;
  13. using boost::math::quadrature::exp_sinh;
  14. using boost::math::constants::pi;
  15. using boost::math::constants::half_pi;
  16. using boost::math::constants::half;
  17. using boost::math::constants::third;
  18. using boost::math::constants::root_pi;
  19. using std::log;
  20. using std::cos;
  21. using std::cosh;
  22. using std::exp;
  23. using std::sqrt;
  24. int main()
  25. {
  26. std::cout << std::setprecision(std::numeric_limits<double>::digits10);
  27. double tol = sqrt(std::numeric_limits<double>::epsilon());
  28. // For an integral over a finite domain, use tanh_sinh:
  29. tanh_sinh<double> tanh_integrator(tol, 10);
  30. auto f1 = [](double x) { return log(x)*log(1-x); };
  31. double Q = tanh_integrator.integrate(f1, (double) 0, (double) 1);
  32. double Q_expected = 2 - pi<double>()*pi<double>()*half<double>()*third<double>();
  33. std::cout << "tanh_sinh quadrature of log(x)log(1-x) gives " << Q << std::endl;
  34. std::cout << "The exact integral is " << Q_expected << std::endl;
  35. // For an integral over the entire real line, use sinh-sinh quadrature:
  36. sinh_sinh<double> sinh_integrator(tol, 10);
  37. auto f2 = [](double t) { return cos(t)/cosh(t);};
  38. Q = sinh_integrator.integrate(f2);
  39. Q_expected = pi<double>()/cosh(half_pi<double>());
  40. std::cout << "sinh_sinh quadrature of cos(x)/cosh(x) gives " << Q << std::endl;
  41. std::cout << "The exact integral is " << Q_expected << std::endl;
  42. // For half-infinite intervals, use exp-sinh.
  43. // Endpoint singularities are handled well:
  44. exp_sinh<double> exp_integrator(tol, 10);
  45. auto f3 = [](double t) { return exp(-t)/sqrt(t); };
  46. Q = exp_integrator.integrate(f3, 0, std::numeric_limits<double>::infinity());
  47. Q_expected = root_pi<double>();
  48. std::cout << "exp_sinh quadrature of exp(-t)/sqrt(t) gives " << Q << std::endl;
  49. std::cout << "The exact integral is " << Q_expected << std::endl;
  50. }