Quelqu'un peut m'expliquer pourquoi scipy.s'intégrer.quad donne des résultats différents pour aussi long des plages, tout en intégrant sin(X)?
Je suis en train d'intégrer numériquement un arbitraire (connu quand j'code) fonction dans mon programme
à l'aide de méthodes d'intégration numérique. Je suis à l'aide de Python 2.5.2 avec SciPy numérique d'un package d'intégration. Afin d'obtenir une sensation pour elle, j'ai décidé d'essayer d'intégrer sin(x) et a 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 bizarre, parce qu' -
1. Dans l'ordinaire de l'intégration, de l'intégration sur le cycle complet donne zéro.
2. Dans l'intégration numérique, ce (1) n'est pas nécessairement le cas, car vous êtes peut-être
le rapprochement de la surface totale sous la courbe.
En tout cas, en supposant que 1 est Vrai ou dans l'hypothèse 2 est Vrai, je trouve le comportement incohérent. Soit les deux intégrations (-pi à pi et de 0 à 2*pi) doit retourner 0.0 (première valeur du tuple est le résultat et la deuxième est l'erreur) ou retour 2.257...
Quelqu'un peut-il expliquer pourquoi ce qui se passe? Est-ce vraiment une incohérence? Quelqu'un peut-il me dire aussi si je suis absent quelque chose de vraiment de base sur les méthodes numériques?
En tout cas, dans mon application, j'ai l'intention d'utiliser la méthode ci-dessus pour trouver la longueur de l'arc d'une fonction. Si quelqu'un a de l'expérience dans ce domaine, merci de me conseiller sur la meilleure politique pour le faire en Python.
Modifier
Note
J'ai déjà la première différentiel de valeurs à tous les points de la gamme stockées dans un tableau.
Erreur actuelle est tolérable.
La note de fin de
J'ai lu Wikipaedia sur cette. Comme Dimitry, a souligné, je vais intégrer sqrt(1+diff(f(x), x)^2) pour obtenir la Longueur de l'Arc. Ce que je voulais vous demander est - il une meilleure approximation sur les pratiques Exemplaires(?) /moyen plus rapide pour ce faire. Si plus de contexte est nécessaire, je vais le poster séparément/post contexte ici, comme vous le souhaitez.
Merci. Je vais regarder les liens.
OriginalL'auteur batbrat | 2009-02-24
Vous devez vous connecter pour publier un commentaire.
La
quad
fonction est une fonction à partir d'une vieille bibliothèque Fortran. Il fonctionne en juger par la planéité et de la pente de la fonction c'est l'intégration de la façon de traiter l'étape de la taille, il l'utilise pour l'intégration numérique dans le but 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 la même.Sans doute les deux intégrations devrait revenir à zéro. Le retour de quelque chose qui est de 1/(10 milliards de dollars) est assez proche de zéro! Les légères différences sont dues à la façon
quad
est de rouler dessussin
et de changer la taille de pas. Pour votre tâche planifiée,quad
sera tout ce dont vous avez besoin.EDIT:
Pour ce que vous faites je pense que
quad
est très bien. Il est rapide et assez précis. Mon état final est de l'utiliser avec confiance, à moins de trouver quelque chose qui a vraiment disparu tout à fait de travers. Si elle ne renvoie pas à une réponse absurde, alors il est probablement de travail tout aussi bien. Pas de soucis.OriginalL'auteur physicsmichael
Je pense que c'est sans doute la machine de précision puisque les deux réponses sont effectivement zéro.
Si vous voulez une réponse de la bouche des chevaux, je voudrais poster cette question sur le scipy forum de discussion
OriginalL'auteur Simon
Je dirais qu'un certain nombre O(10^-14) est effectivement zéro. Quelle est votre tolérance?
Il se peut que l'algorithme sous-jacent quad n'est pas le meilleur. Vous pourriez essayer une autre méthode pour l'intégration et voir si cela améliore les choses. Un 5ème ordre de Runge-Kutta peut être un très bel objet général technique de.
Il pourrait être juste la nature des nombres en virgule flottante: "Ce Que Chaque Informaticien Devriez Savoir Sur L'Arithmétique À Virgule Flottante".
OriginalL'auteur duffymo
Ce résultat semble correct pour moi, depuis que vous avez absolue de l'erreur d'estimation ici. La valeur intégrale de sin(x) est, en effet, doit avoir une valeur de zéro pour l'ensemble de la période (n'importe quel intervalle de 2*pi de longueur), à la fois ordinaire et de l'intégration numérique et de vos résultats est proche de cette valeur.
Pour évaluer la longueur de l'arc, vous devez calculer l'intégrale de sqrt(1+diff(f(x), x)^2) fonction, où diff(f(x), x) est la dérivée de f(x). Voir aussi Longueur de l'Arc
Merci encore! Je n'ai pas d'avis que la réponse était en dessous de la limite d'erreur.
OriginalL'auteur okutane
Les deux réponses sont les mêmes et corriger c'est à dire, zéro dans le la tolérance.
OriginalL'auteur jfs
La différence vient du fait que sin(x)=-sin(-x) exactement de même en précision finie. Considérant que la précision finie ne donne sin(x)~sin(x+2*pi) environ. Sûr que ce serait bien si quad été assez intelligent pour comprendre cela, mais il a vraiment aucun moyen de savoir apriorique que l'intégrale sur les deux intervalles de vous, ou l'équivalent, ou que le premier est un meilleur résultat.
OriginalL'auteur Kevin Mitchell