Числова інтеграція - обробка NaNs (C / Fortran)


12

Я маю справу з складним інтегралом, який демонструє NaN в певних значеннях, близьких до нуля, і на даний момент я маю справу з ними досить грубо, використовуючи оператор ISNAN, який встановлює інтеграл до нуля, коли це відбувається. Я спробував це з бібліотекою NMS у FORTRAN (порядок q1da - q1dax не відрізняється) та з бібліотекою GSL в C (використовуючи процедуру QAGS).

Я заглянув у CQUAD (частина бібліотеки GSL для C), яка спеціально розроблена для обробки NaNs та INF в інтегралі, але в посиланні є дуже мало корисної інформації, і немає прикладних програм в Інтернеті, які я не міг би знайти. Хтось знає будь-яку іншу процедуру чисельної інтеграції для C або FORTRAN, яка могла б зробити цю роботу?


Перехресний пост на math.stackexchange.com/questions/242771/…

^ Я видалив цю публікацію.
Джош

Відповіді:


10

Я автор CQUADу GSL. Інтерфейс майже ідентичний інтерфейсу QAGS, тому якщо ви використовували останнє, спробувати перший не повинно бути складно. Просто пам’ятайте, що не перетворювати ваші NaNs та Infs на нулі в інтеграді - код сам вирішить їх.

Програма також доступна в Octave as 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).

Який, враховуючи результат, обчислений у Maple до 20 цифр, , є правильним 14 .0,94608307036718301494

Зауважте, що тут немає нічого особливого, ні щоб сказати, CQUADде знаходиться сингулярність, чи якесь особливе трактування в межах самого інтегранда. Я просто дозволю йому повернути NaNs, і інтегратор піклується про них автоматично.

Зауважте також, що в останній версії GSL 1.15 є помилка, яка може вплинути на обробку особливостей. Він був зафіксований, але не потрапив до офіційного розповсюдження. Я використав останнє джерело, завантажене в bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/.


Чудово, дякую за відповідь. Я використовую інтегратор для пошуку функцій Гріна, і мій інтеград включає експоненти і деякі синуси / косинуси. Потім я знову інтегрую ці wrt в іншу змінну, і саме там я отримую сплески NaN. Чи знаєте ви які-небудь приклади програм, що використовують CQUAD? Мене бентежить питання про те, як і де розміщувати функції робочої області. Я мушу зазначити, що я майже початківець у подібних речах!
Джош

@Josh: Добре, я думаю, хтось повинен першим його використати, тому я додав мінімальний приклад того, як це можна назвати.
Педро

3

Ви також можете перевірити формули подвійної експоненціальної квадратури. Вони вносять (неявну) зміну змінних, переконуючись, що вони "полегшують" граничні особливості. Дуже приємну реалізацію (Fortran77 та C) можна знайти на веб-сайті Ooura .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.