Ich bin der Autor CQUAD
in der GSL. Die Benutzeroberfläche ist fast identisch mit der von QAGS
. Wenn Sie also die letztere verwendet haben, sollte es nicht schwierig sein, die erstere zu testen. Denken Sie daran, Ihr NaN
s und Inf
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:
#include <stdio.h>
#include <gsl/gsl_integration.h>
/* Our test integrand. */
double thefunction ( double x , void *param ) {
return sin(x) / x;
}
/* Driver function. */
int main ( int argc , char *argv[] ) {
gsl_function f;
gsl_integration_cquad_workspace *ws = NULL;
double res, abserr;
size_t neval;
/* Prepare the function. */
f.function = &thefunction;
f.params = NULL;
/* Initialize the workspace. */
if ( ( ws = gsl_integration_cquad_workspace_alloc( 200 ) ) == NULL ) {
printf( "main: call to gsl_integration_cquad_workspace_alloc failed.\n" );
abort();
}
/* Call the integrator. */
if ( gsl_integration_cquad( &f, 0.0 , 1.0 , 1.0e-10 , 1.0e-10 , ws , &res , &abserr , &neval ) != 0 ) {
printf( "main: call to gsl_integration_cquad failed.\n" );
abort();
}
/* Print the result. */
printf( "main: int of sin(x)/x in [0,1] is %.16e +/- %e (%i evals).\n" ,
res , abserr , neval );
/* Free the workspace. */
gsl_integration_cquad_workspace_free( ws );
/* Bye. */
return 0;
}
mit denen ich kompiliert habe gcc -g -Wall cquad_test.c -lgsl -lcblas
. Die Ausgabe ist
main: int of sin(x)/x in [0,1] is 9.4608307036718275e-01 +/- 4.263988e-13 (63 evals).
0.94608307036718301494
Beachten 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 einfach NaN
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/
.