6 #ifndef THEORETICA_INTEGRATION_H
7 #define THEORETICA_INTEGRATION_H
9 #include "../core/constants.h"
10 #include "../core/function.h"
11 #include "../polynomial/polynomial.h"
12 #include "../polynomial/orthogonal.h"
23 template<
typename T = real>
27 P.coeff.resize(p.size() + 1);
30 for (
unsigned int i = 0; i < p.size(); ++i)
31 P[i + 1] = p[i] / T(i + 1);
45 template<
typename RealFunction>
54 const real dx = (b - a) / steps;
57 for (
unsigned int i = 0; i < steps; ++i)
58 res += f(a + (i + 0.5) * dx);
72 template<
typename RealFunction>
81 const real dx = (b - a) / steps;
84 res += 0.5 * (f(a) + f(b));
86 for (
unsigned int i = 1; i < steps; ++i)
101 template<
typename RealFunction>
110 const real dx = (b - a) / (
real) steps;
119 for (
unsigned int i = 2; i < steps; i += 2)
120 res += 2 * f(a + i * dx);
122 for (
unsigned int i = 1; i < steps; i += 2)
123 res += 4 * f(a + i * dx);
125 return res * dx / 3.0;
137 template<
typename RealFunction>
141 unsigned int iter = 8) {
145 T[0][0] = (f(a) + f(b)) * (b - a) / 2.0;
147 for (
unsigned int j = 1; j < iter; ++j) {
153 for (
unsigned int k = 1; k <= j; ++k) {
154 const uint64_t coeff = uint64_t(1) << (2 * k);
155 T[j][k] = (coeff * T[j][k - 1] - T[j - 1][k - 1]) / (coeff - 1);
160 return T[iter - 1][iter - 1];
172 template<
typename RealFunction>
176 real tolerance = CALCULUS_INTEGRAL_TOL) {
178 const unsigned int MAX_ROMBERG_ITER = 16;
179 real T[MAX_ROMBERG_ITER][MAX_ROMBERG_ITER];
181 T[0][0] = (f(a) + f(b)) * (b - a) / 2.0;
183 for (
unsigned int j = 1; j < 16; ++j) {
189 for (
unsigned int k = 1; k <= j; ++k) {
190 const uint64_t coeff = uint64_t(1) << (2 * k);
191 T[j][k] = (coeff * T[j][k - 1] - T[j - 1][k - 1]) / (coeff - 1);
195 if(
abs(T[j][j] - T[j - 1][j - 1]) < tolerance)
200 return T[MAX_ROMBERG_ITER - 1][MAX_ROMBERG_ITER - 1];
209 template<
typename RealFunction>
211 RealFunction f,
const std::vector<real>& x,
const std::vector<real>& w) {
213 if(x.size() != w.size()) {
220 for (
int i = 0; i < x.size(); ++i)
221 res += w[i] * f(x[i]);
233 template<
typename RealFunction>
235 RealFunction f,
real* x,
real* w,
unsigned int n) {
239 for (
unsigned int i = 0; i < n; ++i)
240 res += w[i] * f(x[i]);
253 template<
typename RealFunction>
255 RealFunction f,
real* x,
real* w,
unsigned int n,
260 for (
unsigned int i = 0; i < n; ++i)
261 res += w[i] * f(x[i]) * Winv(x[i]);
276 template<
typename RealFunction>
281 const real halfdiff = (b - a) / 2.0;
285 for (
int i = n - 1; i >= 0; --i)
286 res += w[i] * f(halfdiff * x[i] +
mean);
288 return res * halfdiff;
301 template<
typename RealFunction>
304 const std::vector<real>& x,
const std::vector<real>& w) {
307 const real halfdiff = (b - a) / 2.0;
311 for (
int i = x.size() - 1; i >= 0; --i)
312 res += w[i] * f(halfdiff * x[i] +
mean);
314 return res * halfdiff;
326 template<
typename RealFunction>
328 RealFunction f,
real a,
real b,
const std::vector<real>& x) {
344 template<
typename RealFunction>
349 tables::legendre_roots_2, tables::legendre_weights_2, 2);
break;
351 tables::legendre_roots_4, tables::legendre_weights_4, 4);
break;
353 tables::legendre_roots_8, tables::legendre_weights_8, 8);
break;
355 tables::legendre_roots_16, tables::legendre_weights_16, 16);
break;
369 template<
typename RealFunction>
384 template<
typename RealFunction>
386 RealFunction f,
real a,
real b,
const std::vector<real>& x) {
395 for (
int i = x.size() - 1; i >= 0; --i)
396 res += weights[i] * (exp_a * f(x[i] + a) - exp_b * f(x[i] + b));
410 template<
typename RealFunction>
415 tables::laguerre_roots_2, tables::laguerre_weights_2, 2);
break;
417 tables::laguerre_roots_4, tables::laguerre_weights_4, 4);
break;
419 tables::laguerre_roots_8, tables::laguerre_weights_8, 8);
break;
421 tables::laguerre_roots_16, tables::laguerre_weights_16, 16);
break;
438 template<
typename RealFunction>
453 template<
typename RealFunction>
458 tables::hermite_roots_2, tables::hermite_weights_2, 2);
break;
460 tables::hermite_roots_4, tables::hermite_weights_4, 4);
break;
462 tables::hermite_roots_8, tables::hermite_weights_8, 8);
break;
464 tables::hermite_roots_16, tables::hermite_weights_16, 16);
break;
479 real tol = CALCULUS_INTEGRAL_TOL,
unsigned int max_iter = 100) {
482 real x_n = a + step_sz;
493 while(
abs(delta) > tol && i <= max_iter) {
502 TH_MATH_ERROR(
"integral_inf_riemann", i, NO_ALGO_CONVERGENCE);
517 template<
typename RealFunction>
532 template<
typename RealFunction>
A polynomial of arbitrary order.
Definition: polynomial.h:25
#define TH_MATH_ERROR(F_NAME, VALUE, EXCEPTION)
TH_MATH_ERROR is a macro which throws exceptions or modifies errno (depending on which compiling opti...
Definition: error.h:219
Roots and weights for Gaussian quadrature.
real mean(const histogram &h)
Compute the mean of the values of a histogram.
Definition: histogram.h:296
Main namespace of the library which contains all functions and objects.
Definition: algebra.h:27
double real
A real number, defined as a floating point type.
Definition: constants.h:188
real inf()
Return positive infinity in floating point representation.
Definition: error.h:76
dual2 abs(dual2 x)
Compute the absolute value of a second order dual number.
Definition: dual2_functions.h:183
std::vector< real > hermite_weights(const std::vector< real > &roots)
Hermite weights for Gauss-Hermite quadrature of n-th order.
Definition: orthogonal.h:316
dual2 exp(dual2 x)
Compute the exponential of a second order dual number.
Definition: dual2_functions.h:130
auto sum(const Vector &X)
Compute the sum of a vector of real values using pairwise summation to reduce round-off error.
Definition: dataset.h:219
real integral_inf_riemann(real_function f, real a, real step_sz=1, real tol=CALCULUS_INTEGRAL_TOL, unsigned int max_iter=100)
Integrate a function from a point up to infinity by integrating it by steps, stopping execution when ...
Definition: integral.h:477
std::vector< real > legendre_weights(const std::vector< real > &roots)
Legendre weights for Gauss-Legendre quadrature of n-th order.
Definition: orthogonal.h:274
real integral_romberg(RealFunction f, real a, real b, unsigned int iter=8)
Approximate the definite integral of an arbitrary function using Romberg's method accurate to the giv...
Definition: integral.h:138
constexpr int CALCULUS_INTEGRAL_STEPS
Default number of steps for integral approximation.
Definition: constants.h:272
real integral_gauss(RealFunction f, const std::vector< real > &x, const std::vector< real > &w)
Use Gaussian quadrature using the given points and weights.
Definition: integral.h:210
real integral_laguerre(RealFunction f, const std::vector< real > &x)
Use Gauss-Laguerre quadrature of arbitrary degree to approximate an integral over [0,...
Definition: integral.h:370
real integral_trapezoid(RealFunction f, real a, real b, unsigned int steps=CALCULUS_INTEGRAL_STEPS)
Approximate the definite integral of an arbitrary function using the trapezoid method.
Definition: integral.h:73
real integral_romberg_tol(RealFunction f, real a, real b, real tolerance=CALCULUS_INTEGRAL_TOL)
Approximate the definite integral of an arbitrary function using Romberg's method to the given tolera...
Definition: integral.h:173
real integral_hermite(RealFunction f, const std::vector< real > &x)
Use Gauss-Hermite quadrature of arbitrary degree to approximate an integral over (-inf,...
Definition: integral.h:439
std::vector< real > legendre_roots(unsigned int n)
Roots of the n-th Legendre polynomial.
Definition: orthogonal.h:249
polynomial< T > integral(const polynomial< T > &p)
Compute the indefinite integral of a polynomial.
Definition: integral.h:24
real integral_simpson(RealFunction f, real a, real b, unsigned int steps=CALCULUS_INTEGRAL_STEPS)
Approximate the definite integral of an arbitrary function using Simpson's method.
Definition: integral.h:102
real integral_legendre(RealFunction f, real a, real b, real *x, real *w, unsigned int n)
Use Gauss-Legendre quadrature of arbitrary degree to approximate a definite integral providing the ro...
Definition: integral.h:277
std::function< real(real)> real_function
Function pointer to a real function of real variable.
Definition: function.h:20
real integral_midpoint(RealFunction f, real a, real b, unsigned int steps=CALCULUS_INTEGRAL_STEPS)
Approximate the definite integral of an arbitrary function using the midpoint method.
Definition: integral.h:46
real nan()
Return a quiet NaN number in floating point representation.
Definition: error.h:54
std::vector< real > laguerre_weights(const std::vector< real > &roots)
Laguerre weights for Gauss-Laguerre quadrature of n-th order.
Definition: orthogonal.h:295