4 votos

¿Puedo aplicar la rutina Gauss-Hermite sólo con un intervalo infinito o puedo transformar el intervalo?

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=ba2ni=1ωif(ba2xi+a+b2)baf(x)dx=ba2ni=1ωif(ba2xi+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.

2voto

Andrew Puntos 140

Sí, hay transformaciones que transforman integrales finitas en integrales doblemente infinitas, como la tanhtanh -sustitución

baf(x)dx=ba2f(a+b2+ba2tanhu)sech2udubaf(x)dx=ba2f(a+b2+ba2tanhu)sech2udu

y sí, se puede aplicar la cuadratura de Gauss-Hermite a cualquier integral doblemente infinita convenientemente transformada:

f(v)dvnk=1wkexp(x2k)f(xk)f(v)dvnk=1wkexp(x2k)f(xk)

PERO

Gauss-Hermite no funciona muy bien si las funciones que se integran no son de la forma exp(x2)f(x)exp(x2)f(x) , donde f(x)f(x) es una función bien aproximada por un polinomio. Recuerde que la idea de la cuadratura gaussiana en general es "factorizar" el comportamiento rebelde en sus integrados, y mantener ese comportamiento a los nodos y pesos de esa regla de cuadratura. Eso supuestamente te deja con un resto que se comporta mucho mejor para la cuadratura que el integrando original. En efecto, tratar de usar Gauss-Hermite para integrar cosas que no tienen el factor exp(x2)exp(x2) es como intentar usar un cepillo de dientes para fregar un inodoro: conseguirás terminar, pero te llevará un tiempo.

Para entenderlo mejor, consideremos las dos integrales

I1=sechu;du=πI2=exp(u2)sechudu1.4790611714495759

Aquí hay unos cuantos Mathematica rutinas para generar los nodos y pesos para la cuadratura Gauss-Hermite:

(* Golub-Welsch algorithm *)
golubWelsch[d_?VectorQ, e_?VectorQ] := 
 Transpose[
  MapAt[(First[e] Map[First, #]^2) &, 
   Eigensystem[
    SparseArray[{Band[{1, 1}] -> d, Band[{1, 2}] -> Sqrt[Rest[e]], 
      Band[{2, 1}] -> Sqrt[Rest[e]]}, {Length[d], Length[d]}]], {2}]]

(* generate nodes and weights for Gauss-Hermite quadrature *)
ghq[n_Integer, prec_: MachinePrecision] := 
 Transpose[
  Sort[golubWelsch[ConstantArray[0, n], 
    N[Prepend[Range[n - 1]/2, Sqrt[Pi]], prec]]]]

Aquí hay una breve tabla del error relativo en el uso de n -La cuadratura de Gauss-Hermite para la evaluación numérica de estas dos integrales (realizada con Mathematica ):

nlog10|estimateI11|log10|estimateI21|20.581531.306651.08042.6953101.65184.3750152.09265.6971202.46436.8235252.79177.8217

Claramente, la convergencia de la cuadratura de Gauss-Hermite para I1 es bastante pobre en comparación con la convergencia relativamente más rápida de I2 . A veces, tendrás suerte y encontrarás una función en la que Gauss-Hermite funcione bien aunque no tenga un exp(x2) factor, pero esas cosas no son tan comunes.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X