数值积分-处理NaN(C / Fortran)


12

我正在处理一个棘手的积分,该积分会在接近零的某些值处显示NaN,而现在我正在使用ISNAN语句对它们进行粗略的处理,该语句将发生这种情况时将被积数设置为零。我已经在FORTRAN中的NMS库(q1da例程-q1dax没什么不同)和C语言中的GSL库(使用QAGS例程)中进行了尝试。

我研究了CQUAD(C的GSL库的一部分),该CQUAD是专门为处理被集成物中的NaN和INF而设计的,但是参考文献中的有用信息很少,而且没有网上示例程序。有谁知道其他适用于C或FORTRAN的数字积分例程可以完成这项工作?



^我删除了该帖子。
2012年

Answers:


10

我是CQUAD《 GSL》的作者。该界面几乎与的界面相同QAGS,因此,如果您使用了后者,那么尝试前者应该一点也不困难。请记住不要在被积数中将NaNs和Infs转换为零-代码本身会处理这些。

该程序也倍频为可用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奇异点在哪里,也没有说明被积体内部的任何特殊处理。我只是让它返回NaNs,积分器会自动处理它们。

另请注意,最新的GSL版本1.15中存在一个错误,该错误可能会影响对奇点的处理。它已得到修复,但尚未发布到官方发行版。我使用了最新的资源,通过下载bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/


太好了,谢谢您的答复。我正在使用积分器来查找格林函数,而我的被积函数涉及指数和一些正弦/余弦。然后,我再次将这些变量与另一个变量集成在一起,这就是弹出NaN的地方。您知道使用CQUAD的任何示例程序吗?我对如何以及在何处放置工作区功能感到困惑。我应该提到,我几乎是这种事情的初学者!
2012年

@Josh:好点,我想必须是第一个使用它的人,因此我添加了一个最小的示例来说明如何使用它。
2012年

3

您还可以查看双指数正交公式。它们对变量进行了(隐式)更改,以确保它们“缓解”了边界的奇异性。可以在Ooura的网站上找到一个非常好的(Fortran77和C)实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.