betai.f 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. *DECK BETAI
  2. REAL FUNCTION BETAI (X, PIN, QIN)
  3. C***BEGIN PROLOGUE BETAI
  4. C***PURPOSE Calculate the incomplete Beta function.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C7F
  7. C***TYPE SINGLE 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 BETAI calculates the REAL 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 REAL.
  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 ALBETA, R1MACH, XERMSG
  27. C***REVISION HISTORY (YYMMDD)
  28. C 770401 DATE WRITTEN
  29. C 890531 Changed all specific intrinsics to generic. (WRB)
  30. C 890531 REVISION DATE from Version 3.2
  31. C 891214 Prologue converted to Version 4.0 format. (BAB)
  32. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  33. C 900326 Removed duplicate information from DESCRIPTION section.
  34. C (WRB)
  35. C 920528 DESCRIPTION and REFERENCES sections revised. (WRB)
  36. C***END PROLOGUE BETAI
  37. LOGICAL FIRST
  38. SAVE EPS, ALNEPS, SML, ALNSML, FIRST
  39. DATA FIRST /.TRUE./
  40. C***FIRST EXECUTABLE STATEMENT BETAI
  41. IF (FIRST) THEN
  42. EPS = R1MACH(3)
  43. ALNEPS = LOG(EPS)
  44. SML = R1MACH(1)
  45. ALNSML = LOG(SML)
  46. ENDIF
  47. FIRST = .FALSE.
  48. C
  49. IF (X .LT. 0. .OR. X .GT. 1.0) CALL XERMSG ('SLATEC', 'BETAI',
  50. + 'X IS NOT IN THE RANGE (0,1)', 1, 2)
  51. IF (PIN .LE. 0. .OR. QIN .LE. 0.) CALL XERMSG ('SLATEC', 'BETAI',
  52. + 'P AND/OR Q IS LE ZERO', 2, 2)
  53. C
  54. Y = X
  55. P = PIN
  56. Q = QIN
  57. IF (Q.LE.P .AND. X.LT.0.8) GO TO 20
  58. IF (X.LT.0.2) GO TO 20
  59. Y = 1.0 - Y
  60. P = QIN
  61. Q = PIN
  62. C
  63. 20 IF ((P+Q)*Y/(P+1.).LT.EPS) GO TO 80
  64. C
  65. C EVALUATE THE INFINITE SUM FIRST.
  66. C TERM WILL EQUAL Y**P/BETA(PS,P) * (1.-PS)I * Y**I / FAC(I)
  67. C
  68. PS = Q - AINT(Q)
  69. IF (PS.EQ.0.) PS = 1.0
  70. XB = P*LOG(Y) - ALBETA(PS, P) - LOG(P)
  71. BETAI = 0.0
  72. IF (XB.LT.ALNSML) GO TO 40
  73. C
  74. BETAI = EXP (XB)
  75. TERM = BETAI*P
  76. IF (PS.EQ.1.0) GO TO 40
  77. C
  78. N = MAX (ALNEPS/LOG(Y), 4.0E0)
  79. DO 30 I=1,N
  80. TERM = TERM*(I-PS)*Y/I
  81. BETAI = BETAI + TERM/(P+I)
  82. 30 CONTINUE
  83. C
  84. C NOW EVALUATE THE FINITE SUM, MAYBE.
  85. C
  86. 40 IF (Q.LE.1.0) GO TO 70
  87. C
  88. XB = P*LOG(Y) + Q*LOG(1.0-Y) - ALBETA(P,Q) - LOG(Q)
  89. IB = MAX (XB/ALNSML, 0.0E0)
  90. TERM = EXP (XB - IB*ALNSML)
  91. C = 1.0/(1.0-Y)
  92. P1 = Q*C/(P+Q-1.)
  93. C
  94. FINSUM = 0.0
  95. N = Q
  96. IF (Q.EQ.REAL(N)) N = N - 1
  97. DO 50 I=1,N
  98. IF (P1.LE.1.0 .AND. TERM/EPS.LE.FINSUM) GO TO 60
  99. TERM = (Q-I+1)*C*TERM/(P+Q-I)
  100. C
  101. IF (TERM.GT.1.0) IB = IB - 1
  102. IF (TERM.GT.1.0) TERM = TERM*SML
  103. C
  104. IF (IB.EQ.0) FINSUM = FINSUM + TERM
  105. 50 CONTINUE
  106. C
  107. 60 BETAI = BETAI + FINSUM
  108. 70 IF (Y.NE.X .OR. P.NE.PIN) BETAI = 1.0 - BETAI
  109. BETAI = MAX (MIN (BETAI, 1.0), 0.0)
  110. RETURN
  111. C
  112. 80 BETAI = 0.0
  113. XB = P*LOG(MAX(Y,SML)) - LOG(P) - ALBETA(P,Q)
  114. IF (XB.GT.ALNSML .AND. Y.NE.0.) BETAI = EXP (XB)
  115. IF (Y.NE.X .OR. P.NE.PIN) BETAI = 1.0 - BETAI
  116. RETURN
  117. C
  118. END