230 Chapter 6.Special Functions 6.5 Bessel Functions of Integer Order This section and the next one present practical algorithms for computing various kinds of Bessel functions of integer order.In $6.7 we deal with fractional order.In fact,the more complicated routines for fractional order work fine for integer order too.For integer order,however,the routines in this section (and 86.6)are simpler and faster.Their only drawback is that they are limited by the precision of the underlying rational approximations.For full double precision,it is best to work with the routines for fractional order in 86.7. For any real v,the Bessel function J(z)can be defined by the series representation 菲 J(x) (-7x2) (6.5.1) 3 The series converges for all z,but it is not computationally very useful for >1. For v not an integer the Bessel function Y()is given by Y(z)= J(z)cos(vT)-Jv() (6.5.2) sin(wT)】 The right-hand side goes to the correct limiting value Yn()as v goes to some integer n,but this is also not computationally useful. For arguments x<v,both Bessel functions look qualitatively like simple 3SO power laws,with the asymptotic forms for 0<zv 1 J(~w+2 v≥0 6回~2m(回 (6.5.3) T -() -V v>0 Numerica 10621 For >v,both Bessel functions look qualitatively like sine or cosine waves whose amplitude decays as x-1/2.The asymptotic forms forvare 43126 2 1 (outside (6.5.4) 2. 71 1 In the transition region wherev,the typical amplitudes of the Bessel functions are on the order 21/31 0.4473 四)~3亦~ v1/3 21/3 (6.5.5) 3VT方~-0.7748 1 Y(w) v1/3
230 Chapter 6. Special Functions Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copyin Copyright (C) 1988-1992 by Cambridge University Press. Programs Copyright (C) 1988-1992 by Numerical Recipes Software. Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5) g of machinereadable files (including this one) to any server computer, is strictly prohibited. To order Numerical Recipes books or CDROMs, visit website http://www.nr.com or call 1-800-872-7423 (North America only), or send email to directcustserv@cambridge.org (outside North America). 6.5 Bessel Functions of Integer Order This section and the next one present practical algorithms for computing various kinds of Bessel functions of integer order. In §6.7 we deal with fractional order. In fact, the more complicated routines for fractional order work fine for integer order too. For integer order, however, the routines in this section (and §6.6) are simpler and faster. Their only drawback is that they are limited by the precision of the underlying rational approximations. For full double precision, it is best to work with the routines for fractional order in §6.7. For any real ν, the Bessel function Jν(x) can be defined by the series representation Jν (x) = 1 2 x ν ∞ k=0 (−1 4x2)k k!Γ(ν + k + 1) (6.5.1) The series converges for all x, but it is not computationally very useful for x 1. For ν not an integer the Bessel function Yν (x) is given by Yν(x) = Jν(x) cos(νπ) − J−ν(x) sin(νπ) (6.5.2) The right-hand side goes to the correct limiting value Y n(x) as ν goes to some integer n, but this is also not computationally useful. For arguments x<ν, both Bessel functions look qualitatively like simple power laws, with the asymptotic forms for 0 < x ν Jν(x) ∼ 1 Γ(ν + 1)1 2 x ν ν ≥ 0 Y0(x) ∼ 2 π ln(x) Yν (x) ∼ −Γ(ν) π 1 2 x −ν ν > 0 (6.5.3) For x>ν, both Bessel functions look qualitatively like sine or cosine waves whose amplitude decays as x−1/2. The asymptotic forms for x ν are Jν(x) ∼ 2 πx cos x − 1 2 νπ − 1 4 π Yν(x) ∼ 2 πx sin x − 1 2 νπ − 1 4 π (6.5.4) In the transition region where x ∼ ν, the typical amplitudes of the Bessel functions are on the order Jν (ν) ∼ 21/3 32/3Γ( 2 3 ) 1 ν1/3 ∼ 0.4473 ν1/3 Yν (ν) ∼ − 21/3 31/6Γ( 2 3 ) 1 ν1/3 ∼ −0.7748 ν1/3 (6.5.5)
6.5 Bessel Functions of Integer Order 231 Permission is .com or call 1-800-872- (including this one) internet -1.5 from NUMERICAL RECIPES IN C: -20 (North 0 2 4 6 10 to any server computer, 1988-1992 by Cambridge University Press. America t users to make one paper THE Figure 6.5.1.Bessel functionsJo()through J3()and Yo(r)through Y2(). ART which holds asymptotically for large v.Figure 6.5.1 plots the first few Bessel Programs functions of each kind. The Bessel functions satisfy the recurrence relations Jn+1(回= 2”Jn()-n-1( (6.5.6) and Xa回-x(国)--回 (6.5.7) OF SCIENTIFIC COMPUTING (ISBN 0-521- 1988-1992 As already mentioned in $5.5,only the second of these (6.5.7)is stable in the direction of increasing n for x<n.The reason that(6.5.6)is unstable in the direction of increasing n is simply that it is the same recurrence as (6.5.7):A small amount of"polluting"Yn introduced by roundofferror will quickly come to swamp Fuurggoglrion the desired Jn,according to equation (6.5.3). Numerical Recipes :43198.5 A practical strategy for computing the Bessel functions of integer order divides into two tasks:first,how to compute Jo,J1,Yo,and Yi,and second,how to use the (outside recurrence relations stably to find otherJ's and Y's.We treat the first task first: North Software. For x between zero and some arbitrary value (we will use the value 8), approximate Jo()andJ1()by rational functions in z.Likewise approximate by rational functions the"regular part"of Yo(x)and Yi(r),defined as visit website 6a)-2ha回ande-回he- (6.5.8) For 8<x<o,use the approximating forms (n=0,1) a=Vr())=x)-o.()mx】 (6.5.9)
6.5 Bessel Functions of Integer Order 231 Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copyin Copyright (C) 1988-1992 by Cambridge University Press. Programs Copyright (C) 1988-1992 by Numerical Recipes Software. Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5) g of machinereadable files (including this one) to any server computer, is strictly prohibited. To order Numerical Recipes books or CDROMs, visit website http://www.nr.com or call 1-800-872-7423 (North America only), or send email to directcustserv@cambridge.org (outside North America). Bessel functions 1 .5 0 −.5 −1 −1.5 −2 0 2 4 6 8 10 Y0 Y1 Y2 J0 J1 J2 J3 x Figure 6.5.1. Bessel functions J0(x) through J3(x) and Y0(x) through Y2(x). which holds asymptotically for large ν. Figure 6.5.1 plots the first few Bessel functions of each kind. The Bessel functions satisfy the recurrence relations Jn+1(x) = 2n x Jn(x) − Jn−1(x) (6.5.6) and Yn+1(x) = 2n x Yn(x) − Yn−1(x) (6.5.7) As already mentioned in §5.5, only the second of these (6.5.7) is stable in the direction of increasing n for x<n. The reason that (6.5.6) is unstable in the direction of increasing n is simply that it is the same recurrence as (6.5.7): A small amount of “polluting” Yn introduced by roundoff error will quickly come to swamp the desired Jn, according to equation (6.5.3). A practical strategy for computing the Bessel functions of integer order divides into two tasks: first, how to compute J0, J1, Y0, and Y1, and second, how to use the recurrence relations stably to find other J’s and Y ’s. We treat the first task first: For x between zero and some arbitrary value (we will use the value 8), approximate J0(x) and J1(x) by rational functions in x. Likewise approximate by rational functions the “regular part” of Y0(x) and Y1(x), defined as Y0(x) − 2 π J0(x) ln(x) and Y1(x) − 2 π J1(x) ln(x) − 1 x (6.5.8) For 8 <x< ∞, use the approximating forms (n = 0, 1) Jn(x) = 2 πx Pn 8 x cos(Xn) − Qn 8 x sin(Xn) (6.5.9)
232 Chapter 6.Special Functions a=Vr()m(x)+o.()x 6.5.10) where 2m+1 Xn三x- (6.5.11) and where Po,P,Qo,and Q1 are each polynomials in their arguments,for 0< 8/z<1.The P's are even polynomials,the Q's odd. Coefficients of the various rational functions and polynomials are given by Hart [1],for various levels of desired accuracy.A straightforward implementation is 鱼 nted for 19881992 #include <math.h> 1-800 float bessj0(float x) Returns the Bessel function Jo(x)for any real x. float ax,z; double xx,y,ans,ans1,ans2; Accumulate polynomials in double precision. (Nor if ((ax=fabs(x))<8.0){ Direct rational function fit. y=x*x: America server computer, one paper University Press. THE ans1=57568490574.0+y*(-13362590354.0+y*(651619640.7 +y*(-11214424.18+y*(77392.33017+y*(-184.9052456)): ART ans2=57568490411.0+y*(1029532985.0+y*(9494680.718 是 +y*(59272.64853+y*(267.8532712+y*1.0)))); ans eans1/ans2; Programs else Fitting function (6.5.9) z=8.0/ax; st st y=2*z; xx=ax-0.785398164; Copyright (C) ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.20938872118-6)); ans2=-0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+y*(0.7621095161e-6 email to directcustsen -y*0.934945152e-7))); ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); OF SCIENTIFIC COMPUTING(ISBN 0-521- return ans; @cambridge.org 1988-1992 by Numerical Recipes -431085 #include <math.h> float bessy0(float x) Software. Returns the Bessel function Yo(x)for positive x. float bessjo(float x); (outside North America) float zi double xx,y,ans,ans1,ans2; Accumulate polynomials in double precision. if(x<8.0) Rational function approximation of (6.5.8) y=x*x: ans1=-2957821389.0+y*(7062834065.0+y*(-512359803.6 +y*(10879881.29+y*(-86327.92757+y*228.4622733))); ans2=40076544269.0+y*(745249964.8+y*(7189466.438 +y*(47447.26470+y*(226.1030244+y*1.0)))); ans=(ans1/ans2)+0.636619772*bessj0(x)*1og(x); else Fitting function (6.5.10)
232 Chapter 6. Special Functions Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copyin Copyright (C) 1988-1992 by Cambridge University Press. Programs Copyright (C) 1988-1992 by Numerical Recipes Software. Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5) g of machinereadable files (including this one) to any server computer, is strictly prohibited. To order Numerical Recipes books or CDROMs, visit website http://www.nr.com or call 1-800-872-7423 (North America only), or send email to directcustserv@cambridge.org (outside North America). Yn(x) = 2 πx Pn 8 x sin(Xn) + Qn 8 x cos(Xn) (6.5.10) where Xn ≡ x − 2n + 1 4 π (6.5.11) and where P0, P1, Q0, and Q1 are each polynomials in their arguments, for 0 < 8/x < 1. The P’s are even polynomials, the Q’s odd. Coefficients of the various rational functions and polynomials are given by Hart [1], for various levels of desired accuracy. A straightforward implementation is #include <math.h> float bessj0(float x) Returns the Bessel function J0(x) for any real x. { float ax,z; double xx,y,ans,ans1,ans2; Accumulate polynomials in double precision. if ((ax=fabs(x)) < 8.0) { Direct rational function fit. y=x*x; ans1=57568490574.0+y*(-13362590354.0+y*(651619640.7 +y*(-11214424.18+y*(77392.33017+y*(-184.9052456))))); ans2=57568490411.0+y*(1029532985.0+y*(9494680.718 +y*(59272.64853+y*(267.8532712+y*1.0)))); ans=ans1/ans2; } else { Fitting function (6.5.9). z=8.0/ax; y=z*z; xx=ax-0.785398164; ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.2093887211e-6))); ans2 = -0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+y*(0.7621095161e-6 -y*0.934945152e-7))); ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); } return ans; } #include <math.h> float bessy0(float x) Returns the Bessel function Y0(x) for positive x. { float bessj0(float x); float z; double xx,y,ans,ans1,ans2; Accumulate polynomials in double precision. if (x < 8.0) { Rational function approximation of (6.5.8). y=x*x; ans1 = -2957821389.0+y*(7062834065.0+y*(-512359803.6 +y*(10879881.29+y*(-86327.92757+y*228.4622733)))); ans2=40076544269.0+y*(745249964.8+y*(7189466.438 +y*(47447.26470+y*(226.1030244+y*1.0)))); ans=(ans1/ans2)+0.636619772*bessj0(x)*log(x); } else { Fitting function (6.5.10).
6.5 Bessel Functions of Integer Order 233 z=8.0/x; y=2*2; xx=x-0.785398164; ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.2093887211a-6)); ans2=-0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+y*(0.7621095161e-6 +y*(-0.934945152e-7)))): ans=sqrt(0.636619772/x)*(sin(xx)*ans1+z*cos(xx)*ans2); return ans; 2 http://www.n Permission is read able files #include <math.h> .com or call (including this one) granted fori 19881992 float bessj1(float x) 11-800 Returns the Bessel function J(x)for any real x. float ax,z; to any double xx,y,ans,ans1,ans2; Accumulate polynomials in double precision. from NUMERICAL RECIPES IN if ((ax=fabs(x))<8.0){ Direct rational approximation y=x*x: ans1=x*(72362614232.0+y*(-7895059235.0+y*(242396853.1 +y*(-2972611.439+y*(15704.48260+y*(-30.16036606))))); (North America server computer, Cambridge University Press. tusers to make THE ans2=144725228442.0+y*(2300535178.0+y*(18583304.74 one paper ART +y*(99447.43394+y*(376.9991397+y*1.0)))); 是 ans=ans1/ans2; else Fitting function (6.5.9) Programs z=8.0/ax: send y=2*2; xx=ax-2.356194491: ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4 +y*(0.2457520174e-5+y*(-0.240337019e-6)))); ans2=0.04687499995+y*(-0.2002690873e-3 +y*(0.8449199096e-5+y*(-0.88228987e-6 +y*0.105787412e-6))); email to directcustsen ans=sqrt (0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); if (x 0.0)ans -ans; OF SCIENTIFIC COMPUTING(ISBN 0-521- 2 return ans; @cambridge.org 1988-1992 by Numerical Recipes -43106 #include <math.h> float bessy1(float x) Returns the Bessel function Y1(x)for positive x. float bessj1(float x); (outside North America) Software. float zi double xx,y,ans,ans1,ans2; Accumulate polynomials in double precision. if(x<8.0) Rational function approximation of(6.5.8) y=*x: ans1=x*(-0.4900604943e13+y*(0.1275274390e13 +y*(-0.5153438139e11+y*(0.7349264551e9 +y*(-0.4237922726e7+y*0.8511937935e4))); ans2=0.2499580570e14+y*(0.4244419664e12 +y*(0.3733650367e10+y*(0.2245904002e8 +y*(0.1020426050e6+y*(0.3549632885e3+y)))):
6.5 Bessel Functions of Integer Order 233 Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copyin Copyright (C) 1988-1992 by Cambridge University Press. Programs Copyright (C) 1988-1992 by Numerical Recipes Software. Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5) g of machinereadable files (including this one) to any server computer, is strictly prohibited. To order Numerical Recipes books or CDROMs, visit website http://www.nr.com or call 1-800-872-7423 (North America only), or send email to directcustserv@cambridge.org (outside North America). z=8.0/x; y=z*z; xx=x-0.785398164; ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.2093887211e-6))); ans2 = -0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+y*(0.7621095161e-6 +y*(-0.934945152e-7)))); ans=sqrt(0.636619772/x)*(sin(xx)*ans1+z*cos(xx)*ans2); } return ans; } #include <math.h> float bessj1(float x) Returns the Bessel function J1(x) for any real x. { float ax,z; double xx,y,ans,ans1,ans2; Accumulate polynomials in double precision. if ((ax=fabs(x)) < 8.0) { Direct rational approximation. y=x*x; ans1=x*(72362614232.0+y*(-7895059235.0+y*(242396853.1 +y*(-2972611.439+y*(15704.48260+y*(-30.16036606)))))); ans2=144725228442.0+y*(2300535178.0+y*(18583304.74 +y*(99447.43394+y*(376.9991397+y*1.0)))); ans=ans1/ans2; } else { Fitting function (6.5.9). z=8.0/ax; y=z*z; xx=ax-2.356194491; ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4 +y*(0.2457520174e-5+y*(-0.240337019e-6)))); ans2=0.04687499995+y*(-0.2002690873e-3 +y*(0.8449199096e-5+y*(-0.88228987e-6 +y*0.105787412e-6))); ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); if (x < 0.0) ans = -ans; } return ans; } #include <math.h> float bessy1(float x) Returns the Bessel function Y1(x) for positive x. { float bessj1(float x); float z; double xx,y,ans,ans1,ans2; Accumulate polynomials in double precision. if (x < 8.0) { Rational function approximation of (6.5.8). y=x*x; ans1=x*(-0.4900604943e13+y*(0.1275274390e13 +y*(-0.5153438139e11+y*(0.7349264551e9 +y*(-0.4237922726e7+y*0.8511937935e4))))); ans2=0.2499580570e14+y*(0.4244419664e12 +y*(0.3733650367e10+y*(0.2245904002e8 +y*(0.1020426050e6+y*(0.3549632885e3+y)))));
234 Chapter 6.Special Functions ans=(ans1/ans2)+0.636619772*(bessj1(x)*1og(x)-1.0/x); else Fitting function (6.5.10). z=8.0/x; y=z*z; xx=x-2.356194491: ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4 +y*(0.2457520174e-5+y*(-0.240337019a-6))); ans2=0.04687499995+y*(-0.2002690873e-3 +y*(0.8449199096e-5+y*(-0.88228987e-6 +y*0.105787412e-6))); ans=sqrt(0.636619772/x)*(sin(xx)*ans1+z*cos(xx)*ans2); return ans; 83 鱼 19881992 We now turn to the second task,namely how to use the recurrence formulas (6.5.6)and(6.5.7)to get the Bessel functions n(x)and Yn(z)for n 2.The latter of these is straightforward,since its upward recurrence is always stable: from NUMERICAL RECIPESI float bessy(int n,float x) Returns the Bessel function Yn(x)for positive x and n 2. float bessy0(float x); float bessy1(float x); (North America 州bMe se to make one paper University Press. THE void nrerror(char error_text []) int ji ART float by,bym,byp,tox; if (n 2)nrerror("Index n less than 2 in bessy"); Programs tox=2.0/x; by=bessy1(x); Starting values for the recurrence. bym=bessy0(x); for (j=1;j<n;j++){ Recurrence (6.5.7). byp=j*tox*by-bym; to dir bym=by; by=byp; 1988199200 OF SCIENTIFIC COMPUTING(ISBN return by; v@cam 10-:6211 The cost of this algorithm is the call to bessy1 and bessyo(which generate a call to each of bessj1 and bessjo),plus O(n)operations in the recurrence. Numerical Recipes 43108 As for.().things are a bit more complicated.We can start the recurrence upward on n from.Jo and/1.but it will remain stable only while n does not exceed z.This is,however,just fine for calls with large z and small n,a case which (outside occurs frequently in practice. North Software. The harder case to provide for is that with x<n.The best thing to do here is to use Miller's algorithm(see discussion preceding equation 5.5.16),applying the recurrence dowmard from some arbitrary starting value and making use of the upward-unstable nature of the recurrence to put us onto the correct solution.When machine we finally arrive atJo orJ we are able to normalize the solution with the sum (5.5.16)accumulated along the way. The only subtlety is in deciding at how large an n we need start the downward recurrence so as to obtain a desired accuracy by the time we reach the n that we really want.If you play with the asymptotic forms(6.5.3)and(6.5.5),you should be able to convince yourself that the answer is to start larger than the desired n by
234 Chapter 6. Special Functions Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copyin Copyright (C) 1988-1992 by Cambridge University Press. Programs Copyright (C) 1988-1992 by Numerical Recipes Software. Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5) g of machinereadable files (including this one) to any server computer, is strictly prohibited. To order Numerical Recipes books or CDROMs, visit website http://www.nr.com or call 1-800-872-7423 (North America only), or send email to directcustserv@cambridge.org (outside North America). ans=(ans1/ans2)+0.636619772*(bessj1(x)*log(x)-1.0/x); } else { Fitting function (6.5.10). z=8.0/x; y=z*z; xx=x-2.356194491; ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4 +y*(0.2457520174e-5+y*(-0.240337019e-6)))); ans2=0.04687499995+y*(-0.2002690873e-3 +y*(0.8449199096e-5+y*(-0.88228987e-6 +y*0.105787412e-6))); ans=sqrt(0.636619772/x)*(sin(xx)*ans1+z*cos(xx)*ans2); } return ans; } We now turn to the second task, namely how to use the recurrence formulas (6.5.6) and (6.5.7) to get the Bessel functions J n(x) and Yn(x) for n ≥ 2. The latter of these is straightforward, since its upward recurrence is always stable: float bessy(int n, float x) Returns the Bessel function Yn(x) for positive x and n ≥ 2. { float bessy0(float x); float bessy1(float x); void nrerror(char error_text[]); int j; float by,bym,byp,tox; if (n < 2) nrerror("Index n less than 2 in bessy"); tox=2.0/x; by=bessy1(x); Starting values for the recurrence. bym=bessy0(x); for (j=1;j<n;j++) { Recurrence (6.5.7). byp=j*tox*by-bym; bym=by; by=byp; } return by; } The cost of this algorithm is the call to bessy1 and bessy0 (which generate a call to each of bessj1 and bessj0), plus O(n) operations in the recurrence. As for Jn(x), things are a bit more complicated. We can start the recurrence upward on n from J0 and J1, but it will remain stable only while n does not exceed x. This is, however, just fine for calls with large x and small n, a case which occurs frequently in practice. The harder case to provide for is that with x<n. The best thing to do here is to use Miller’s algorithm (see discussion preceding equation 5.5.16), applying the recurrence downward from some arbitrary starting value and making use of the upward-unstable nature of the recurrence to put us onto the correct solution. When we finally arrive at J0 or J1 we are able to normalize the solution with the sum (5.5.16) accumulated along the way. The only subtlety is in deciding at how large an n we need start the downward recurrence so as to obtain a desired accuracy by the time we reach the n that we really want. If you play with the asymptotic forms (6.5.3) and (6.5.5), you should be able to convince yourself that the answer is to start larger than the desired n by