

   BBeesssseell FFuunnccttiioonnss

        besselI(x, nu, expon.scaled = FALSE)
        besselK(x, nu, expon.scaled = FALSE)
        besselJ(x, nu)
        besselY(x, nu)
        gammaCody(x)

   AArrgguummeennttss::

          x: numeric, >= 0.

         nu: numeric; >= 0 unless in `besselK' which is symmet-
             ric in `nu'.  The order of the corresponding
             Bessel function.

   expon.scaled: logical; if `TRUE', the results are exponen-
             tially scaled in order to avoid overflow (I(nu))
             or underflow (K(nu)), respectively.

   DDeessccrriippttiioonn::

        Bessel Functions of integer and fractional order, of
        first and second kind, J(nu) and Y(nu), and Modified
        Bessel functions (of first and third kind), I(nu) and
        K(nu).

        `gammaCody' is the (Gamma) Function as from the Specfun
        package and originally used in the Bessel code.

   DDeettaaiillss::

        The underlying code for these functions stem from
        Netlib, `http://www.netlib.org/specfun/r[ijky]besl'.

        If `expon.scaled = TRUE', exp(-x) I(x;nu), or exp(x)
        K(x;nu) are returned.

        `gammaCody' may be somewhat faster but less precise
        and/or robust than R's standard `gamma'.  It is here
        for experimental purpose mainly, and may be defunct
        very soon.

   VVaalluuee::

        numeric of the same length of `x' with the (scaled, if
        `expon.scale=T') values of the corresponding Bessel
        function.

   RReeffeerreenncceess::

        Abramowitz, M. and Stegun, I. A. (1972).
        Handbook of Mathematical Functions, Dover, New York;
        Chapter 9: Bessel Functions of Integer Order.

   SSeeee AAllssoo::

        Other special mathematical functions, as the `gamma',
        Gamma(x), and `beta', B(x).

   EExxaammpplleess::

        nus <- c(0:5,10,20)

        x <- seq(0,4, len= 501)
        plot(x,x, ylim = c(0,6), ylab="",type='n', main = "Bessel Functions  I_nu(x)")
        for(nu in nus) lines(x,besselI(x,nu=nu), col = nu+2)
        legend(0,6, leg=paste("nu=",nus), col = nus+2, lwd=1)

        x <- seq(0,40,len=801); yl <- c(-.8,.8)
        plot(x,x, ylim = yl, ylab="",type='n', main = "Bessel Functions  J_nu(x)")
        for(nu in nus) lines(x,besselJ(x,nu=nu), col = nu+2)
        legend(32,-.18, leg=paste("nu=",nus), col = nus+2, lwd=1)

        x0 <- 2^(-20:10)
        plot(x0,x0^-8, log='xy', ylab="",type='n',
             main = "Bessel Functions  J_nu(x)  near 0\n log - log  scale")
        for(nu in sort(c(nus,nus+.5))) lines(x0,besselJ(x0,nu=nu), col = nu+2)
        legend(3,1e50, leg=paste("nu=", paste(nus,nus+.5, sep=",")), col=nus+2, lwd=1)

        plot(x0,x0^-8, log='xy', ylab="",type='n',
             main = "Bessel Functions  K_nu(x)  near 0\n log - log  scale")
        for(nu in sort(c(nus,nus+.5))) lines(x0,besselK(x0,nu=nu), col = nu+2)
        legend(3,1e50, leg=paste("nu=", paste(nus,nus+.5, sep=",")), col=nus+2, lwd=1)

        x <- x[x > 0]
        plot(x,x, ylim=c(1e-18,1e11),log="y", ylab="",type='n',
             main = "Bessel Functions  K_nu(x)")
        for(nu in nus) lines(x,besselK(x,nu=nu), col = nu+2)
        legend(0,1e-5, leg=paste("nu=",nus), col = nus+2, lwd=1)

        ## Check the Scaling :
        for(nu in nus)
           print(all(abs(1- besselK(x,nu)*exp( x) / besselK(x,nu,expo=TRUE)) < 2e-15))
        for(nu in nus)
           print(all(abs(1- besselI(x,nu)*exp(-x) / besselI(x,nu,expo=TRUE)) < 1e-15))

        yl <- c(-1.6, .6)
        plot(x,x, ylim = yl, ylab="",type='n', main = "Bessel Functions  Y_nu(x)")
        for(nu in nus){xx <- x[x > .6*nu]; lines(xx,besselY(xx,nu=nu), col = nu+2){
        legend(25,-.5, leg=paste("nu=",nus), col = nus+2, lwd=1)

        nus <- c(0:5,10,20)

        x <- seq(0,4, len= 501)
        plot(x,x, ylim = c(0,6), ylab="",type='n', main = "Bessel Functions  I_nu(x)")
        for(nu in nus) lines(x,besselI(x,nu=nu), col = nu+2)
        legend(0,6, leg=paste("nu=",nus), col = nus+2, lwd=1)

        x <- seq(0,40,len=801); yl <- c(-.8,.8)
        plot(x,x, ylim = yl, ylab="",type='n', main = "Bessel Functions  J_nu(x)")
        for(nu in nus) lines(x,besselJ(x,nu=nu), col = nu+2)
        legend(32,-.18, leg=paste("nu=",nus), col = nus+2, lwd=1)

        x0 <- 2^(-20:10)
        plot(x0,x0^-8, log='xy', ylab="",type='n',
             main = "Bessel Functions  J_nu(x)  near 0\n log - log  scale")
        for(nu in sort(c(nus,nus+.5))) lines(x0,besselJ(x0,nu=nu), col = nu+2)
        legend(3,1e50, leg=paste("nu=", paste(nus,nus+.5, sep=",")), col=nus+2, lwd=1)

        plot(x0,x0^-8, log='xy', ylab="",type='n',
             main = "Bessel Functions  K_nu(x)  near 0\n log - log  scale")
        for(nu in sort(c(nus,nus+.5))) lines(x0,besselK(x0,nu=nu), col = nu+2)
        legend(3,1e50, leg=paste("nu=", paste(nus,nus+.5, sep=",")), col=nus+2, lwd=1)

        x <- x[x > 0]
        plot(x,x, ylim=c(1e-18,1e11),log="y", ylab="",type='n',
             main = "Bessel Functions  K_nu(x)")
        for(nu in nus) lines(x,besselK(x,nu=nu), col = nu+2)
        legend(0,1e-5, leg=paste("nu=",nus), col = nus+2, lwd=1)

        ## Check the Scaling :
        for(nu in nus)
           print(all(abs(1- besselK(x,nu)*exp( x) / besselK(x,nu,expo=TRUE)) < 2e-15))
        for(nu in nus)
           print(all(abs(1- besselI(x,nu)*exp(-x) / besselI(x,nu,expo=TRUE)) < 1e-15))

        yl <- c(-1.6, .6)
        plot(x,x, ylim = yl, ylab="",type='n', main = "Bessel Functions  Y_nu(x)")
        for(nu in nus)}xx <- x[x > .6*nu]; lines(xx,besselY(xx,nu=nu), col = nu+2)}
        legend(25,-.5, leg=paste("nu=",nus), col = nus+2, lwd=1)

