c++matlabgslbessel-functions

high order bessel function computation with large variables


My work involves computation of high order bessel function at large variable value. Within MATLAB, this has been done without problems. However, in order to scale up the problem, I have tuned to writing C++ code with MPI. Of course, the step to generate bessel function is done by invoking some libraries. To put the problem concrete, let me consider this very specific bug.

In matlab, suppose I wish to compute $J_46341(86840.0)$, and

matlab gives me: besselj(46341,86840)=0.001309896212292

However, a simple test example to call

gsl_sf_bessel_Jn_e returns "ERROR: NaN"

and I have checked at order 46340, both matlab and gsl returns the same answer 0.00292895 within acceptable accuracies. One more step in GSL results in the NaN error while matlab still retains a good accurate numerical answer.

I did try to use recurrence relations to generate higher order values, from a-not-so-small-order, say from order of 20000 and up, however, this only delays the NaN error without completely solving the problem.

Switching my attention to other available software libraries out there, I tried NAG, but to my utter disappointment,

nag_bessel_j_alpha (s18ekc) has constraint of abs(nl)<=101

, in other words, it can only compute up to order of 101 and it is clearly not in my interest of study.

So, my question is fairly simple:

Is there a more reliable library approach to obtain high order bessel function value for large x?

Asymptotically, bessel function approaches 0, I can surely set those values to zero if the tail is approaching the underflow limit. However, the NaN problem seems to occur somewhat between strongly oscillating curve and asymptotically decaying tail.


Solution

  • Problem solved. Thank you for the community work and it really amazed me with your knowledge and contributions!!!

    Please see here, 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 and JuliaLang/openspecfun all build upon the original fortran source code by Dr. Donald E. Amos (sandia national lab), cited paper:

    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.
    

    Now known as Amos Algorithm 644 collected by 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
    

    However, the source codes hosted on netlib are not bug free and probably not up-to-date,

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

    While the version adopted by openspecfun works as solid,

    https://github.com/JuliaLang/openspecfun