public static double I ( int n , double x ) { if ( n < 0 ) throw new IllegalArgumentException ( "the variable n out of range." ) ; else if ( n == 0 ) return I0 ( x ) ; else if ( n == 1 ) return I ( x ) ; if ( x == 0.0 ) return 0.0 ; double ACC = 40.0 ; double BIGNO = 1.0e+10 ; double BIGNI = 1.0e-10 ; double tox = 2.0 / Math . abs ( x ) ; double bip = 0 , ans = 0.0 ; double bi = 1.0 ; for ( int j = 2 * ( n + ( int ) Math . sqrt ( ACC * n ) ) ; j > 0 ; j -- ) { double bim = bip + j * tox * bi ; bip = bi ; bi = bim ; if ( Math . abs ( bi ) > BIGNO ) { ans *= BIGNI ; bi *= BIGNI ; bip *= BIGNI ; } if ( j == n ) ans = bip ; } ans *= I0 ( x ) / bi ; return x < 0.0 && n % 2 == 1 ? - ans : ans ; }
Bessel function of the first kind of order n .