Sayısal Entegrasyon - NaN'leri işleme (C / Fortran)


12

Ben sıfıra yakın belirli değerlerde NaNs gösteren zor bir integral ile ilgileniyorum ve şu anda onlarla oldukça kabaca bu olduğunda integrand sıfıra ayarlar bir ISNAN deyimi kullanarak ilgileniyorum. Bu FORTRAN (q1da rutin - q1dax farklı değil) NMS kitaplığı ve C (QAGS rutin kullanarak) C GSL kitaplığı ile denedim.

Özellikle integral NaN ve INF işlemek için tasarlanmış CQUAD (C GSL kütüphanesinin bir parçası) içine baktım, ama referans ve çevrimiçi bulabildiğim hiçbir örnek programları çok az yararlı bilgi var. Herkes C veya FORTRAN için bu işi yapabilir başka sayısal entegrasyon rutin biliyor mu?



^ Bu yayını sildim.
Josh

Yanıtlar:


10

CQUADGSL'de yazarım . Arayüz neredeyse aynıdır QAGS, bu yüzden ikincisini kullandıysanız, ilkini denemek zor olmamalıdır. NaNS ve Infs'lerinizi integralde sıfırlara dönüştürmemeyi unutmayın - kod bunlarla ilgilenecektir.

Rutin olarak da Octave mevcuttur quadccve Matlab burada .

Karşılaştığınız integrallere bir örnek verebilir misiniz?

Güncelleme

Aşağıda, CQUADbir işlevi uç noktalardan birinde tekillikle birleştirmek için kullanılan bir örnek verilmiştir :

#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;

    }

hangi ile derledim gcc -g -Wall cquad_test.c -lgsl -lcblas. Çıktı

main: int of sin(x)/x in [0,1] is 9.4608307036718275e-01 +/- 4.263988e-13 (63 evals).

20 basamağa hesaplanan sonuç verildiğinde, , 14 basamağa doğrudur.,94608307036718301494

Burada CQUADtekilliğin nerede olduğunu ya da integralin içindeki herhangi bir özel muameleyi anlatmak için özel bir şey olmadığını unutmayın . Sadece geri dönmesine izin verdim NaNve entegratör bunlarla otomatik olarak ilgilenir.

Ayrıca, en son GSL sürüm 1.15'te tekilliklerin tedavisini etkileyebilecek bir hata olduğuna dikkat edin. Düzeltildi, ancak resmi dağıtım için yapılmadı. İle indirilen en son kaynağı kullandım bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/.


Harika, cevap için teşekkürler. Entegratörü Green İşlevlerini bulmak için kullanıyorum ve integralim üstel ve bazı sinüs / kosinüsleri içeriyor. Daha sonra bunları farklı bir değişkenle tekrar entegre edeceğim ve NaN'lerin ortaya çıktığı yer burası. CQUAD kullanan herhangi bir örnek program biliyor musunuz? Çalışma alanı işlevlerini nasıl ve nereye koyacağım konusunda kafam karıştı. Bu tür bir şeye yeni başlayan olduğumu belirtmeliyim!
Josh

@Josh: İyi bir nokta, sanırım ilk kullanan biri olmalı, bu yüzden nasıl çağrılabileceğine dair minimal bir örnek ekledim.
Pedro

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.