jn.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /* jn.c
  2. *
  3. * Bessel function of integer order
  4. *
  5. *
  6. *
  7. * SYNOPSIS:
  8. *
  9. * int n;
  10. * double x, y, jn();
  11. *
  12. * y = jn( n, x );
  13. *
  14. *
  15. *
  16. * DESCRIPTION:
  17. *
  18. * Returns Bessel function of order n, where n is a
  19. * (possibly negative) integer.
  20. *
  21. * The ratio of jn(x) to j0(x) is computed by backward
  22. * recurrence. First the ratio jn/jn-1 is found by a
  23. * continued fraction expansion. Then the recurrence
  24. * relating successive orders is applied until j0 or j1 is
  25. * reached.
  26. *
  27. * If n = 0 or 1 the routine for j0 or j1 is called
  28. * directly.
  29. *
  30. *
  31. *
  32. * ACCURACY:
  33. *
  34. * Absolute error:
  35. * arithmetic range # trials peak rms
  36. * DEC 0, 30 5500 6.9e-17 9.3e-18
  37. * IEEE 0, 30 5000 4.4e-16 7.9e-17
  38. *
  39. *
  40. * Not suitable for large n or x. Use jv() instead.
  41. *
  42. */
  43. /* jn.c
  44. Cephes Math Library Release 2.8: June, 2000
  45. Copyright 1984, 1987, 2000 by Stephen L. Moshier
  46. */
  47. #include "mconf.h"
  48. #ifdef ANSIPROT
  49. extern double fabs(double);
  50. extern double j0(double);
  51. extern double j1(double);
  52. #else
  53. double fabs(), j0(), j1();
  54. #endif
  55. extern double MACHEP;
  56. double jn(n, x) int n;
  57. double x;
  58. {
  59. double pkm2, pkm1, pk, xk, r, ans;
  60. int k, sign;
  61. if (n < 0) {
  62. n = -n;
  63. if ((n & 1) == 0) /* -1**n */
  64. sign = 1;
  65. else
  66. sign = -1;
  67. } else
  68. sign = 1;
  69. if (x < 0.0) {
  70. if (n & 1)
  71. sign = -sign;
  72. x = -x;
  73. }
  74. if (n == 0)
  75. return (sign * j0(x));
  76. if (n == 1)
  77. return (sign * j1(x));
  78. if (n == 2)
  79. return (sign * (2.0 * j1(x) / x - j0(x)));
  80. if (x < MACHEP)
  81. return (0.0);
  82. /* continued fraction */
  83. #ifdef DEC
  84. k = 56;
  85. #else
  86. k = 53;
  87. #endif
  88. pk = 2 * (n + k);
  89. ans = pk;
  90. xk = x * x;
  91. do {
  92. pk -= 2.0;
  93. ans = pk - (xk / ans);
  94. } while (--k > 0);
  95. ans = x / ans;
  96. /* backward recurrence */
  97. pk = 1.0;
  98. pkm1 = 1.0 / ans;
  99. k = n - 1;
  100. r = 2 * k;
  101. do {
  102. pkm2 = (pkm1 * r - pk * x) / x;
  103. pk = pkm1;
  104. pkm1 = pkm2;
  105. r -= 2.0;
  106. } while (--k > 0);
  107. if (fabs(pk) > fabs(pkm1))
  108. ans = j1(x) / pk;
  109. else
  110. ans = j0(x) / pkm1;
  111. return (sign * ans);
  112. }