psifn.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. *DECK PSIFN
  2. SUBROUTINE PSIFN (X, N, KODE, M, ANS, NZ, IERR)
  3. C***BEGIN PROLOGUE PSIFN
  4. C***PURPOSE Compute derivatives of the Psi function.
  5. C***LIBRARY SLATEC
  6. C***CATEGORY C7C
  7. C***TYPE SINGLE PRECISION (PSIFN-S, DPSIFN-D)
  8. C***KEYWORDS DERIVATIVES OF THE GAMMA FUNCTION, POLYGAMMA FUNCTION,
  9. C PSI FUNCTION
  10. C***AUTHOR Amos, D. E., (SNLA)
  11. C***DESCRIPTION
  12. C
  13. C The following definitions are used in PSIFN:
  14. C
  15. C Definition 1
  16. C PSI(X) = d/dx (ln(GAMMA(X)), the first derivative of
  17. C the LOG GAMMA function.
  18. C Definition 2
  19. C K K
  20. C PSI(K,X) = d /dx (PSI(X)), the K-th derivative of PSI(X).
  21. C ___________________________________________________________________
  22. C PSIFN computes a sequence of SCALED derivatives of
  23. C the PSI function; i.e. for fixed X and M it computes
  24. C the M-member sequence
  25. C
  26. C ((-1)**(K+1)/GAMMA(K+1))*PSI(K,X)
  27. C for K = N,...,N+M-1
  28. C
  29. C where PSI(K,X) is as defined above. For KODE=1, PSIFN returns
  30. C the scaled derivatives as described. KODE=2 is operative only
  31. C when K=0 and in that case PSIFN returns -PSI(X) + LN(X). That
  32. C is, the logarithmic behavior for large X is removed when KODE=1
  33. C and K=0. When sums or differences of PSI functions are computed
  34. C the logarithmic terms can be combined analytically and computed
  35. C separately to help retain significant digits.
  36. C
  37. C Note that CALL PSIFN(X,0,1,1,ANS) results in
  38. C ANS = -PSI(X)
  39. C
  40. C Input
  41. C X - Argument, X .gt. 0.0E0
  42. C N - First member of the sequence, 0 .le. N .le. 100
  43. C N=0 gives ANS(1) = -PSI(X) for KODE=1
  44. C -PSI(X)+LN(X) for KODE=2
  45. C KODE - Selection parameter
  46. C KODE=1 returns scaled derivatives of the PSI
  47. C function.
  48. C KODE=2 returns scaled derivatives of the PSI
  49. C function EXCEPT when N=0. In this case,
  50. C ANS(1) = -PSI(X) + LN(X) is returned.
  51. C M - Number of members of the sequence, M .ge. 1
  52. C
  53. C Output
  54. C ANS - A vector of length at least M whose first M
  55. C components contain the sequence of derivatives
  56. C scaled according to KODE.
  57. C NZ - Underflow flag
  58. C NZ.eq.0, A normal return
  59. C NZ.ne.0, Underflow, last NZ components of ANS are
  60. C set to zero, ANS(M-K+1)=0.0, K=1,...,NZ
  61. C IERR - Error flag
  62. C IERR=0, A normal return, computation completed
  63. C IERR=1, Input error, no computation
  64. C IERR=2, Overflow, X too small or N+M-1 too
  65. C large or both
  66. C IERR=3, Error, N too large. Dimensioned
  67. C array TRMR(NMAX) is not large enough for N
  68. C
  69. C The nominal computational accuracy is the maximum of unit
  70. C roundoff (=R1MACH(4)) and 1.0E-18 since critical constants
  71. C are given to only 18 digits.
  72. C
  73. C DPSIFN is the Double Precision version of PSIFN.
  74. C
  75. C *Long Description:
  76. C
  77. C The basic method of evaluation is the asymptotic expansion
  78. C for large X.ge.XMIN followed by backward recursion on a two
  79. C term recursion relation
  80. C
  81. C W(X+1) + X**(-N-1) = W(X).
  82. C
  83. C This is supplemented by a series
  84. C
  85. C SUM( (X+K)**(-N-1) , K=0,1,2,... )
  86. C
  87. C which converges rapidly for large N. Both XMIN and the
  88. C number of terms of the series are calculated from the unit
  89. C roundoff of the machine environment.
  90. C
  91. C***REFERENCES Handbook of Mathematical Functions, National Bureau
  92. C of Standards Applied Mathematics Series 55, edited
  93. C by M. Abramowitz and I. A. Stegun, equations 6.3.5,
  94. C 6.3.18, 6.4.6, 6.4.9 and 6.4.10, pp.258-260, 1964.
  95. C D. E. Amos, A portable Fortran subroutine for
  96. C derivatives of the Psi function, Algorithm 610, ACM
  97. C Transactions on Mathematical Software 9, 4 (1983),
  98. C pp. 494-502.
  99. C***ROUTINES CALLED I1MACH, R1MACH
  100. C***REVISION HISTORY (YYMMDD)
  101. C 820601 DATE WRITTEN
  102. C 890531 Changed all specific intrinsics to generic. (WRB)
  103. C 890531 REVISION DATE from Version 3.2
  104. C 891214 Prologue converted to Version 4.0 format. (BAB)
  105. C 920501 Reformatted the REFERENCES section. (WRB)
  106. C***END PROLOGUE PSIFN
  107. INTEGER I, IERR, J, K, KODE, M, MM, MX, N, NMAX, NN, NP, NX, NZ
  108. INTEGER I1MACH
  109. REAL ANS, ARG, B, DEN, ELIM, EPS, FLN, FN, FNP, FNS, FX, RLN,
  110. * RXSQ, R1M4, R1M5, S, SLOPE, T, TA, TK, TOL, TOLS, TRM, TRMR,
  111. * TSS, TST, TT, T1, T2, WDTOL, X, XDMLN, XDMY, XINC, XLN, XM,
  112. * XMIN, XQ, YINT
  113. REAL R1MACH
  114. DIMENSION B(22), TRM(22), TRMR(100), ANS(*)
  115. SAVE NMAX, B
  116. DATA NMAX /100/
  117. C-----------------------------------------------------------------------
  118. C BERNOULLI NUMBERS
  119. C-----------------------------------------------------------------------
  120. DATA B(1), B(2), B(3), B(4), B(5), B(6), B(7), B(8), B(9), B(10),
  121. * B(11), B(12), B(13), B(14), B(15), B(16), B(17), B(18), B(19),
  122. * B(20), B(21), B(22) /1.00000000000000000E+00,
  123. * -5.00000000000000000E-01,1.66666666666666667E-01,
  124. * -3.33333333333333333E-02,2.38095238095238095E-02,
  125. * -3.33333333333333333E-02,7.57575757575757576E-02,
  126. * -2.53113553113553114E-01,1.16666666666666667E+00,
  127. * -7.09215686274509804E+00,5.49711779448621554E+01,
  128. * -5.29124242424242424E+02,6.19212318840579710E+03,
  129. * -8.65802531135531136E+04,1.42551716666666667E+06,
  130. * -2.72982310678160920E+07,6.01580873900642368E+08,
  131. * -1.51163157670921569E+10,4.29614643061166667E+11,
  132. * -1.37116552050883328E+13,4.88332318973593167E+14,
  133. * -1.92965793419400681E+16/
  134. C
  135. C***FIRST EXECUTABLE STATEMENT PSIFN
  136. IERR = 0
  137. NZ=0
  138. IF (X.LE.0.0E0) IERR=1
  139. IF (N.LT.0) IERR=1
  140. IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
  141. IF (M.LT.1) IERR=1
  142. IF (IERR.NE.0) RETURN
  143. MM=M
  144. NX = MIN(-I1MACH(12),I1MACH(13))
  145. R1M5 = R1MACH(5)
  146. R1M4 = R1MACH(4)*0.5E0
  147. WDTOL = MAX(R1M4,0.5E-18)
  148. C-----------------------------------------------------------------------
  149. C ELIM = APPROXIMATE EXPONENTIAL OVER AND UNDERFLOW LIMIT
  150. C-----------------------------------------------------------------------
  151. ELIM = 2.302E0*(NX*R1M5-3.0E0)
  152. XLN = LOG(X)
  153. 41 CONTINUE
  154. NN = N + MM - 1
  155. FN = NN
  156. FNP = FN + 1.0E0
  157. T = FNP*XLN
  158. C-----------------------------------------------------------------------
  159. C OVERFLOW AND UNDERFLOW TEST FOR SMALL AND LARGE X
  160. C-----------------------------------------------------------------------
  161. IF (ABS(T).GT.ELIM) GO TO 290
  162. IF (X.LT.WDTOL) GO TO 260
  163. C-----------------------------------------------------------------------
  164. C COMPUTE XMIN AND THE NUMBER OF TERMS OF THE SERIES, FLN+1
  165. C-----------------------------------------------------------------------
  166. RLN = R1M5*I1MACH(11)
  167. RLN = MIN(RLN,18.06E0)
  168. FLN = MAX(RLN,3.0E0) - 3.0E0
  169. YINT = 3.50E0 + 0.40E0*FLN
  170. SLOPE = 0.21E0 + FLN*(0.0006038E0*FLN+0.008677E0)
  171. XM = YINT + SLOPE*FN
  172. MX = INT(XM) + 1
  173. XMIN = MX
  174. IF (N.EQ.0) GO TO 50
  175. XM = -2.302E0*RLN - MIN(0.0E0,XLN)
  176. FNS = N
  177. ARG = XM/FNS
  178. ARG = MIN(0.0E0,ARG)
  179. EPS = EXP(ARG)
  180. XM = 1.0E0 - EPS
  181. IF (ABS(ARG).LT.1.0E-3) XM = -ARG
  182. FLN = X*XM/EPS
  183. XM = XMIN - X
  184. IF (XM.GT.7.0E0 .AND. FLN.LT.15.0E0) GO TO 200
  185. 50 CONTINUE
  186. XDMY = X
  187. XDMLN = XLN
  188. XINC = 0.0E0
  189. IF (X.GE.XMIN) GO TO 60
  190. NX = INT(X)
  191. XINC = XMIN - NX
  192. XDMY = X + XINC
  193. XDMLN = LOG(XDMY)
  194. 60 CONTINUE
  195. C-----------------------------------------------------------------------
  196. C GENERATE W(N+MM-1,X) BY THE ASYMPTOTIC EXPANSION
  197. C-----------------------------------------------------------------------
  198. T = FN*XDMLN
  199. T1 = XDMLN + XDMLN
  200. T2 = T + XDMLN
  201. TK = MAX(ABS(T),ABS(T1),ABS(T2))
  202. IF (TK.GT.ELIM) GO TO 380
  203. TSS = EXP(-T)
  204. TT = 0.5E0/XDMY
  205. T1 = TT
  206. TST = WDTOL*TT
  207. IF (NN.NE.0) T1 = TT + 1.0E0/FN
  208. RXSQ = 1.0E0/(XDMY*XDMY)
  209. TA = 0.5E0*RXSQ
  210. T = FNP*TA
  211. S = T*B(3)
  212. IF (ABS(S).LT.TST) GO TO 80
  213. TK = 2.0E0
  214. DO 70 K=4,22
  215. T = T*((TK+FN+1.0E0)/(TK+1.0E0))*((TK+FN)/(TK+2.0E0))*RXSQ
  216. TRM(K) = T*B(K)
  217. IF (ABS(TRM(K)).LT.TST) GO TO 80
  218. S = S + TRM(K)
  219. TK = TK + 2.0E0
  220. 70 CONTINUE
  221. 80 CONTINUE
  222. S = (S+T1)*TSS
  223. IF (XINC.EQ.0.0E0) GO TO 100
  224. C-----------------------------------------------------------------------
  225. C BACKWARD RECUR FROM XDMY TO X
  226. C-----------------------------------------------------------------------
  227. NX = INT(XINC)
  228. NP = NN + 1
  229. IF (NX.GT.NMAX) GO TO 390
  230. IF (NN.EQ.0) GO TO 160
  231. XM = XINC - 1.0E0
  232. FX = X + XM
  233. C-----------------------------------------------------------------------
  234. C THIS LOOP SHOULD NOT BE CHANGED. FX IS ACCURATE WHEN X IS SMALL
  235. C-----------------------------------------------------------------------
  236. DO 90 I=1,NX
  237. TRMR(I) = FX**(-NP)
  238. S = S + TRMR(I)
  239. XM = XM - 1.0E0
  240. FX = X + XM
  241. 90 CONTINUE
  242. 100 CONTINUE
  243. ANS(MM) = S
  244. IF (FN.EQ.0.0E0) GO TO 180
  245. C-----------------------------------------------------------------------
  246. C GENERATE LOWER DERIVATIVES, J.LT.N+MM-1
  247. C-----------------------------------------------------------------------
  248. IF (MM.EQ.1) RETURN
  249. DO 150 J=2,MM
  250. FNP = FN
  251. FN = FN - 1.0E0
  252. TSS = TSS*XDMY
  253. T1 = TT
  254. IF (FN.NE.0.0E0) T1 = TT + 1.0E0/FN
  255. T = FNP*TA
  256. S = T*B(3)
  257. IF (ABS(S).LT.TST) GO TO 120
  258. TK = 3.0E0 + FNP
  259. DO 110 K=4,22
  260. TRM(K) = TRM(K)*FNP/TK
  261. IF (ABS(TRM(K)).LT.TST) GO TO 120
  262. S = S + TRM(K)
  263. TK = TK + 2.0E0
  264. 110 CONTINUE
  265. 120 CONTINUE
  266. S = (S+T1)*TSS
  267. IF (XINC.EQ.0.0E0) GO TO 140
  268. IF (FN.EQ.0.0E0) GO TO 160
  269. XM = XINC - 1.0E0
  270. FX = X + XM
  271. DO 130 I=1,NX
  272. TRMR(I) = TRMR(I)*FX
  273. S = S + TRMR(I)
  274. XM = XM - 1.0E0
  275. FX = X + XM
  276. 130 CONTINUE
  277. 140 CONTINUE
  278. MX = MM - J + 1
  279. ANS(MX) = S
  280. IF (FN.EQ.0.0E0) GO TO 180
  281. 150 CONTINUE
  282. RETURN
  283. C-----------------------------------------------------------------------
  284. C RECURSION FOR N = 0
  285. C-----------------------------------------------------------------------
  286. 160 CONTINUE
  287. DO 170 I=1,NX
  288. S = S + 1.0E0/(X+NX-I)
  289. 170 CONTINUE
  290. 180 CONTINUE
  291. IF (KODE.EQ.2) GO TO 190
  292. ANS(1) = S - XDMLN
  293. RETURN
  294. 190 CONTINUE
  295. IF (XDMY.EQ.X) RETURN
  296. XQ = XDMY/X
  297. ANS(1) = S - LOG(XQ)
  298. RETURN
  299. C-----------------------------------------------------------------------
  300. C COMPUTE BY SERIES (X+K)**(-(N+1)) , K=0,1,2,...
  301. C-----------------------------------------------------------------------
  302. 200 CONTINUE
  303. NN = INT(FLN) + 1
  304. NP = N + 1
  305. T1 = (FNS+1.0E0)*XLN
  306. T = EXP(-T1)
  307. S = T
  308. DEN = X
  309. DO 210 I=1,NN
  310. DEN = DEN + 1.0E0
  311. TRM(I) = DEN**(-NP)
  312. S = S + TRM(I)
  313. 210 CONTINUE
  314. ANS(1) = S
  315. IF (N.NE.0) GO TO 220
  316. IF (KODE.EQ.2) ANS(1) = S + XLN
  317. 220 CONTINUE
  318. IF (MM.EQ.1) RETURN
  319. C-----------------------------------------------------------------------
  320. C GENERATE HIGHER DERIVATIVES, J.GT.N
  321. C-----------------------------------------------------------------------
  322. TOL = WDTOL/5.0E0
  323. DO 250 J=2,MM
  324. T = T/X
  325. S = T
  326. TOLS = T*TOL
  327. DEN = X
  328. DO 230 I=1,NN
  329. DEN = DEN + 1.0E0
  330. TRM(I) = TRM(I)/DEN
  331. S = S + TRM(I)
  332. IF (TRM(I).LT.TOLS) GO TO 240
  333. 230 CONTINUE
  334. 240 CONTINUE
  335. ANS(J) = S
  336. 250 CONTINUE
  337. RETURN
  338. C-----------------------------------------------------------------------
  339. C SMALL X.LT.UNIT ROUND OFF
  340. C-----------------------------------------------------------------------
  341. 260 CONTINUE
  342. ANS(1) = X**(-N-1)
  343. IF (MM.EQ.1) GO TO 280
  344. K = 1
  345. DO 270 I=2,MM
  346. ANS(K+1) = ANS(K)/X
  347. K = K + 1
  348. 270 CONTINUE
  349. 280 CONTINUE
  350. IF (N.NE.0) RETURN
  351. IF (KODE.EQ.2) ANS(1) = ANS(1) + XLN
  352. RETURN
  353. 290 CONTINUE
  354. IF (T.GT.0.0E0) GO TO 380
  355. NZ=0
  356. IERR=2
  357. RETURN
  358. 380 CONTINUE
  359. NZ=NZ+1
  360. ANS(MM)=0.0E0
  361. MM=MM-1
  362. IF(MM.EQ.0) RETURN
  363. GO TO 41
  364. 390 CONTINUE
  365. IERR=3
  366. NZ=0
  367. RETURN
  368. END