数値統合-NaNの処理(C / Fortran)


12

私は、ゼロに近い特定の値でNaNを示すトリッキーな積分を扱っており、現時点では、これが発生したときに被積分関数をゼロに設定するISNANステートメントを使用して非常に大雑把に扱っています。FORTRANのNMSライブラリ(q1daルーチン-q1daxも同じです)とCのGSLライブラリ(QAGSルーチンを使用)でこれを試しました。

被積分関数でNaNとINFを処理するように特別に設計されたCQUAD(CのGSLライブラリの一部)を調べましたが、リファレンスには有用な情報がほとんどなく、オンラインのサンプルプログラムは見つかりませんでした。誰かが仕事をすることができるCまたはFORTRANのその他の数値積分ルーチンを知っていますか?



^その投稿を削除しました。
ジョシュ

回答:


10

私はCQUADGSLの著者です。インターフェイスはのインターフェイスとほとんど同じですQAGS。したがって、後者を使用した場合、前者を試してみるのは難しくありません。被積分関数でNaNsとInfsをゼロに変換しないことを忘れないでください-コードはこれらを処理します。

このルーチンは、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。特異点がどこにあるのか、また被積分関数自体の中での特別な扱いもありません。NaNsを返すだけで、インテグレーターが自動的にそれらを処理します。

また、最新のGSLバージョン1.15には、特異点の処理に影響を与えるバグがあることに注意してください。修正されましたが、公式配布には至っていません。でダウンロードした最新のソースを使用しましたbzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/


返信ありがとうございます。積分器を使用してグリーン関数を見つけていますが、被積分関数には指数関数といくつかのサイン/コサインが含まれています。次に、これらを別の変数で再度統合します。NaNが表示されます。CQUADを使用したサンプルプログラムを知っていますか?ワークスペース機能をどのように、どこに配置するかについて混乱しています。私はこの種のことの初心者であることに言及する必要があります!
ジョシュ

@ジョシュ:良い点は、誰かがそれを最初に使用する必要があると思うので、それを呼び出す方法の最小限の例を追加しました。
ペドロ

3

二重指数関数の求積式も確認できます。それらは変数の(暗黙の)変更を行い、それらが境界特異点を「容易にする」ことを確認します。非常に素晴らしい(Fortran77およびC)実装がOoura のWebサイトにあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.