Versión corta de mi pregunta
¿Puedo aplicar la rutina Gauss-Hermite sólo con un intervalo infinito o puedo transformar el intervalo?
Versión larga (razón por la que pregunto)
Estoy interesado en resolver ecuaciones integrales numéricamente y una parte de esto, si lo he entendido bien, es el uso de rutinas de integración numérica. Así que me aventuré en este campo e implementé con éxito el punto medio, el Simpson y la rutina de Gauss-Legendre.
Aquí está mi implementación de la rutina Gauss-Legendre en R (dependiendo del paquete statmod
):
gauss_legendre <- function(f, upper, lower, nr_int, ...) {
#1. Compute the nodes; those are the roots of the legendre-polynom
leg_poly <- gauss.quad(nr_int)
x <- leg_poly$nodes
#2. Compute the weights as follows: 2/((1-x^2)Ableitung(P(x))^2)
w <- leg_poly$weights
#3. Compute the integral
x_transformed <- ((x+1)*(upper - lower)/2 + lower)
(upper - lower)/2*sum(w * mapply(f, x_transformed, ...))
}
Así que, básicamente, las dos primeras partes me dan los números tabulados aquí y la tercera parte sólo computa:
∫baf(x)dx=b−a2n∑i=1ωif(b−a2xi+a+b2)∫baf(x)dx=b−a2n∑i=1ωif(b−a2xi+a+b2)
Comprobemos que funciona (nótese que integrate
es sólo la función incorporada en R):
gauss_legendre(function(x) {x^3 + log(x) + sqrt(x)}, 10, 2, 10)
[1] 2528.836
> integrate(function(x) {x^3 + log(x) + sqrt(x)}, 2, 10)
2528.836 with absolute error < 2.8e-11
Como puede ver, esto funciona con un intervalo que va de 2 a 10 transformando el xx valores. Dado que el intervalo está bien definido, no veo ningún problema en utilizarlo para cualquier intervalo.
A continuación, implementé la rutina Gauss-Hermite:
gauss_hermite <- function(f, upper, lower, nr_int, ...) {
#1. Compute the nodes; those are the roots of the Hermite-polynom
her_poly <- gauss.quad(nr_int, "hermite")
x <- her_poly$nodes
#2. Compute the weights according to the function; attention: this already includes the term exp(x^2)
w <- her_poly$weights * exp(x^2)
#3. Compute the integral
sum(w * mapply(f, x))
}
Esto funciona, por ejemplo, al calcular la integral de la función de densidad de la distribución normal estándar:
gauss_hermite(dnorm, -Inf, Inf, 100)
1
Sin embargo, no obtengo ningún resultado útil cuando el intervalo no va de [−∞;∞][−∞;∞] . Por otro lado, en ninguno de los materiales que he leído se menciona que el enfoque de Gauss-Hermite esté limitado a ese caso (aunque he leído que es útil en relación con las variables aleatorias normales). Así que mi pregunta (perdón por el largo prólogo): ¿puedo aplicar la rutina de Gauss-Hermite sólo con un intervalo infinito o puedo transformar el intervalo?
Como probablemente habrás adivinado por la pregunta, no soy un matemático, así que cualquier ayuda con esto sería genial.