Ich bin der Autor CQUADin 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 NaNs und Infs im Integranden nicht in Nullen umzuwandeln - der Code wird sich selbst darum kümmern.
Die Routine ist auch in Octave als quadccund 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 CQUADIntegration 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, CQUADwo sich die Singularität befindet, noch um eine spezielle Behandlung innerhalb des Integranden. Ich lasse es einfach NaNs 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/.