dpsifn.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. *DECK DPSIFN
  2. SUBROUTINE DPSIFN (X, N, KODE, M, ANS, NZ, IERR)
  3. C***BEGIN PROLOGUE DPSIFN
  4. C***PURPOSE Compute derivatives of the Psi function.
  5. C***LIBRARY SLATEC
  6. C***CATEGORY C7C
  7. C***TYPE DOUBLE 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 DPSIFN:
  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 DPSIFN 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, DPSIFN returns
  30. C the scaled derivatives as described. KODE=2 is operative only
  31. C when K=0 and in that case DPSIFN returns -PSI(X) + LN(X). That
  32. C is, the logarithmic behavior for large X is removed when KODE=2
  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 DPSIFN(X,0,1,1,ANS) results in
  38. C ANS = -PSI(X)
  39. C
  40. C Input X is DOUBLE PRECISION
  41. C X - Argument, X .gt. 0.0D0
  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 ANS is DOUBLE PRECISION
  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 (=D1MACH(4)) and 1.0D-18 since critical constants
  71. C are given to only 18 digits.
  72. C
  73. C PSIFN is the single precision version of DPSIFN.
  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 D1MACH, I1MACH
  100. C***REVISION HISTORY (YYMMDD)
  101. C 820601 DATE WRITTEN
  102. C 890531 Changed all specific intrinsics to generic. (WRB)
  103. C 890911 Removed unnecessary intrinsics. (WRB)
  104. C 891006 Cosmetic changes to prologue. (WRB)
  105. C 891006 REVISION DATE from Version 3.2
  106. C 891214 Prologue converted to Version 4.0 format. (BAB)
  107. C 920501 Reformatted the REFERENCES section. (WRB)
  108. C***END PROLOGUE DPSIFN
  109. INTEGER I, IERR, J, K, KODE, M, MM, MX, N, NMAX, NN, NP, NX, NZ,
  110. * FN
  111. INTEGER I1MACH
  112. DOUBLE PRECISION ANS, ARG, B, DEN, ELIM, EPS, FLN,
  113. * FX, RLN, RXSQ, R1M4, R1M5, S, SLOPE, T, TA, TK, TOL, TOLS, TRM,
  114. * TRMR, TSS, TST, TT, T1, T2, WDTOL, X, XDMLN, XDMY, XINC, XLN,
  115. * XM, XMIN, XQ, YINT
  116. DOUBLE PRECISION D1MACH
  117. DIMENSION B(22), TRM(22), TRMR(100), ANS(*)
  118. SAVE NMAX, B
  119. DATA NMAX /100/
  120. C-----------------------------------------------------------------------
  121. C BERNOULLI NUMBERS
  122. C-----------------------------------------------------------------------
  123. DATA B(1), B(2), B(3), B(4), B(5), B(6), B(7), B(8), B(9), B(10),
  124. * B(11), B(12), B(13), B(14), B(15), B(16), B(17), B(18), B(19),
  125. * B(20), B(21), B(22) /1.00000000000000000D+00,
  126. * -5.00000000000000000D-01,1.66666666666666667D-01,
  127. * -3.33333333333333333D-02,2.38095238095238095D-02,
  128. * -3.33333333333333333D-02,7.57575757575757576D-02,
  129. * -2.53113553113553114D-01,1.16666666666666667D+00,
  130. * -7.09215686274509804D+00,5.49711779448621554D+01,
  131. * -5.29124242424242424D+02,6.19212318840579710D+03,
  132. * -8.65802531135531136D+04,1.42551716666666667D+06,
  133. * -2.72982310678160920D+07,6.01580873900642368D+08,
  134. * -1.51163157670921569D+10,4.29614643061166667D+11,
  135. * -1.37116552050883328D+13,4.88332318973593167D+14,
  136. * -1.92965793419400681D+16/
  137. C
  138. C***FIRST EXECUTABLE STATEMENT DPSIFN
  139. IERR = 0
  140. NZ=0
  141. IF (X.LE.0.0D0) IERR=1
  142. IF (N.LT.0) IERR=1
  143. IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
  144. IF (M.LT.1) IERR=1
  145. IF (IERR.NE.0) RETURN
  146. MM=M
  147. NX = MIN(-I1MACH(15),I1MACH(16))
  148. R1M5 = D1MACH(5)
  149. R1M4 = D1MACH(4)*0.5D0
  150. WDTOL = MAX(R1M4,0.5D-18)
  151. C-----------------------------------------------------------------------
  152. C ELIM = APPROXIMATE EXPONENTIAL OVER AND UNDERFLOW LIMIT
  153. C-----------------------------------------------------------------------
  154. ELIM = 2.302D0*(NX*R1M5-3.0D0)
  155. XLN = LOG(X)
  156. 41 CONTINUE
  157. NN = N + MM - 1
  158. FN = NN
  159. T = (FN+1)*XLN
  160. C-----------------------------------------------------------------------
  161. C OVERFLOW AND UNDERFLOW TEST FOR SMALL AND LARGE X
  162. C-----------------------------------------------------------------------
  163. IF (ABS(T).GT.ELIM) GO TO 290
  164. IF (X.LT.WDTOL) GO TO 260
  165. C-----------------------------------------------------------------------
  166. C COMPUTE XMIN AND THE NUMBER OF TERMS OF THE SERIES, FLN+1
  167. C-----------------------------------------------------------------------
  168. RLN = R1M5*I1MACH(14)
  169. RLN = MIN(RLN,18.06D0)
  170. FLN = MAX(RLN,3.0D0) - 3.0D0
  171. YINT = 3.50D0 + 0.40D0*FLN
  172. SLOPE = 0.21D0 + FLN*(0.0006038D0*FLN+0.008677D0)
  173. XM = YINT + SLOPE*FN
  174. MX = INT(XM) + 1
  175. XMIN = MX
  176. IF (N.EQ.0) GO TO 50
  177. XM = -2.302D0*RLN - MIN(0.0D0,XLN)
  178. ARG = XM/N
  179. ARG = MIN(0.0D0,ARG)
  180. EPS = EXP(ARG)
  181. XM = 1.0D0 - EPS
  182. IF (ABS(ARG).LT.1.0D-3) XM = -ARG
  183. FLN = X*XM/EPS
  184. XM = XMIN - X
  185. IF (XM.GT.7.0D0 .AND. FLN.LT.15.0D0) GO TO 200
  186. 50 CONTINUE
  187. XDMY = X
  188. XDMLN = XLN
  189. XINC = 0.0D0
  190. IF (X.GE.XMIN) GO TO 60
  191. NX = INT(X)
  192. XINC = XMIN - NX
  193. XDMY = X + XINC
  194. XDMLN = LOG(XDMY)
  195. 60 CONTINUE
  196. C-----------------------------------------------------------------------
  197. C GENERATE W(N+MM-1,X) BY THE ASYMPTOTIC EXPANSION
  198. C-----------------------------------------------------------------------
  199. T = FN*XDMLN
  200. T1 = XDMLN + XDMLN
  201. T2 = T + XDMLN
  202. TK = MAX(ABS(T),ABS(T1),ABS(T2))
  203. IF (TK.GT.ELIM) GO TO 380
  204. TSS = EXP(-T)
  205. TT = 0.5D0/XDMY
  206. T1 = TT
  207. TST = WDTOL*TT
  208. IF (NN.NE.0) T1 = TT + 1.0D0/FN
  209. RXSQ = 1.0D0/(XDMY*XDMY)
  210. TA = 0.5D0*RXSQ
  211. T = (FN+1)*TA
  212. S = T*B(3)
  213. IF (ABS(S).LT.TST) GO TO 80
  214. TK = 2.0D0
  215. DO 70 K=4,22
  216. T = T*((TK+FN+1)/(TK+1.0D0))*((TK+FN)/(TK+2.0D0))*RXSQ
  217. TRM(K) = T*B(K)
  218. IF (ABS(TRM(K)).LT.TST) GO TO 80
  219. S = S + TRM(K)
  220. TK = TK + 2.0D0
  221. 70 CONTINUE
  222. 80 CONTINUE
  223. S = (S+T1)*TSS
  224. IF (XINC.EQ.0.0D0) GO TO 100
  225. C-----------------------------------------------------------------------
  226. C BACKWARD RECUR FROM XDMY TO X
  227. C-----------------------------------------------------------------------
  228. NX = INT(XINC)
  229. NP = NN + 1
  230. IF (NX.GT.NMAX) GO TO 390
  231. IF (NN.EQ.0) GO TO 160
  232. XM = XINC - 1.0D0
  233. FX = X + XM
  234. C-----------------------------------------------------------------------
  235. C THIS LOOP SHOULD NOT BE CHANGED. FX IS ACCURATE WHEN X IS SMALL
  236. C-----------------------------------------------------------------------
  237. DO 90 I=1,NX
  238. TRMR(I) = FX**(-NP)
  239. S = S + TRMR(I)
  240. XM = XM - 1.0D0
  241. FX = X + XM
  242. 90 CONTINUE
  243. 100 CONTINUE
  244. ANS(MM) = S
  245. IF (FN.EQ.0) GO TO 180
  246. C-----------------------------------------------------------------------
  247. C GENERATE LOWER DERIVATIVES, J.LT.N+MM-1
  248. C-----------------------------------------------------------------------
  249. IF (MM.EQ.1) RETURN
  250. DO 150 J=2,MM
  251. FN = FN - 1
  252. TSS = TSS*XDMY
  253. T1 = TT
  254. IF (FN.NE.0) T1 = TT + 1.0D0/FN
  255. T = (FN+1)*TA
  256. S = T*B(3)
  257. IF (ABS(S).LT.TST) GO TO 120
  258. TK = 4 + FN
  259. DO 110 K=4,22
  260. TRM(K) = TRM(K)*(FN+1)/TK
  261. IF (ABS(TRM(K)).LT.TST) GO TO 120
  262. S = S + TRM(K)
  263. TK = TK + 2.0D0
  264. 110 CONTINUE
  265. 120 CONTINUE
  266. S = (S+T1)*TSS
  267. IF (XINC.EQ.0.0D0) GO TO 140
  268. IF (FN.EQ.0) GO TO 160
  269. XM = XINC - 1.0D0
  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.0D0
  275. FX = X + XM
  276. 130 CONTINUE
  277. 140 CONTINUE
  278. MX = MM - J + 1
  279. ANS(MX) = S
  280. IF (FN.EQ.0) 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.0D0/(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 = (N+1)*XLN
  306. T = EXP(-T1)
  307. S = T
  308. DEN = X
  309. DO 210 I=1,NN
  310. DEN = DEN + 1.0D0
  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.0D0
  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.0D0
  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.0D0) GO TO 380
  355. NZ=0
  356. IERR=2
  357. RETURN
  358. 380 CONTINUE
  359. NZ=NZ+1
  360. ANS(MM)=0.0D0
  361. MM=MM-1
  362. IF (MM.EQ.0) RETURN
  363. GO TO 41
  364. 390 CONTINUE
  365. NZ=0
  366. IERR=3
  367. RETURN
  368. END