私の仕事には、大きな変数値での高次ベッセル関数の計算が含まれます。MATLAB 内では、これは問題なく実行されています。ただし、問題を拡大するために、MPI を使用して C++ コードを記述するように調整しました。もちろん、ベッセル関数を生成するステップは、いくつかのライブラリーを呼び出すことによって行われます。問題を具体化するために、この非常に具体的なバグについて考えてみましょう。
matlab で、$J_46341(86840.0)$ を計算したいとします。
matlab は私に与えます: besselj(46341,86840)=0.001309896212292
ただし、呼び出す簡単なテスト例
gsl_sf_bessel_Jn_e は「エラー: NaN」を返します
注文 46340 で確認したところ、matlab と gsl の両方が許容精度内で同じ回答 0.00292895 を返しました。GSL でもう 1 ステップ実行すると NaN エラーが発生しますが、matlab では正確な数値の回答が保持されます。
再帰関係を使用して、それほど小さくないオーダー、たとえば 20000 以上のオーダーからより高いオーダーの値を生成しようとしましたが、これは問題を完全に解決せずに NaN エラーを遅らせるだけです。
他の利用可能なソフトウェア ライブラリに注意を向けて、NAG を試してみましたが、まったくがっかりしました。
nag_bessel_j_alpha (s18ekc) には abs(nl)<=101 の制約があります
つまり、101 のオーダーまでしか計算できず、明らかに私の研究対象ではありません。
だから、私の質問はかなり簡単です:
大きなxの高次ベッセル関数値を取得するためのより信頼できるライブラリアプローチはありますか?
漸近的に、ベッセル関数は 0 に近づきます。テールがアンダーフローの限界に近づいている場合、これらの値を確実にゼロに設定できます。ただし、NaN の問題は、強く振動する曲線と漸近的に減衰するテールの間で発生するようです。