我的工作涉及计算大变量值的高阶贝塞尔函数。在 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 中的进一步步骤会导致 NaN 错误,而 matlab 仍然保留了良好的准确数字答案。
我确实尝试使用递归关系来生成更高阶的值,从一个不那么小的阶,比如从 20000 及以上的阶开始,但是,这只会延迟 NaN 错误而不能完全解决问题。
将注意力转移到其他可用的软件库上,我尝试了 NAG,但令我非常失望的是,
nag_bessel_j_alpha (s18ekc) 具有 abs(nl)<=101 的约束
,换句话说,它只能计算到 101 的顺序,这显然不符合我的学习兴趣。
所以,我的问题很简单:
是否有更可靠的库方法来获得大 x 的高阶贝塞尔函数值?
渐近地,贝塞尔函数接近 0,如果尾部接近下溢限制,我肯定可以将这些值设置为零。然而,NaN 问题似乎发生在强烈振荡曲线和渐近衰减尾部之间。