|
|
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.3 (Berkeley) 9/22/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 "mathimpl.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: ! 56: if(n<0){ ! 57: n = -n; ! 58: x = -x; ! 59: } ! 60: if(n==0) return(j0(x)); ! 61: if(n==1) return(j1(x)); ! 62: if(x == 0.) return(0.); ! 63: if(n>x) goto recurs; ! 64: ! 65: a = j0(x); ! 66: b = j1(x); ! 67: for(i=1;i<n;i++){ ! 68: temp = b; ! 69: b = (2.*i/x)*b - a; ! 70: a = temp; ! 71: } ! 72: return(b); ! 73: ! 74: recurs: ! 75: xsq = x*x; ! 76: for(t=0,i=n+16;i>n;i--){ ! 77: t = xsq/(2.*i - t); ! 78: } ! 79: t = x/(2.*n-t); ! 80: ! 81: a = t; ! 82: b = 1; ! 83: for(i=n-1;i>0;i--){ ! 84: temp = b; ! 85: b = (2.*i/x)*b - a; ! 86: a = temp; ! 87: } ! 88: return(t*j0(x)/b); ! 89: } ! 90: ! 91: double ! 92: yn(n,x) int n; double x;{ ! 93: int i; ! 94: int sign; ! 95: double a, b, temp; ! 96: ! 97: if (x <= 0) { ! 98: #if defined(vax)||defined(tahoe) ! 99: return(infnan(EDOM)); /* NaN */ ! 100: #else /* defined(vax)||defined(tahoe) */ ! 101: return(zero/zero); /* IEEE machines: invalid operation */ ! 102: #endif /* defined(vax)||defined(tahoe) */ ! 103: } ! 104: sign = 1; ! 105: if(n<0){ ! 106: n = -n; ! 107: if(n%2 == 1) sign = -1; ! 108: } ! 109: if(n==0) return(y0(x)); ! 110: if(n==1) return(sign*y1(x)); ! 111: ! 112: a = y0(x); ! 113: b = y1(x); ! 114: for(i=1;i<n;i++){ ! 115: temp = b; ! 116: b = (2.*i/x)*b - a; ! 117: a = temp; ! 118: } ! 119: return(sign*b); ! 120: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.