我是CQUAD
《 GSL》的作者。该界面几乎与的界面相同QAGS
,因此,如果您使用了后者,那么尝试前者应该一点也不困难。请记住不要在被积数中将NaN
s和Inf
s转换为零-代码本身会处理这些。
该程序也倍频为可用quadcc
,并在Matlab 这里。
您能否提供一个您正在处理的被积分数的示例?
更新资料
这是一个使用CQUAD
一个端点上的奇点集成函数的示例:
#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/
。