Sindbad~EG File Manager

Current Path : /usr/home/beeson/MathXpert/deval/
Upload File :
Current File : /usr/home/beeson/MathXpert/deval/bessel.c

/* 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