私はCQUAD
GSLの著者です。インターフェイスはのインターフェイスとほとんど同じですQAGS
。したがって、後者を使用した場合、前者を試してみるのは難しくありません。被積分関数でNaN
sとInf
sをゼロに変換しないことを忘れないでください-コードはこれらを処理します。
このルーチンは、Octaveとしてquadcc
、およびMatlab からも入手できます。
扱っている被積分関数の例を提供していただけますか?
更新
CQUAD
エンドポイントの1つで関数を特異点と統合するために使用する例を次に示します。
#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;
}
でコンパイルしましたgcc -g -Wall cquad_test.c -lgsl -lcblas
。出力は
main: int of sin(x)/x in [0,1] is 9.4608307036718275e-01 +/- 4.263988e-13 (63 evals).
0.94608307036718301494
ここには特別なものは何もないことに注意してくださいCQUAD
。特異点がどこにあるのか、また被積分関数自体の中での特別な扱いもありません。NaN
sを返すだけで、インテグレーターが自動的にそれらを処理します。
また、最新のGSLバージョン1.15には、特異点の処理に影響を与えるバグがあることに注意してください。修正されましたが、公式配布には至っていません。でダウンロードした最新のソースを使用しましたbzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
。