|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)jn.c 5.2 (Berkeley) 4/29/88"; ! 9: #endif /* not lint */ ! 10: ! 11: /* ! 12: floating point Bessel's function of ! 13: the first and second kinds and of ! 14: integer order. ! 15: ! 16: int n; ! 17: double x; ! 18: jn(n,x); ! 19: ! 20: returns the value of Jn(x) for all ! 21: integer values of n and all real values ! 22: of x. ! 23: ! 24: There are no error returns. ! 25: Calls j0, j1. ! 26: ! 27: For n=0, j0(x) is called, ! 28: for n=1, j1(x) is called, ! 29: for n<x, forward recursion us used starting ! 30: from values of j0(x) and j1(x). ! 31: for n>x, a continued fraction approximation to ! 32: j(n,x)/j(n-1,x) is evaluated and then backward ! 33: recursion is used starting from a supposed value ! 34: for j(n,x). The resulting value of j(0,x) is ! 35: compared with the actual value to correct the ! 36: supposed value of j(n,x). ! 37: ! 38: yn(n,x) is similar in all respects, except ! 39: that forward recursion is used for all ! 40: values of n>1. ! 41: */ ! 42: ! 43: #include <math.h> ! 44: #if defined(vax)||defined(tahoe) ! 45: #include <errno.h> ! 46: #else /* defined(vax)||defined(tahoe) */ ! 47: static double zero = 0.e0; ! 48: #endif /* defined(vax)||defined(tahoe) */ ! 49: ! 50: double ! 51: jn(n,x) int n; double x;{ ! 52: int i; ! 53: double a, b, temp; ! 54: double xsq, t; ! 55: double j0(), j1(); ! 56: ! 57: if(n<0){ ! 58: n = -n; ! 59: x = -x; ! 60: } ! 61: if(n==0) return(j0(x)); ! 62: if(n==1) return(j1(x)); ! 63: if(x == 0.) return(0.); ! 64: if(n>x) goto recurs; ! 65: ! 66: a = j0(x); ! 67: b = j1(x); ! 68: for(i=1;i<n;i++){ ! 69: temp = b; ! 70: b = (2.*i/x)*b - a; ! 71: a = temp; ! 72: } ! 73: return(b); ! 74: ! 75: recurs: ! 76: xsq = x*x; ! 77: for(t=0,i=n+16;i>n;i--){ ! 78: t = xsq/(2.*i - t); ! 79: } ! 80: t = x/(2.*n-t); ! 81: ! 82: a = t; ! 83: b = 1; ! 84: for(i=n-1;i>0;i--){ ! 85: temp = b; ! 86: b = (2.*i/x)*b - a; ! 87: a = temp; ! 88: } ! 89: return(t*j0(x)/b); ! 90: } ! 91: ! 92: double ! 93: yn(n,x) int n; double x;{ ! 94: int i; ! 95: int sign; ! 96: double a, b, temp; ! 97: double y0(), y1(); ! 98: ! 99: if (x <= 0) { ! 100: #if defined(vax)||defined(tahoe) ! 101: extern double infnan(); ! 102: return(infnan(EDOM)); /* NaN */ ! 103: #else /* defined(vax)||defined(tahoe) */ ! 104: return(zero/zero); /* IEEE machines: invalid operation */ ! 105: #endif /* defined(vax)||defined(tahoe) */ ! 106: } ! 107: sign = 1; ! 108: if(n<0){ ! 109: n = -n; ! 110: if(n%2 == 1) sign = -1; ! 111: } ! 112: if(n==0) return(y0(x)); ! 113: if(n==1) return(sign*y1(x)); ! 114: ! 115: a = y0(x); ! 116: b = y1(x); ! 117: for(i=1;i<n;i++){ ! 118: temp = b; ! 119: b = (2.*i/x)*b - a; ! 120: a = temp; ! 121: } ! 122: return(sign*b); ! 123: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.