Quelqu'un peut-il expliquer pourquoi scipy.integrate.quad donne des résultats différents pour des plages tout aussi longues tout en intégrant le péché (X)?

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

Question

Je suis en train d'intégrer numériquement une fonction arbitraire (connue quand je code) dans mon programme en utilisant des méthodes d'intégration numérique. J'utilise Python avec package 2.5.2 d'intégration numérique de SciPy. Afin d'obtenir une sensation pour elle, j'ai décidé d'essayer d'intégrer sin (x) et observé ce comportement -

>>> 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)

Je trouve ce comportement étrange parce que -
1. Dans l'intégration ordinaire, l'intégration sur l'ensemble du cycle donne zéro.
2. Dans l'intégration numérique, ce (1) n'est pas nécessairement le cas, parce que vous pouvez juste être    l'approximation de la superficie totale sous la courbe.

Dans tous les cas, en supposant soit 1 est vrai ou en supposant 2 est vrai, je trouve que le comportement est incohérent. Soit les deux intégrations (-pi de pi et de 0 à 2 * pi) doit retourner 0,0 (première valeur du tuple est le résultat et le second est l'erreur) ou le retour 2,257 ...

Quelqu'un peut-il s'il vous plaît expliquer pourquoi cela se produit? Est-ce vraiment une incohérence? Quelqu'un peut-il me dire aussi si je manque quelque chose de vraiment de base sur les méthodes numériques?

Dans tous les cas, dans ma demande finale, je prévois d'utiliser la méthode ci-dessus pour trouver la longueur d'arc d'une fonction. Si quelqu'un a de l'expérience dans ce domaine, s'il vous plaît me conseiller sur la meilleure politique pour le faire en Python.

Modifier Remarque J'ai déjà les premières valeurs différentielles à tous les points de la gamme stockée dans un tableau.
erreur actuelle est tolérable.
Note de fin

J'ai lu Wikipaedia à ce sujet. Comme Dimitry a souligné, je pour l'intégrer sqrt (1 + diff (f (x), x) ^ 2) pour obtenir la longueur d'arc. Ce que je voulais poser était - est-il une meilleure approximation / meilleures pratiques / moyen plus rapide de le faire (?). Si plus de contexte est nécessaire, je posterai séparément / contexte post ici, comme vous le souhaitez.

Était-ce utile?

La solution

La fonction quad est une fonction d'une ancienne bibliothèque Fortran. Il fonctionne en juger par la platitude et la pente de la fonction, il intègre la façon de traiter la taille de l'étape, il utilise pour l'intégration numérique afin de maximiser l'efficacité. Ce que cela signifie est que vous pouvez obtenir des réponses légèrement différentes d'une région à l'autre, même si elles sont analytiquement les mêmes.

Sans doute les deux intégrations devraient revenir à zéro. De retour quelque chose qui est 1 / (10000000000000) est assez proche de zéro! Les légères différences sont dues à la façon quad roule sur sin et en changeant ses tailles de pas. Pour votre tâche planifiée, quad sera tout ce que vous avez besoin.

EDIT: Pour ce que vous faites, je pense quad est très bien. Il est rapide et assez précis. Ma déclaration finale est d'utiliser avec confiance à moins que vous trouvez quelque chose qui est vraiment allé très mal tourné. Si elle ne renvoie pas une réponse absurde alors il est probablement fonctionne très bien. Pas de soucis.

Autres conseils

Je pense qu'il est probablement la précision de la machine puisque les deux réponses sont effectivement zéro.

Si vous voulez une réponse de la bouche du cheval que je posterais cette question sur le scipy discussion de société

Je dis qu'un nombre O (10 ^ -14) est effectivement nulle. Quelle est votre tolérance?

Il est peut-être que l'algorithme quad sous-jacente est pas le meilleur. Vous pouvez essayer une autre méthode d'intégration et de voir si cela améliore les choses. Un ordre 5 Runge-Kutta peut être une technique d'usage général très agréable.

Il pourrait être juste la nature des nombres à virgule flottante: "Qu'est-ce que chaque informaticien devrait savoir sur Floating arithmétique point ».

Cette sortie me semble correcte puisque vous avez estimation d'erreur absolue ici. La valeur intégrale du péché (x) est en effet devrait avoir une valeur de zéro pour la période complète (tout intervalle de 2 * longueur pi) à la fois ordinaire et l'intégration numérique et vos résultats est proche de cette valeur.
Pour évaluer la longueur d'arc vous devez calculer intégrante de sqrt (1 + diff (f (x), x) ^ 2) fonction, où diff (f (x), x) est dérivée de f (x). Voir aussi Arc

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

Les deux réponses sont les mêmes et correct à savoir zéro dans la tolérance donnée.

La différence provient du fait que sin (x) = - sin (-x) exactement même en précision finie. Alors que la précision finie donne seulement sin (x) ~ sin (x + 2 * pi) environ. Bien sûr, il serait bien si quad était assez intelligent pour comprendre cela, mais il a vraiment aucun moyen de savoir apriori que l'intégrale au cours des deux intervalles que vous donnez sont équivalentes ou que le premier est un meilleur résultat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top