Ich habe es mit einem trickreichen Integral zu tun, das NaNs bei bestimmten Werten nahe Null aufweist, und ich habe es im Moment ziemlich grob mit einer ISNAN-Anweisung zu tun, die den Integranden auf Null setzt, wenn dies auftritt. Ich habe dies mit der NMS-Bibliothek in FORTRAN (die Q1DA-Routine - Q1dax ist nicht anders) und mit der GSL-Bibliothek in C (mit der QAGS-Routine) versucht.
Ich habe mich mit CQUAD (Teil der GSL-Bibliothek für C) befasst, das speziell für den Umgang mit NaNs und INF im Integranden entwickelt wurde, aber in der Referenz gibt es nur sehr wenige nützliche Informationen und keine Online-Beispielprogramme, die ich finden konnte. Kennt jemand eine andere numerische Integrationsroutine für C oder FORTRAN, die diese Aufgabe übernehmen könnte?
quelle
Antworten:
Ich bin der Autor
CQUAD
in der GSL. Die Benutzeroberfläche ist fast identisch mit der vonQAGS
. Wenn Sie also die letztere verwendet haben, sollte es nicht schwierig sein, die erstere zu testen. Denken Sie daran, IhrNaN
s undInf
s im Integranden nicht in Nullen umzuwandeln - der Code wird sich selbst darum kümmern.Die Routine ist auch in Octave als
quadcc
und in Matlab hier .Können Sie ein Beispiel für die Integranden nennen, mit denen Sie sich befassen?
Aktualisieren
Im Folgenden finden Sie ein Beispiel für die
CQUAD
Integration einer Funktion mit einer Singularität an einem der Endpunkte:mit denen ich kompiliert habe
gcc -g -Wall cquad_test.c -lgsl -lcblas
. Die Ausgabe istBeachten Sie, dass es hier nichts Besonderes gibt, weder um zu sagen,
CQUAD
wo sich die Singularität befindet, noch um eine spezielle Behandlung innerhalb des Integranden. Ich lasse es einfachNaN
s zurückgeben und der Integrator kümmert sich automatisch um sie.Beachten Sie auch, dass die neueste GSL-Version 1.15 einen Fehler enthält, der sich auf die Behandlung von Singularitäten auswirken kann. Es wurde behoben, hat es aber nicht in die offizielle Distribution geschafft. Ich habe die neueste Quelle verwendet, die mit heruntergeladen wurde
bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
.quelle
Sie können auch die doppelt exponentiellen Quadraturformeln überprüfen. Sie führen eine (implizite) Änderung von Variablen durch, um sicherzustellen, dass sie Rand-Singularitäten "beseitigen". Eine sehr schöne Implementierung (Fortran77 und C) finden Sie auf der Website von Ooura .
quelle