2

私は試しboost::math::cyl_bessel_k(x,y) * exp(y)ました。ほとんどの場合、これは Matlab の scaled と同じbesselk(x,y,1)です。しかし、場合によっては (例: x=1y=2000) と の両方besselk(x,y)=0boost::math::cyl_bessel_k(x,y)=0、Matlab のスケーリングされbesselk(x,y,1)たバージョンでは異なる値が得られ、 が変化し10^-3ます。しかし、boost::math::cyl_bessel_k(x,y) * exp(y)戻ります-nan。Matlab のbesselk(x,y,1). どうすればこれを処理できますか?

4

1 に答える 1

1

Boost には、必要なことを行うものは何もありません (ただし、下位レベルの関数を使用して自分で実装できる場合があります)。お気づきのように、スケーリングされたベッセル関数は単純に乗算するだけでは計算されませんexp(z)GSLには、この機能が組み込まれているようgsl_sf_bessel_Knu_scaledです。「正確な同等物」については、CBESKなどの Amos による論文コードを参照してください。Matlab と Octave の両方がこの実装を使用しているようです。ただし、コードは Fortran で記述されているため、翻訳するか、ラッパーを配置する必要があります (このプロジェクトはそれを行っているように見えるので、役に立つかもしれません。他にもあります)。

また、Matlab の Coder を使用しcodegenて何かを出力することもできます。

于 2014-07-07T18:01:40.923 に答える