具有大变量的高阶bessel函数计算

时间:2015-12-02 22:38:36

标签: c++ matlab gsl bessel-functions

我的工作涉及在大变量值下计算高阶bessel函数。在MATLAB中,这已经没有问题。但是,为了扩大问题,我已经调整了用MPI编写C ++代码。当然,生成bessel函数的步骤是通过调用一些库来完成的。为了解决这个问题,让我考虑一下这个非常具体的错误。

在matlab中,假设我想计算$ J_46341(86840.0)$和

  

matlab给了我:besselj(46341,86840)= 0.001309896212292

然而,一个简单的测试示例来调用

  

gsl_sf_bessel_Jn_e返回“ERROR:NaN”

我已经检查了订单46340,matlab和gsl都在可接受的准确度内返回相同的答案0.00292895。 GSL中的另一个步骤导致NaN错误,而matlab仍然保留了一个很好的准确数字答案。

我确实尝试使用递归关系来生成更高阶的值,从一个不那么小的顺序,比如20000及以上的顺序,然而,这只会延迟NaN错误而不完全解决问题。

将我的注意力转移到其他可用的软件库,我尝试了NAG,但令我完全失望,

  

nag_bessel_j_alpha(s18ekc)的约束为abs(nl)< = 101

换句话说,它只能计算101的数量级,显然不符合我的学习兴趣。

所以,我的问题很简单:

  

是否有更可靠的库方法来获得高阶bessel   大x的函数值?

渐近地,bessel函数接近0,如果尾部接近下溢限制,我肯定可以将这些值设置为零。然而,NaN问题似乎在强烈振荡的曲线和渐近衰减的尾部之间发生。

1 个答案:

答案 0 :(得分:1)

问题解决了。感谢您的社区工作,我的知识和贡献让我感到惊讶!!!

请看这里, how to call fortran routines from C++?

https://mathoverflow.net/questions/225121/computation-of-high-order-bessel-function-at-large-variable-value

MATLAB,R,Python和JuliaLang / openspecfun均以Donald E. Amos博士(桑迪亚国家实验室)的原始fortran源代码为基础,引用论文:

D. E. Amos, "A subroutine package for Bessel functions of a complex
argument and nonnegative order", Sandia National Laboratory Report,
SAND85-1018, May, 1985.
D. E. Amos, "A portable package for Bessel functions of a complex
argument and nonnegative order", Trans. Math. Software, 1986.

现在称为ACM收集的Amos算法644。

http://dl.acm.org/citation.cfm?id=212078
http://dl.acm.org/citation.cfm?id=1268783
http://dl.acm.org/citation.cfm?id=98299

但是,netlib上托管的源代码不是没有错误的,可能不是最新的,

http://netlib.sandia.gov/master/index.html
http://netlib.sandia.gov/amos/

虽然openspecfun采用的版本是可靠的,

https://github.com/JuliaLang/openspecfun