|
|
1.1 root 1: /*
2: floating point Bessel's function of
3: the first and second kinds and of
4: integer order.
5:
6: int n;
7: double x;
8: besjn(n,x);
9:
10: returns the value of Jn(x) for all
11: integer values of n and all real values
12: of x.
13:
14: There are no error returns.
15: Calls besj0, besj1.
16:
17: For n=0, besj0(x) is called,
18: for n=1, besj1(x) is called,
19: for n<x, forward recursion us used starting
20: from values of besj0(x) and besj1(x).
21: for n>x, a continued fraction approximation to
22: j(n,x)/j(n-1,x) is evaluated and then backward
23: recursion is used starting from a supposed value
24: for j(n,x). The resulting value of j(0,x) is
25: compared with the actual value to correct the
26: supposed value of j(n,x).
27:
28: yn(n,x) is similar in all respects, except
29: that forward recursion is used for all
30: values of n>1.
31: */
32:
33: #include <math.h>
34: #include <errno.h>
35:
36: int errno;
37:
38: double
39: besjn(n,x) int n; double x;{
40: int i;
41: double a, b, temp;
42: double xsq, t;
43: double besj0(), besj1();
44:
45: if(n<0){
46: n = -n;
47: x = -x;
48: }
49: if(n==0) return(besj0(x));
50: if(n==1) return(besj1(x));
51: if(x == 0.) return(0.);
52: if(n>x) goto recurs;
53:
54: a = besj0(x);
55: b = besj1(x);
56: for(i=1;i<n;i++){
57: temp = b;
58: b = (2.*i/x)*b - a;
59: a = temp;
60: }
61: return(b);
62:
63: recurs:
64: xsq = x*x;
65: for(t=0,i=n+16;i>n;i--){
66: t = xsq/(2.*i - t);
67: }
68: t = x/(2.*n-t);
69:
70: a = t;
71: b = 1;
72: for(i=n-1;i>0;i--){
73: temp = b;
74: b = (2.*i/x)*b - a;
75: a = temp;
76: }
77: return(t*besj0(x)/b);
78: }
79:
80: double
81: besyn(n,x) int n; double x;{
82: int i;
83: int sign;
84: double a, b, temp;
85: double besy0(), besy1();
86:
87: if (x <= 0) {
88: errno = EDOM;
89: return(-HUGE);
90: }
91: sign = 1;
92: if(n<0){
93: n = -n;
94: if(n%2 == 1) sign = -1;
95: }
96: if(n==0) return(besy0(x));
97: if(n==1) return(sign*besy1(x));
98:
99: a = besy0(x);
100: b = besy1(x);
101: for(i=1;i<n;i++){
102: temp = b;
103: b = (2.*i/x)*b - a;
104: a = temp;
105: }
106: return(sign*b);
107: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.