This is a reply to my own question. I thought I had found an answer but it seems not so (some analysis follows below). Maybe Martin Maechler or Robin Hankin or Duncan Murdoch may have some ideas---I know the question is a bit specialized.

David Scott wrote:
I am looking for a method of dealing with the modified Bessel function K_\nu(x) for large \nu.

The besselK function implementation of this allows for dealing with large values of x by allowing for exponential scaling, but there is no facility for dealing with large \nu.

What would work for me would be an lbesselK function in the manner of lgamma which returned the log of K_\nu(x) for large \nu. Does anybody have any leads on this?

Note that I have trawled through Abramowitz and Stegun and found 9.7.8 which doesn't work for me because of the complication in the definition of the x argument. I have also seen a result of Ismail (1977) reported by Barndorff-Nielsen and Blaesild which has the other problem, the treatment of the x argument is too simple.

To do the calculation I am attempting, I need to have the Bessel function in a form that will allow a cancellation with a Gamma function of high order in the denominator.

David Scott



After posting I checked the GNU Scientific Library (http://www.gnu.org/software/gsl/) and found:

********************
— Function: double gsl_sf_bessel_lnKnu (double nu, double x)
— Function: int gsl_sf_bessel_lnKnu_e (double nu, double x, gsl_sf_result * result)

These routines compute the logarithm of the irregular modified Bessel function of fractional order \nu, \ln(K_\nu(x)) for x>0, \nu>0.
********************
I then recalled that Robin Hankin and Duncan Murdoch had made the GSL available. I installed the package gsl and investigated the function
bessel_lnKnu.

Unfortunately, it appears that this function has *smaller* range than besselK when it comes to the index. The following shows it:

library(plyr)
library(gsl)
### Check calculations using both methods
lnKnu <- maply(expand.grid(x = 100*(1:7), nu = 10*(1:100)), bessel_lnKnu)
lnKnu
Knu <- maply(expand.grid(x = 100*(1:7), nu = 10*(1:100)), besselK)
Knu
lnKnu/log(Knu)

I was expecting what happens with gamma and lgamma

### Compare gamma function
lgam <- lgamma(100*(1:7))
lgam
gam <- gamma(100*(1:7))
gam
lgam/log(gam)

It seems that bessel_lnKnu is set up to protect against infinity when x becomes small:

### Does lnKnu protect against Inf when x goes to zero?
lnnear0 <- maply(expand.grid(x = 0.00000001*(1:10), nu = 10*(0:5)), bessel_lnKnu)
lnnear0
near0 <- maply(expand.grid(x = 0.00000001*(1:10), nu = 10*(0:5)), besselK)
near0
lnnear0/log(near0)

So, I am still in need of a solution: an implementation of log of Bessel K which protects against the index nu becoming large.

David Scott

--
_________________________________________________________________
David Scott     Department of Statistics
                The University of Auckland, PB 92019
                Auckland 1142,    NEW ZEALAND
Phone: +64 9 923 5055, or +64 9 373 7599 ext 85055
Email:  d.sc...@auckland.ac.nz,  Fax: +64 9 373 7018

Director of Consulting, Department of Statistics

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to