수치 적분-NaN 처리 (C / Fortran)


12

나는 0에 가까운 특정 값에서 NaN을 나타내는 까다로운 적분을 처리하고 있으며 현재 ISNAN 문을 사용하여 NaN을 처리하는 까다로운 적분을 다루고 있습니다. FORTRAN의 NMS 라이브러리 (q1da 루틴-q1dax는 다르지 않음)와 C의 GSL 라이브러리 (QAGS 루틴 사용)를 사용하여이를 시도했습니다.

나는 integrand에서 NaN과 INF를 처리하도록 특별히 설계된 CQUAD (C에 대한 GSL 라이브러리의 일부)를 살펴 보았지만 참조에는 유용한 정보가 거의 없으며 온라인에서 찾을 수있는 예제 프로그램은 거의 없습니다. 누구든지 C 또는 FORTRAN에 대한 다른 수치 적분 루틴을 알고 있습니까?



^ 해당 게시물을 삭제했습니다.
Josh

답변:


10

저는 CQUADGSL 의 저자입니다 . 인터페이스는 인터페이스와 거의 동일 QAGS하므로 후자를 사용한 경우 전자를 시도하는 것이 전혀 어렵지 않습니다. integrand에서 NaNs와 Infs를 0 으로 변환하지 마십시오 . 코드는이 자체를 처리합니다.

이 루틴은 Octave 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/.


답장을 보내 주셔서 감사합니다. 통합자를 사용하여 Green의 함수를 찾고 있는데 내 정수에는 지수와 일부 사인 / 코사인이 포함됩니다. 그런 다음 다른 변수를 사용하여 다시 통합하면 NaN이 나타납니다. CQUAD를 사용하는 예제 프로그램을 알고 있습니까? 작업 공간 기능을 어디에 어떻게 넣을 지 혼란 스럽습니다. 나는 이런 종류의 일에 거의 초보자라고 언급해야합니다!
Josh

@ 조쉬 : 좋은 지적, 누군가 그것을 먼저 사용하는 것 같아요, 그래서 나는 그것이 어떻게 호출 될 수 있는지에 대한 최소한의 예를 추가했습니다.
페드로

3

이중 지수 구적법을 확인할 수도 있습니다. 변수의 (암시 적) 변경을 수행하여 경계 특이성을 "쉽게"확인할 수 있습니다. Ooura의 웹 사이트 에서 매우 좋은 (Fortran77 및 C) 구현을 찾을 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.