dbetai.f 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. *DECK DBETAI
  2. DOUBLE PRECISION FUNCTION DBETAI (X, PIN, QIN)
  3. C***BEGIN PROLOGUE DBETAI
  4. C***PURPOSE Calculate the incomplete Beta function.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C7F
  7. C***TYPE DOUBLE PRECISION (BETAI-S, DBETAI-D)
  8. C***KEYWORDS FNLIB, INCOMPLETE BETA FUNCTION, SPECIAL FUNCTIONS
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C DBETAI calculates the DOUBLE PRECISION incomplete beta function.
  13. C
  14. C The incomplete beta function ratio is the probability that a
  15. C random variable from a beta distribution having parameters PIN and
  16. C QIN will be less than or equal to X.
  17. C
  18. C -- Input Arguments -- All arguments are DOUBLE PRECISION.
  19. C X upper limit of integration. X must be in (0,1) inclusive.
  20. C PIN first beta distribution parameter. PIN must be .GT. 0.0.
  21. C QIN second beta distribution parameter. QIN must be .GT. 0.0.
  22. C
  23. C***REFERENCES Nancy E. Bosten and E. L. Battiste, Remark on Algorithm
  24. C 179, Communications of the ACM 17, 3 (March 1974),
  25. C pp. 156.
  26. C***ROUTINES CALLED D1MACH, DLBETA, XERMSG
  27. C***REVISION HISTORY (YYMMDD)
  28. C 770701 DATE WRITTEN
  29. C 890531 Changed all specific intrinsics to generic. (WRB)
  30. C 890911 Removed unnecessary intrinsics. (WRB)
  31. C 890911 REVISION DATE from Version 3.2
  32. C 891214 Prologue converted to Version 4.0 format. (BAB)
  33. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  34. C 920528 DESCRIPTION and REFERENCES sections revised. (WRB)
  35. C***END PROLOGUE DBETAI
  36. DOUBLE PRECISION X, PIN, QIN, ALNEPS, ALNSML, C, EPS, FINSUM, P,
  37. 1 PS, Q, SML, TERM, XB, XI, Y, D1MACH, DLBETA, P1
  38. LOGICAL FIRST
  39. SAVE EPS, ALNEPS, SML, ALNSML, FIRST
  40. DATA FIRST /.TRUE./
  41. C***FIRST EXECUTABLE STATEMENT DBETAI
  42. IF (FIRST) THEN
  43. EPS = D1MACH(3)
  44. ALNEPS = LOG (EPS)
  45. SML = D1MACH(1)
  46. ALNSML = LOG (SML)
  47. ENDIF
  48. FIRST = .FALSE.
  49. C
  50. IF (X .LT. 0.D0 .OR. X .GT. 1.D0) CALL XERMSG ('SLATEC', 'DBETAI',
  51. + 'X IS NOT IN THE RANGE (0,1)', 1, 2)
  52. IF (PIN .LE. 0.D0 .OR. QIN .LE. 0.D0) CALL XERMSG ('SLATEC',
  53. + 'DBETAI', 'P AND/OR Q IS LE ZERO', 2, 2)
  54. C
  55. Y = X
  56. P = PIN
  57. Q = QIN
  58. IF (Q.LE.P .AND. X.LT.0.8D0) GO TO 20
  59. IF (X.LT.0.2D0) GO TO 20
  60. Y = 1.0D0 - Y
  61. P = QIN
  62. Q = PIN
  63. C
  64. 20 IF ((P+Q)*Y/(P+1.D0).LT.EPS) GO TO 80
  65. C
  66. C EVALUATE THE INFINITE SUM FIRST. TERM WILL EQUAL
  67. C Y**P/BETA(PS,P) * (1.-PS)-SUB-I * Y**I / FAC(I) .
  68. C
  69. PS = Q - AINT(Q)
  70. IF (PS.EQ.0.D0) PS = 1.0D0
  71. XB = P*LOG(Y) - DLBETA(PS,P) - LOG(P)
  72. DBETAI = 0.0D0
  73. IF (XB.LT.ALNSML) GO TO 40
  74. C
  75. DBETAI = EXP (XB)
  76. TERM = DBETAI*P
  77. IF (PS.EQ.1.0D0) GO TO 40
  78. N = MAX (ALNEPS/LOG(Y), 4.0D0)
  79. DO 30 I=1,N
  80. XI = I
  81. TERM = TERM * (XI-PS)*Y/XI
  82. DBETAI = DBETAI + TERM/(P+XI)
  83. 30 CONTINUE
  84. C
  85. C NOW EVALUATE THE FINITE SUM, MAYBE.
  86. C
  87. 40 IF (Q.LE.1.0D0) GO TO 70
  88. C
  89. XB = P*LOG(Y) + Q*LOG(1.0D0-Y) - DLBETA(P,Q) - LOG(Q)
  90. IB = MAX (XB/ALNSML, 0.0D0)
  91. TERM = EXP(XB - IB*ALNSML)
  92. C = 1.0D0/(1.D0-Y)
  93. P1 = Q*C/(P+Q-1.D0)
  94. C
  95. FINSUM = 0.0D0
  96. N = Q
  97. IF (Q.EQ.DBLE(N)) N = N - 1
  98. DO 50 I=1,N
  99. IF (P1.LE.1.0D0 .AND. TERM/EPS.LE.FINSUM) GO TO 60
  100. XI = I
  101. TERM = (Q-XI+1.0D0)*C*TERM/(P+Q-XI)
  102. C
  103. IF (TERM.GT.1.0D0) IB = IB - 1
  104. IF (TERM.GT.1.0D0) TERM = TERM*SML
  105. C
  106. IF (IB.EQ.0) FINSUM = FINSUM + TERM
  107. 50 CONTINUE
  108. C
  109. 60 DBETAI = DBETAI + FINSUM
  110. 70 IF (Y.NE.X .OR. P.NE.PIN) DBETAI = 1.0D0 - DBETAI
  111. DBETAI = MAX (MIN (DBETAI, 1.0D0), 0.0D0)
  112. RETURN
  113. C
  114. 80 DBETAI = 0.0D0
  115. XB = P*LOG(MAX(Y,SML)) - LOG(P) - DLBETA(P,Q)
  116. IF (XB.GT.ALNSML .AND. Y.NE.0.0D0) DBETAI = EXP(XB)
  117. IF (Y.NE.X .OR. P.NE.PIN) DBETAI = 1.0D0 - DBETAI
  118. C
  119. RETURN
  120. END