2015-12-02 64 views
1

我的工作涉及计算大变量值下的高阶贝塞尔函数。在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问题似乎在强烈的振荡曲线和渐近衰减的尾部之间发生。

+0

为什么不自己计算功能? – marsei

+0

使用bessel函数的递归关系不会帮助我进一步。事实上,随着订单的增加,与使用GSL库例程相比,它的分解速度要快得多。 –

+0

@macduf当然你不是指手。 – erip

回答

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都建立在由唐纳德·E·阿莫斯博士(Sandia国家实验室)的原始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. 

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

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