Soy el autor de CQUAD
la GSL. La interfaz es casi idéntica a la de QAGS
, por lo que si ha utilizado la última, no debería ser difícil probar la primera. Sólo recuerda no convertir sus NaN
s y Inf
s a ceros en el integrando - el código se ocupará de éstos en sí.
La rutina también está disponible en Octave as quadcc
, y en Matlab aquí .
¿Podría dar un ejemplo de los integrandos con los que está tratando?
Actualizar
Aquí hay un ejemplo de uso CQUAD
para integrar una función con una singularidad en uno de los puntos finales:
#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;
}
lo que he realizado con gcc -g -Wall cquad_test.c -lgsl -lcblas
. La salida es
main: int of sin(x)/x in [0,1] is 9.4608307036718275e-01 +/- 4.263988e-13 (63 evals).
0.94608307036718301494
Tenga en cuenta que no hay nada especial aquí, ni para decir CQUAD
dónde está la singularidad, ni ningún tratamiento especial dentro del propio integrando. Solo dejo que devuelva NaN
s, y el integrador se encarga de ellos automáticamente.
Tenga en cuenta también que hay un error en la última versión 1.15 de GSL que puede afectar el tratamiento de las singularidades. Se ha solucionado, pero no ha llegado a la distribución oficial. Utilicé la fuente más reciente, descargada con bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
.