9.4: Cuadraturas Gaussianas
- Page ID
- 125277
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)Anteriormente, hemos asumido en nuestro análisis de esquemas de integración numérica que los puntos de discretización están igualmente espaciados. Esta suposición no es estrictamente necesaria; por ejemplo, podemos modificar fácilmente las fórmulas de regla de punto medio y regla de trapecio para trabajar con puntos no equidistantes.
Sin embargo, si somos libres de elegir los puntos de discretización para realizar la integración numérica, y estos puntos no necesitan estar igualmente espaciados, entonces es posible explotar esta libertad para mejorar aún más la precisión de la integración numérica. La idea es optimizar la colocación de los puntos de discretización, para minimizar el error numérico resultante. Esta es la idea básica detrás del método de integración por cuadraturas gaussianas.
No discutiremos los detalles de este método de integración numérica. Para usarlo, puedes llamar a la función scipy.integrate.quad
. Esta función utiliza una biblioteca numérica de bajo nivel llamada QUADPACK, que realiza la integración en cuadratura con cuadraturas adaptativas, es decir, determina automáticamente cuántos puntos de discretización deben usarse, y dónde deben ubicarse, para producir un resultado con el precisión numérica deseada.
Debido a que QUADPACK calcula los puntos de discretización por sí mismo, hay que pasar quad
una función que represente el integrando, en lugar de una matriz de valores integrand como con trapz
o simps
. La forma estándar de llamar a la función es
t = quad(f, a, b)
que calcula la integral
\[t = \int_a^b f(x) dx.\]
El valor de retorno es una tupla de la forma (t, err)
, donde t
es el valor de la integral y err
es una estimación del error numérico. La función quad
también acepta muchas otras entradas opcionales, que pueden usarse para especificar entradas adicionales para pasar a la función integrand, la tolerancia a errores, el número de subintervalos a usar, etc. Consulte la documentación para más detalles.
La elección de si realizar la integración numérica usando la regla de Simpson (simps
) o cuadraturas gaussianas (quad
) es situacional. Si ya conoces los valores de los integrands en un conjunto predeterminado de puntos de discretización (por ejemplo, a partir del resultado de un cálculo de diferencia finita), entonces usa simps
. Si puedes definir una función que pueda calcular rápidamente el valor del integrando en cualquier punto, usa quad
.
Aquí hay un ejemplo del uso de quad
para calcular la integral\(\int_{0}^\infty \frac{dx}{x^2 + 1}\):
from scipy import * from scipy.integrate import quad def f(x): return 1.0 / (x*x+1) integ, _ = quad(f, 0, 1000) print(integ)
(Tenga en cuenta que quad
devuelve dos valores; el primero es el valor calculado de la integral, y el otro es el error absoluto, que no nos interesa, por lo que lo tiramos en la variable “descartable” llamada _
. Consulte la documentación para más detalles.) Al ejecutar el programa anterior se imprime el resultado\(1.569796\dots,\) que difiere del resultado exacto,\(\pi/2 = 1.570796\dots,\) por un error relativo de\(0.06\%\).
Aquí hay otro ejemplo, donde el integrando toma un parámetro adicional:\(\int_0^\infty x e^{-\lambda x}\, dx\):
from scipy import * from scipy.integrate import quad def f(x, lambd): return x * exp(-lambd * x) integ, _ = quad(f, 0, 100, args=(0.5)) print(integ)
Al ejecutar el programa se imprime el resultado\(4.0\), el cual concuerda con el resultado exacto de\(1/\lambda^2\) para el valor elegido del parámetro\(\lambda =0.5\).