我的工作涉及计算大变量值下的高阶贝塞尔函数。在MATLAB中,这样做没有问题。然而,为了扩大这个问题,我调整了使用MPI编写C++代码。当然,通过调用一些库来完成生成bessel函数的步骤。为了把问题具体化,让我考虑这个非常具体的错误。具有大变量的高阶贝塞尔函数计算
在MATLAB中,假设我希望计算$ J_46341(86840.0)$,并
matlab gives me: besselj(46341,86840)=0.001309896212292
但是,一个简单的测试例子调用
gsl_sf_bessel_Jn_e returns "ERROR: NaN"
,我在订单46340已经检查, matlab和gsl在可接受的精度范围内返回相同的答案0.00292895。 GSL的另一个步骤导致NaN错误,而matlab仍然保留一个准确的数字答案。
我尝试使用递归关系来生成更高阶的值,从一个不是很小的顺序,比如从20000开始,然而,这只会延迟NaN错误而不能完全解决问题。
交换我的注意力转移到其他可用的软件库在那里,我试过NAG,但令我彻底失望,
nag_bessel_j_alpha (s18ekc) has constraint of abs(nl)<=101
,换句话说,它只能计算出高达101秩序,这显然是不符合我的学习兴趣。
所以,我的问题很简单:
Is there a more reliable library approach to obtain high order bessel function value for large x?
渐近,贝塞尔函数接近0,我一定能够设置这些值为零,如果尾巴接近极限下溢。然而,NaN问题似乎在强烈的振荡曲线和渐近衰减的尾部之间发生。
为什么不自己计算功能? – marsei
使用bessel函数的递归关系不会帮助我进一步。事实上,随着订单的增加,与使用GSL库例程相比,它的分解速度要快得多。 –
@macduf当然你不是指手。 – erip