Kann mir jemand erklären, warum scipy.integrate.quad für gleich lange Bereiche unterschiedliche Ergebnisse liefert, während sin Integration (X)?

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

Frage

Ich versuche, numerisch eine beliebige (auch bekannt als I-Code) Funktion in meinem Programm zu integrieren Verwendung numerischer Integrationsverfahren. Ich verwende Python 2.5.2 zusammen mit SciPy des numerischen Integrationspaket. Um ein Gefühl dafür zu bekommen, habe ich beschlossen, dieses Verhalten zu integrieren sin (x) und beobachtet, um zu versuchen -

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

Ich finde dieses Verhalten seltsam, weil -
1. In gewöhnlicher Integration über den gesamten Zyklus zu integrieren gibt Null.
2. Bei der numerischen Integration, das (1) ist nicht unbedingt der Fall, weil Sie gerade sein    die gesamte Fläche unter der Kurve annähert.

In jedem Fall entweder 1 unter der Annahme wahr ist oder unter der Annahme, 2 True ist, finde ich das Verhalten unvereinbar zu sein. Entweder beide Integrationen (-pi bis pi und 0 bis 2 * pi) zurückkehren sollten 0,0 (erster Wert in dem Tupel ist das Ergebnis, und der zweite ist der Fehler) oder 2.257 zurück ...

Kann jemand bitte erklären, warum dies geschieht? Ist das wirklich eine Inkonsistenz? Kann mir jemand sagen, auch wenn ich etwas wirklich grundlegende über numerische Methoden bin fehlt?

Auf jedem Fall in meiner Endanwendung, ich plane das obige Verfahren zu verwenden, um die Bogenlänge einer Funktion zu finden. Wenn jemand Erfahrung in diesem Bereich hat, rät mich, dies zu tun auf die besten Politik bitte in Python.

Bearbeiten
Hinweis:
Ich habe bereits die ersten Differenzwerte an allen Punkten im Bereich in einem Array gespeichert.
Aktuelle Fehler tolerierbar ist.
Endnote

Ich habe Wikipaedia auf diesen Zeilen lesen. Wie Dimitry darauf hingewiesen hat, werde ich sqrt werde die Integration von (1 + diff (f (x), x) ^ 2), um die Bogenlänge zu erhalten. Was ich wollte, war fragen - ist es eine bessere Annäherung / Best Practice / schneller Weg, dies zu tun (?). Wenn mehr Kontext benötigt wird, werde ich es posten separat / Post Kontext hier, wie Sie wollen.

War es hilfreich?

Lösung

Die quad Funktion ist eine Funktion aus einer alten Fortran Bibliothek. Es funktioniert durch die Planheit und Steilheit der Funktion der Beurteilung ist die Integration, wie die Schrittgröße behandeln es für die numerische Integration, um die Effizienz zu maximieren verwendet. Was dies bedeutet, ist, dass man leicht unterschiedliche Antworten von einem Bereich zum nächsten bekommen kann, auch wenn sie analytisch die gleiche ist.

Ohne Zweifel beide Integrationen sollten Null zurück. Wiederkehrende etwas, das 1 / (10 Billionen) ist ziemlich nahe an Null! Die geringfügigen Unterschiede sind aufgrund der Art und Weise quad über sin rollt und ändert seine Schrittgrößen. Für Ihre geplante Aufgabe, quad wird alles, was Sie sein müssen.

EDIT: Für das, was Sie tun, ich denke, quad in Ordnung ist. Es ist schnell und ziemlich genau. Meine letzte Aussage ist es mit dem Vertrauen, wenn Sie etwas finden, das wirklich ziemlich schief gegangen ist. Wenn es nicht eine unsinnige Antwort zurückgibt, dann ist es wahrscheinlich funktioniert ganz gut. Keine Sorge.

Andere Tipps

Ich denke, es ist wahrscheinlich Maschine Präzision, da beide Antworten effektiv Null sind.

Wenn Sie eine Antwort aus dem Mund des Pferdes möchte ich diese Frage auf der scipy Diskussion Brett

Ich würde sagen, dass eine Reihe O (10 ^ -14) ist effektiv Null. Was ist Ihre Toleranz?

Es könnte sein, dass der Algorithmus zugrunde liegende Quad nicht die beste ist. Sie könnten eine andere Methode für die Integration versuchen und sehen, ob die Dinge verbessert. Eine fünfte Ordnung Runge-Kutta eine sehr schöne Allzweck-Technik sein kann.

Es könnte nur die Art von Gleitkommazahlen sein: "Was jeder Informatiker wissen sollten über Floating Point Arithmetic“.

Diese Ausgabe scheint mir richtig, da man hier absolute Fehlerschätzung haben. Der Integralwert von sin (x) ist in der Tat soll für die volle Periode Wert von Null hat (jedes Intervall von 2 * pi Länge) sowohl in normalen und numerischen Integration und Ihre Ergebnissen in der Nähe dieses Wert.
Um zu bewerten, Lichtbogenlänge sollte für sqrt Integral berechnen (1 + diff (f (x), x) ^ 2) Funktion, wobei diff (f (x), x) Ableitung von f (x). Siehe auch Bogenlänge

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

Beide Antworten sind die gleichen und richtig das heißt Null innerhalb der vorgegebenen Toleranz.

Der Unterschied resultiert aus der Tatsache, dass sin (x) = - sin (x) genau einmal in endlicher Genauigkeit. Während endliche Genauigkeit gibt nur sin (x) ~ sin (x + 2 * pi) ungefähr. Sicher wäre es schön, wenn Quad klug genug ist, um dies herauszufinden, aber es hat wirklich keine Möglichkeit, apriori zu wissen, dass das Integral über die beiden Intervalle geben Sie entsprechen oder dass das das erste ist ein besseres Ergebnis.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top