Sindbad~EG File Manager
/* code from Numerical Recipes for Bessel functions Jn and Yn */
/*
11.17.90 created file, importing Num Rec code
but with changed prototypes and error handling
11.23.91 added bessj and bessy
11.24.91 added assert(x > 0.0) in y0, y1, bessy
1.7.97 changed int j to unsigned j two places
5.15.15 added include special.h and removed public prototypes
*/
#include <math.h>
#include <assert.h>
#include "special.h"
/*_______________________________________________________________*/
double J0(double x)
/* compute Bessel function */
{
double ax,z;
double xx,y,ans,ans1,ans2;
if ((ax=fabs(x)) < 8.0)
{ 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
{ 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.934935152e-7)));
ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2);
}
return ans;
}
/*_______________________________________________________________*/
double J1(double x)
/* compute Bessel function */
{
double ax,z;
double xx,y,ans,ans1,ans2;
if ((ax=fabs(x)) < 8.0)
{ 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
{
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;
}
/*______________________________________________________________________*/
#define ACC 40.0
#define BIGNO 1.0e10
#define BIGNI 1.0e-10
double bessj(unsigned n,double x)
{
unsigned j;
int jsum,m;
double ax,bj,bjm,bjp,sum,tox,ans;
assert(n>=2);
ax=fabs(x);
if (ax == 0.0)
return 0.0;
else if (ax > (double) n)
{ tox=2.0/ax;
bjm=J0(ax);
bj=J1(ax);
for (j=1;j<n;j++)
{ bjp=j*tox*bj-bjm;
bjm=bj;
bj=bjp;
}
ans=bj;
}
else
{ tox=2.0/ax;
m=2*((n+(int) sqrt(ACC*n))/2);
jsum=0;
bjp=ans=sum=0.0;
bj=1.0;
for (j=m;j>0;j--)
{ bjm=j*tox*bj-bjp;
bjp=bj;
bj=bjm;
if (fabs(bj) > BIGNO)
{ bj *= BIGNI;
bjp *= BIGNI;
ans *= BIGNI;
sum *= BIGNI;
}
if (jsum) sum += bj;
jsum=!jsum;
if (j == n) ans=bjp;
}
sum=2.0*sum-bj;
ans /= sum;
}
return ((x < 0.0 && n&1) ? -ans : ans);
}
#undef ACC
#undef BIGNO
#undef BIGNI
/*______________________________________________________________________*/
double Y0(double x)
{ double z;
double xx,y,ans,ans1,ans2;
assert(x > 0.0); /* else call to log below is going to crash */
if (x < 8.0)
{ 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*J0(x)*log(x);
}
else
{ 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;
}
/*_______________________________________________________________________*/
double Y1(double x)
{ double z;
double xx,y,ans,ans1,ans2;
assert(x > 0.0); /* else call to log below is going to crash */
if (x < 8.0)
{ 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)))));
ans=(ans1/ans2)+0.636619772*(J1(x)*log(x)-1.0/x);
}
else
{ 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;
}
/*___________________________________________________________________*/
double bessy(unsigned n,double x)
{ unsigned j;
double by,bym,byp,tox;
assert(n >= 2);
assert(x > 0.0);
tox=2.0/x;
by=Y1(x);
bym=Y0(x);
for (j=1;j<n;j++)
{ byp=j*tox*by-bym;
bym=by;
by=byp;
}
return by;
}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists