void airy(float x, float *ai, float *bi, float *aip, float *bip) { void bessik(float x, float xnu, float *ri, float *rk, float *rip, float *rkp); void bessjy(float x, float xnu, float *rj, float *ry, float *rjp, float *ryp); float absx,ri,rip,rj,rjp,rk,rkp,rootx,ry,ryp,z; absx=fabs(x); rootx=sqrt(absx); z=TWOTHR*absx*rootx; if (x > 0.0) { bessik(z,THIRD,&ri,&rk,&rip,&rkp); *ai=rootx*ONOVRT*rk/PI; *bi=rootx*(rk/PI+2.0*ONOVRT*ri); bessik(z,TWOTHR,&ri,&rk,&rip,&rkp); *aip = -x*ONOVRT*rk/PI; *bip=x*(rk/PI+2.0*ONOVRT*ri); } else if (x < 0.0) { bessjy(z,THIRD,&rj,&ry,&rjp,&ryp); *ai=0.5*rootx*(rj-ONOVRT*ry); *bi = -0.5*rootx*(ry+ONOVRT*rj); bessjy(z,TWOTHR,&rj,&ry,&rjp,&ryp); *aip=0.5*absx*(ONOVRT*ry+rj); *bip=0.5*absx*(ONOVRT*rj-ry); } else { *ai=0.35502805; *bi=(*ai)/ONOVRT; *aip = -0.25881940; *bip = -(*aip)/ONOVRT; } }
int main(void) { char txt[MAXSTR]; int i,nval; float rj,ry,rjp,ryp,x,xnu,xrj,xry,xrjp,xryp; FILE *fp; if ((fp = fopen("fncval.dat","r")) == NULL) nrerror("Data file fncval.dat not found\n"); fgets(txt,MAXSTR,fp); while (strncmp(txt,"Ordinary Bessel Functions",25)) { fgets(txt,MAXSTR,fp); if (feof(fp)) nrerror("Data not found in fncval.dat\n"); } fscanf(fp,"%d %*s",&nval); printf("\n%s\n",txt); printf("%5s %7s\n%14s %16s %17s %16s\n%14s %16s %17s %16s\n", "xnu","x","rj","ry","rjp","ryp","xrj","xry","xrjp","xryp"); for (i=1; i<=nval; i++) { fscanf(fp,"%f %f %f %f %f %f",&xnu,&x,&rj,&ry,&rjp,&ryp); bessjy(x,xnu,&xrj,&xry,&xrjp,&xryp); printf("%5.2f %5.2f\n\t%16.6e %16.6e %16.6e %16.6e\n",xnu,x,rj,ry,rjp,ryp); printf("\t%16.6e %16.6e %16.6e %16.6e\n",xrj,xry,xrjp,xryp); } fclose(fp); return 0; }
void mbesselall (header *hdx) { header *st=hdx,*hd=nextof(hdx); double bj,by,bdj,bdy; hd=getvalue(hd); if (error) return; hdx=getvalue(hdx); if (error) return; if (hd->type!=s_real || hdx->type!=s_real) wrong_arg_in("besselall"); bessjy(*realof(hd),*realof(hdx),&bj,&by,&bdj,&bdy); if (error) return; newram=(char *)st; new_real(bj,""); if (error) return; new_real(by,""); if (error) return; new_real(bdj,""); if (error) return; new_real(bdy,""); }
void sphbes(int n, float x, float *sj, float *sy, float *sjp, float *syp) { void bessjy(float x, float xnu, float *rj, float *ry, float *rjp, float *ryp); void nrerror(char error_text[]); float factor,order,rj,rjp,ry,ryp; if (n < 0 || x <= 0.0) nrerror("bad arguments in sphbes"); order=n+0.5; bessjy(x,order,&rj,&ry,&rjp,&ryp); factor=RTPIO2/sqrt(x); *sj=factor*rj; *sy=factor*ry; *sjp=factor*rjp-(*sj)/(2.0*x); *syp=factor*ryp-(*sy)/(2.0*x); }
double bessj3_5(double x) { double rj, ry, rjp, ryp; bessjy(x, 3.5, &rj, &ry, &rjp, &ryp); return rj; }
void bessely (double *x, double *k, double *r) { double h1,h2; bessjy(*k,*x,&h1,r,&h2,&h2); }