Sono l'autore della CQUAD
GSL. L'interfaccia è quasi identica a quella di QAGS
, quindi se hai usato il secondo, non dovrebbe essere affatto difficile provare il primo. Ricorda solo di non convertire i tuoi NaN
s e Inf
s in zeri nell'integrando: il codice gestirà questi stessi.
La routine è disponibile anche in Octave as quadcc
e in Matlab qui .
Potresti fornire un esempio degli integrandi con cui hai a che fare?
Aggiornare
Ecco un esempio dell'uso CQUAD
di integrare una funzione con una singolarità in uno degli endpoint:
#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;
}
con cui ho compilato gcc -g -Wall cquad_test.c -lgsl -lcblas
. L'output è
main: int of sin(x)/x in [0,1] is 9.4608307036718275e-01 +/- 4.263988e-13 (63 evals).
0.94608307036718301494
Si noti che qui non c'è nulla di speciale, né per dire CQUAD
dove sia la singolarità, né alcun trattamento speciale all'interno dell'integrando stesso. Ho appena lasciato che restituisca NaN
s, e l'integratore si prende cura di loro automaticamente.
Si noti inoltre che esiste un bug nell'ultima versione 1.15 di GSL che può influire sul trattamento delle singolarità. È stato risolto, ma non è arrivato alla distribuzione ufficiale. Ho usato la fonte più recente, scaricata con bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
.