Kann mir jemand erklären, warum scipy.integrieren.quad gibt unterschiedliche Ergebnisse für gleich lange Bereiche, während die Integration von sin(X)?
Ich versuche, numerisch integrieren, eine willkürliche (bekannt als ich-code) Funktion in meinem Programm
mit Hilfe numerischer Integrationsverfahren. Ich bin mit Python 2.5.2 zusammen mit SciPy ist die numerische integration package. Um ein Gefühl dafür zu bekommen, habe ich beschlossen, zu versuchen, die Integration von sin(x) und beobachtet dieses Verhalten-
>>> 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)
Dieses Verhalten finde ich seltsam, weil -
1. In der normalen integration, die Integration über den vollen Takt ergibt null.
2. In der numerischen integration, das (1) ist das nicht unbedingt der Fall, denn Sie kann nur sein,
Annäherung der Fläche unter der Kurve.
In jedem Fall, entweder Annahme 1 gilt oder Annahme: 2 ist Wahr, ich finde das Verhalten inkonsistent sein. Entweder beide Integrationen (-pi bis pi und 0 bis 2*pi) sollte die Rückkehr 0.0 (der erste Wert im Tupel ist das Ergebnis und das zweite ist der Fehler) oder die return-2.257...
Kann mir bitte jemand erklären, warum dies passiert ist? Ist das wirklich ein Widerspruch? Kann mir auch jemand sagen, wenn ich bin fehlt etwas wirklich grundlegendes zu numerischen Methoden?
In jedem Fall, meine Letzte Anwendung, die ich Plane, verwenden die obige Methode, um die Bogenlänge einer Funktion. Wenn jemand schon Erfahrung in diesem Bereich, bitte informieren Sie mich über die beste Politik für die dies in Python.
Bearbeiten
Hinweis
Ich habe bereits die erste differenzielle Werte aller Punkte in der Palette gespeichert in einem array.
Aktuelle Fehler ist tolerierbar.
Ende Hinweis
Habe ich gelesen, die Wikipaedia. Als Dimitry hingewiesen hat, werde ich die Integration von sqrt(1+diff(f(x), x)^2) um die Bogenlänge. Was ich Fragen wollte war - gibt es eine bessere Annäherung/Best practice(?) /schneller Weg, dies zu tun. Wenn mehr Kontext benötigt wird, poste ich es separat/post-Kontext hier, wie Sie es wünschen.
Danke. Ich schau die links.
InformationsquelleAutor batbrat | 2009-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
quad
Funktion ist eine Funktion, die aus einem alten Fortran-Bibliothek. Es funktioniert durch die Beurteilung durch die Flachheit und die Steigung der Funktion es ist, die Integration zu behandeln, wie Sie die Schrittweite für die numerische integration zur Maximierung der Effizienz. Was dies bedeutet ist, dass Sie leicht verschiedene Antworten von einer region zur nächsten, selbst wenn Sie analytisch die gleiche.Ohne Zweifel beide Integrationen sollte null zurückgeben. Gerne etwas zurückgegeben wird, ist 1/(10 Billionen Euro), ist ziemlich nahe bei null! Die leichten Unterschiede werden durch die Art und Weise
quad
Rollen übersin
änderung seiner Schritt Größen. Für Ihre geplante Aufgabequad
wird alles, was Sie brauchen.BEARBEITEN:
Für das, was Sie tun, ich denke
quad
ist in Ordnung. Es ist schnell und ziemlich genau. Meine Letzte Aussage ist verwenden Sie es mit Vertrauen, es sei denn, Sie finden etwas, das wirklich gegangen ist ganz schief. Wenn es nicht wieder eine unsinnige Antwort, dann ist es wahrscheinlich gut arbeiten. Keine Sorge.InformationsquelleAutor physicsmichael
Ich denke, es ist wahrscheinlich Maschinengenauigkeit, da beide Antworten sind effektiv null.
Wenn Sie möchten, eine Antwort aus berufenem Munde wäre ich Stelle diese Frage im scipy Diskussionsrunde
InformationsquelleAutor Simon
Ich würde sagen, dass eine Anzahl O(10^-14) ist effektiv null. Was ist deine Toleranz?
Könnte es sein, dass der Algorithmus zugrunde liegende quad ist nicht die beste. Sie könnten versuchen, eine andere Methode für die integration und sehen, ob das verbessert die Dinge. Eine 5. Ordnung Runge-Kutta-kann ein sehr schönes Allzweck-Technik.
Könnte es einfach in der Natur der Fließkommazahlen: "Das, Was Jeder Computer Scientist Should Know About Floating-Point Arithmetik".
InformationsquelleAutor duffymo
Diese Ausgabe scheint korrekt zu mir, da haben Sie absolute Fehler Schätzung hier. Der ganzzahlige Wert von sin(x) ist in der Tat sollte der Wert null für den gesamten Zeitraum (ein Intervall von 2*pi, length) in ordentlichen und numerischen integration und Ihre Ergebnisse nahe der Wert.
Bewerten Bogenlänge sollten Sie berechnen die Integrale für sqrt(1+diff(f(x), x)^2) - Funktion, wo diff(f(x), x) Ableitung von f(x). Siehe auch Arc Länge
Nochmals vielen Dank! Ich habe nicht bemerkt, dass die Antwort war unterhalb der Fehlergrenze.
InformationsquelleAutor okutane
Beide Antworten sind die gleichen und richtige D. H., null ist, innerhalb der vorgegebenen Toleranz.
InformationsquelleAutor jfs
Der Unterschied kommt von der Tatsache, dass sin(x)=-sin(-x) genau auch in endlicher Genauigkeit. In der Erwägung, dass endliche Genauigkeit gibt nur sin(x)~sin(x+2*pi) etwa. Sicher, es wäre schön, wenn quad klug genug waren, um dies herauszufinden, aber es hat wirklich keine Möglichkeit zu wissen, apriori, dass das integral über den beiden Intervallen, die Sie geben, gleich sind, oder dass das erste ist ein besseres Ergebnis.
InformationsquelleAutor Kevin Mitchell