C++/Catalogs/Bessely0.cin
Jump to navigation
Jump to search
// C++ implementation of the Neumann function for complex .
// In order to simplify compiling of generators of figures with the Bessel functions, the code below should be stored as bessely0.cin.
// z_type is supposed be defined as "complex double"; however, for your own risk, you may define it in a different way.
// DB is supposed to be defined as "double", but, again, You may consider to give it any other meaning.
// Bessely0.cin is the complex(double) implementation of function BesselY0 with 12 decimal digits.
// Besselj0.cin is also required for the evaluation of BesselY0($z$) at $\Re(z) < 0$.
z_type BesselY0o(z_type z){ z_type q=z*z, L=log(z),c; c= - 0.07380429510868722527 + 0.63661977236758134308 *L +q*( 0.17760601686906714209 - 0.15915494309189533577 *L //1 +q*(-0.016073968025938425623 + 0.0099471839432434584856 *L //2 +q*( 0.00053860266686165495699 - 0.00027631066509009606904*L //3 +q*(-9.4950052052215464727e-6 + 4.3173541420327510788e-6 *L //4 +q*( 1.0358476033628096688e-7 - 4.3173541420327510788e-8*L //5 +q*(-7.693079900902931853e-10 + 2.9981625986338549158e-10*L //6 +q*( 4.1435657365127097585e-12 - 1.5296747952213545489e-12*L //7 +q*(-1.693271517935694952e-14 + 5.9752921688334162066e-15*L //8 +q*( 5.4310606578547997903e-17 - 1.844225978035005002e-17*L //9 +q*(-1.4038708139145750726e-19 + 4.6105649450875125051e-20*L //10 +q*( 2.9871591749754089124e-22 - 9.525960630346100217e-23*L //11 +q*(-5.3238579517852310432e-25 + 1.6538126094350868433e-25*L //12 +q*( 8.0637193881023088762e-28 - 2.4464683571524953303e-28*L //13 +q*(-1.0508248887626167966e-30 + 3.1204953535108358804e-31*L //14 +q*( 1.1906979901326174472e-33 - 3.4672170594564843116e-34*L //15 +q*(-1.1839532194865434318e-36 + 3.3859541596254729605e-37*L //16 +q*( 1.0414105509481877487e-39 - 2.9290260896414125956e-40*L //17 +q*(-8.1611336274140606719e-43 + 2.2600509950936825584e-43*L //18 +q*( 5.73412997215194764e-46 - 1.56513226807041728e-46 *L //19 +q*(-3.63274161597216781e-49 + 9.78207667544010803e-50 *L //20 +q*( 2.08578397589243966e-52 - 5.5453949407256848e-53 *L //21 +q*(-1.09038756019220138e-55 + 2.86435689087070497e-56 *L //22 +q*( 5.21191533934160068e-59 - 1.35366582744362239e-59 *L //23 +q*(-2.28659638982280886e-62 + 5.87528570939072216e-63 *L //24 +q*( 9.240390130641487e-66 - 2.35011428375628887e-66 *L +q*(-3.45073193104851716e-69 + 8.69125104939455941e-70 *L +.5*q*(1.19441760965362774e-72 - 2.98053876865382696e-73 *L )))))) )))))) )))))) )))))) ))); return c;}
z_type BesselY0B(z_type z){ z_type q, f,c,s, u,v, t; int n; f=z-M_PI/4.; c=cos(f); s=sin(f); q=sqrt((2./M_PI)/z); t=-0.25/(z*z); DB a[15]={ 1., 0.28125, 1.79443359375, //2 36.6400909423828125, 1554.95475232601166, 112657.55163570866, 1.2444018732738086e7, 1.94704877579113682e9, 4.09793429073742856e11, 1.11657409971425616e14, 3.82398898446695751e16, 1.60790097644232669e19, 8.14368528685034736e21, 4.89012718846785636e24, 3.43522743047526296e27}; DB b[15]={ -0.25,-0.5859375, -7.2674560546875, -221.149120330810547, -12482.8312061727047, -1.12913591525789816e6, -1.49567532845409687e8, -2.72911336740057677e10,-6.56272123913685251e12, -2.01130255593265352e15,-7.65253033677256616e17, -3.53912986662577341e20,-1.9552988373727684e23, -1.27188585855613042e26,-9.62159820828804254e28}; u= a[14]/2.; for(n=13;n>=0;n--) { u*=t; u+=a[n];} v= b[13]; for(n=12;n>=0;n--) { v*=t; v+=b[n];} // u=a[0]+t*(a[1]+t*(a[2]+t*a[3])); // v=b[0]+t*(b[1]+t*(b[2]+t*b[3])); return q*(s*u + c*v*.5/z); }
z_type BesselY0b(z_type z){ DB x,y; x=Re(z); y=Im(z); if( x<0 ){ if(y<0){ return BesselY0B(-z)- 2.*I*BesselJ0(-z) ;} else { return BesselY0B(-z)+ 2.*I*BesselJ0(-z) ;} } return BesselY0B(z); }
z_type BesselY0(z_type z){ DB x,y; x=Re(z); y=fabs(Im(z))-2.5; if(x*x+y*y<13.*13.) return BesselY0o(z); return BesselY0b(z); }
// The code above is from http://tori.ils.uec.ac.jp/TORI/index.php/Bessely0.cin