Saya berurusan dengan integral rumit yang menunjukkan NaN pada nilai-nilai tertentu mendekati nol dan saat ini saya berurusan dengan mereka secara kasar menggunakan pernyataan ISNAN yang menetapkan integrand ke nol ketika ini terjadi. Saya telah mencoba ini dengan perpustakaan NMS di FORTRAN (rutin q1da - q1dax tidak berbeda) dan dengan perpustakaan GSL di C (menggunakan rutin QAGS).
Saya melihat ke CQUAD (bagian dari pustaka GSL untuk C) yang dirancang khusus untuk menangani NaNs dan INF di integrand, tetapi ada sedikit info yang berguna dalam referensi dan tidak ada contoh program online yang bisa saya temukan. Adakah yang tahu rutin integrasi numerik lainnya untuk C atau FORTRAN yang dapat melakukan pekerjaan itu?
quadrature
Josh
sumber
sumber
Jawaban:
Saya penulis
CQUAD
di GSL. Antarmuka hampir identik dengan ituQAGS
, jadi jika Anda telah menggunakan yang terakhir, seharusnya tidak sulit sama sekali untuk mencoba yang pertama. Ingatlah untuk tidak mengonversikan angkaNaN
s danInf
nol menjadi angka di integand - kode akan menangani ini sendiri.Rutin ini juga tersedia di Octave as
quadcc
, dan di Matlab di sini .Bisakah Anda memberikan contoh integrand yang Anda hadapi?
Memperbarui
Berikut adalah contoh penggunaan
CQUAD
untuk mengintegrasikan fungsi dengan singularitas di salah satu titik akhir:yang saya susun
gcc -g -Wall cquad_test.c -lgsl -lcblas
. Outputnya adalahYang, mengingat hasil yang dihitung dalam Maple menjadi 20 digit, , benar menjadi 14 digit.0.94608307036718301494
Perhatikan bahwa tidak ada yang istimewa di sini, tidak ada yang tahu di
CQUAD
mana singularitas itu, atau perlakuan khusus apa pun di dalam integrand itu sendiri. Saya biarkan saja kembaliNaN
, dan integrator merawatnya secara otomatis.Perhatikan juga bahwa ada bug dalam versi GSL terbaru 1.15 yang dapat mempengaruhi perawatan singularitas. Sudah diperbaiki, tetapi belum sampai ke distribusi resmi. Saya menggunakan sumber terbaru, diunduh dengan
bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
.sumber
Anda juga bisa melihat rumus kuadratur eksponensial ganda. Mereka melakukan perubahan variabel (implisit), memastikan bahwa mereka "melonggarkan" singularitas batas. Implementasi yang sangat bagus (Fortran77 dan C) dapat ditemukan di situs web Ooura .
sumber