# Integration ## Newton-Cotes methods A related problem to interpolation is when we need to calculate the integral of a function $$I = \int_{x_1}^{x_N} f(x) dx$$ given values of the function at a discrete set of points $x_1\dots x_N$, which we'll write as $f_i\equiv f(x_i)$. For simplicity here we'll assume that the spacing between points on the grid is constant $x_{i+1}-x_i = \Delta x$, but it's straighforward to generalize to non-uniform sampling if you need to. To estimate the value of the integral, we need to model how the function behaves in each interval $x_i>> np.polynomial.legendre.leggauss(2) (array([-0.57735027, 0.57735027]), array([1., 1.])) ``` gives the $N=2$ values. In this case, the weights are both 1, and the $x$ values are $\pm 1/\sqrt{3}$. ```{admonition} Exercise Using [`numpy.polynomial.legendre.leggauss`](https://numpy.org/doc/stable/reference/generated/numpy.polynomial.legendre.leggauss.html) to get the locations and weights for different choices of $N$, implement Gaussian quadratures. Check that the answer is indeed exact for polynomials of degree $2N-1$ or less. What happens for higher order polynomials? What is the error in the approximation? ``` Gaussian quadratures can be applied more generally to integrals of the form $$\int W(x) f(x) dx$$ for some weight function $W(x)$ (in the previous example we had $W(x)=1$). We write the integral as a sum $$\int W(x) f(x) dx= \sum_{i=1}^N w_i f(x_i)$$ and find the choices of $w_i$ and $x_i$ that make the sum exact for a polynomial of degree $2N-1$ or less. One example is $W(x)=e^{-x^2}$, ie. integrals $$\int_0^\infty e^{-x^2} f(x) dx.$$ In this case, the weights and locations are given by [numpy.polynomial.hermite.hermgauss](https://numpy.org/doc/stable/reference/generated/numpy.polynomial.hermite.hermgauss.html). [The locations $x_i$ are the roots of the $N$th Hermite polynomial, which are the polynomials that are orthogonal under an inner product defined with weight function $W(x)$.] ## Integration challenge ```{admonition} Exercise: Average velocity of the Maxwell-Boltzmann distribution. Use Simpson's rule, Gaussian quadrature, and the general purpose integrator [`scipy.integrate.quad`](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.quad.html) to evaluate the average velocity $\langle\left|v\right|\rangle$ for the [Maxwell-Boltzmann distribution](https://en.wikipedia.org/wiki/Maxwell–Boltzmann_distribution). For each method, check the numerical error comparing to the analytic result. How many points do you need to get to $0.1$% accuracy? For Simpson's rule you can use your own implementation from above or you could try [`scipy.integrate.simpson`](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.simpson.html)). ```