¿Alguien puede explicar por qué scipy.integrate.quad da resultados diferentes para rangos igualmente largos al integrar sin(X)?

StackOverflow https://stackoverflow.com/questions/581186

Pregunta

Estoy tratando de integrar numéricamente una función arbitraria (conocida cuando código) en mi programa utilizando métodos de integración numérica.Estoy usando Python 2.5.2 junto con el paquete de integración numérica de SciPy.Para tener una idea, decidí intentar integrar sin(x) y observé este comportamiento.

>>> from math import pi
>>> from scipy.integrate import quad
>>> from math import sin
>>> def integrand(x):
...     return sin(x)
... 
>>> quad(integrand, -pi, pi)
(0.0, 4.3998892617846002e-14)
>>> quad(integrand, 0, 2*pi)
(2.2579473462709165e-16, 4.3998892617846002e-14)

Encuentro este comportamiento extraño porque...
1.En la integración ordinaria, la integración durante todo el ciclo da cero.
2.En la integración numérica, este (1) no es necesariamente el caso, ya que puede aproximar el área total bajo la curva.

En cualquier caso, ya sea suponiendo que 1 es Verdadero o suponiendo que 2 es Verdadero, encuentro que el comportamiento es inconsistente.Ambas integraciones (-pi a pi y 0 a 2*pi) deben devolver 0,0 (el primer valor de la tupla es el resultado y el segundo es el error) o devolver 2,257...

¿Alguien puede explicar por qué sucede esto?¿Es esto realmente una inconsistencia?¿Alguien puede decirme también si me falta algo realmente básico sobre los métodos numéricos?

En cualquier caso, en mi aplicación final, planeo utilizar el método anterior para encontrar la longitud del arco de una función.Si alguien tiene experiencia en esta área, avíseme sobre la mejor política para hacer esto en Python.

Editar
Nota
Ya tengo los primeros valores diferenciales en todos los puntos del rango almacenados en una matriz.
El error actual es tolerable.
Nota final

He leído Wikipedia sobre esto.Como ha señalado Dimitry, integraré sqrt(1+diff(f(x), x)^2) para obtener la longitud del arco.Lo que quería preguntar era: ¿existe una mejor aproximación/mejor práctica (?)/forma más rápida de hacer esto?Si se necesita más contexto, lo publicaré por separado/publicaré el contexto aquí, como desee.

¿Fue útil?

Solución

La función quad es una función de una vieja biblioteca Fortran. Funciona al juzgar por la planitud y la pendiente de la función que está integrando la forma de tratar el tamaño de paso se utiliza para la integración numérica con el fin de maximizar la eficiencia. Lo que esto significa es que usted puede obtener respuestas ligeramente diferentes de una región a otra, incluso si son analíticamente la misma.

Sin duda ambas integraciones deben devolver cero. Volviendo algo que es 1 / (10 billones) es bastante cercano a cero! Las ligeras diferencias se deben a la forma en quad está rodando sobre sin y cambiar sus tamaños de paso. Para su tarea planificada, quad será todo lo que necesita.

EDIT: Por lo que está haciendo Creo quad está muy bien. Es rápido y muy precisa. Mi declaración final es usarlo con confianza a menos que encuentre algo que realmente ha pasado bastante mal. Si no devuelve una respuesta sin sentido entonces es probable que trabaja muy bien. Sin preocupaciones.

Otros consejos

Creo que es probablemente precisión de la máquina, ya que ambas respuestas son prácticamente cero.

Si desea una respuesta de la boca del caballo que iba a publicar esta pregunta en el scipy discusión de mesa

I diría que un número O (10 ^ -14) es efectivamente cero. ¿Cuál es su tolerancia?

Puede ser que el quad que subyace algoritmo no es la mejor. Usted puede tratar de otro método para la integración y ver si eso mejora las cosas. Una orden de 5º de Runge-Kutta puede ser una muy buena técnica de propósito general.

Podría ser sólo la naturaleza de los números de punto flotante: "¿Qué cada informático debe saber acerca de Punto flotante aritmética".

Esta salida me parece correcto ya que tienes estimación del error absoluto aquí. El valor integral de sen (x) es, en efecto debe tener un valor de cero para el período completo (cualquier intervalo de longitud 2 * pi), tanto en la integración ordinario y numérico y sus resultados está cerca de ese valor.
Para evaluar la longitud del arco debe calcular integral para sqrt (1 + diff (f (x), x) ^ 2) función, donde diff (f (x), x) es derivada de f (x). Ver también longitud del arco

0.0 == 2.3e-16 (absolute error tolerance 4.4e-14)

Ambas respuestas son iguales y correcto es decir, cero dentro de la tolerancia dada.

La diferencia proviene del hecho de que el pecado (x) = - sen (-x) exactamente incluso en precisión finita. Mientras que la precisión finita sólo da sen (x) ~ sen (x + 2 * pi) aproximadamente. Seguro que sería bueno si quad eran lo suficientemente inteligente como para resolver esto, pero realmente no tiene manera de saber a priori que la integral sobre los dos intervalos se dan son equivalentes o que la primera es un resultado mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top