22 static double bessj0(
double x) {
24 double xx, y, ans, ans1, ans2;
26 if((ax =
fabs(x)) < 8.0) {
28 ans1 = 57568490574.0 + y * (-13362590354.0 + y * (651619640.7
29 + y * (-11214424.18 + y * (77392.33017 + y * (-184.9052456)))));
30 ans2 = 57568490411.0 + y * (1029532985.0 + y * (9494680.718
31 + y * (59272.64853 + y * (267.8532712 + y * 1.0))));
36 xx = ax - 0.785398164;
37 ans1 = 1.0 + y * (-0.1098628627e-2 + y * (0.2734510407e-4
38 + y * (-0.2073370639e-5 + y * 0.2093887211e-6)));
39 ans2 = -0.1562499995e-1 + y * (0.1430488765e-3
40 + y * (-0.6911147651e-5 + y * (0.7621095161e-6
41 - y * 0.934935152e-7)));
42 ans =
sqrt(0.636619772 / ax) * (
cos(xx) * ans1 - z *
sin(xx) * ans2);
47 static double bessj1(
double x) {
49 double xx, y, ans, ans1, ans2;
51 if((ax =
fabs(x)) < 8.0) {
53 ans1 = x * (72362614232.0 + y * (-7895059235.0 + y * (242396853.1
54 + y * (-2972611.439 + y * (15704.48260 + y * (-30.16036606))))));
55 ans2 = 144725228442.0 + y * (2300535178.0 + y * (18583304.74
56 + y * (99447.43394 + y * (376.9991397 + y * 1.0))));
61 xx = ax - 2.356194491;
62 ans1 = 1.0 + y * (0.183105e-2 + y * (-0.3516396496e-4
63 + y * (0.2457520174e-5 + y * (-0.240337019e-6))));
64 ans2 = 0.04687499995 + y * (-0.2002690873e-3
65 + y * (0.8449199096e-5 + y * (-0.88228987e-6
66 + y * 0.105787412e-6)));
67 ans =
sqrt(0.636619772 / ax) * (
cos(xx) * ans1 - z *
sin(xx) * ans2);
68 if(x < 0.0) ans = -ans;
85 double ax, bj, bjm, bjp,
sum, tox, ans;
88 fprintf(stderr,
"Illegal argument bessel function.\n");
91 if(n == 0)
return bessj0(x);
92 if(n == 1)
return bessj1(x);
95 if(ax == 0.0)
return 0.0;
96 else if(ax > (
double) n) {
100 for(j = 1; j <
n; j++) {
101 bjp = j * tox * bj - bjm;
108 m = 2 * ((n + (int)
sqrt(
ACC * n)) / 2);
110 bjp = ans = sum = 0.0;
112 for(j = m; j > 0; j--) {
113 bjm = j * tox * bj - bjp;
124 if(j == n) ans = bjp;
126 sum = 2.0 * sum - bj;
129 return x < 0.0 && n % 2 == 1 ? -ans : ans;
150 t = 1.0 / (1.0 + 0.5 * z);
151 ans = t *
exp(-z * z - 1.26551223 +
160 t * 0.17087277)))))))));
161 return x >= 0.0 ? ans : 2.0 - ans;
double bessj(int n, double x)
PETE_TUTree< FnFabs, typename T::PETE_Expr_t > fabs(const PETE_Expr< T > &l)
Tps< T > sin(const Tps< T > &x)
Sine.
Tps< T > exp(const Tps< T > &x)
Exponential.
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
Tps< T > sqrt(const Tps< T > &x)
Square root.
Tps< T > cos(const Tps< T > &x)
Cosine.