Eu sou o autor da CQUAD
GSL. A interface é quase idêntica à de QAGS
, portanto, se você usou o último, não deve ser difícil tentar o primeiro. Lembre-se de não converter se NaN
e Inf
z em zeros no integrando - o código lidará com eles.
A rotina também está disponível no Octave as quadcc
e no Matlab aqui .
Você poderia fornecer um exemplo dos integrandos com os quais está lidando?
Atualizar
Aqui está um exemplo de uso CQUAD
para integrar uma função com uma singularidade em um dos pontos de extremidade:
#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;
}
com o qual eu compilei gcc -g -Wall cquad_test.c -lgsl -lcblas
. A saída é
main: int of sin(x)/x in [0,1] is 9.4608307036718275e-01 +/- 4.263988e-13 (63 evals).
0.94608307036718301494
Observe que não há nada de especial aqui, nem para dizer CQUAD
onde está a singularidade ou qualquer tratamento especial dentro do próprio integrando. Apenas deixo que retorne NaN
s, e o integrador cuida deles automaticamente.
Observe também que há um erro na versão 1.15 da GSL mais recente que pode afetar o tratamento de singularidades. Foi corrigido, mas não chegou à distribuição oficial. Eu usei a fonte mais recente, baixada com bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
.