1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
DOUBLE PRECISION FUNCTION bup(a,b,x,y,n,eps)
C-----------------------------------------------------------------------
C EVALUATION OF IX(A,B) - IX(A+N,B) WHERE N IS A POSITIVE INTEGER.
C EPS IS THE TOLERANCE USED.
C-----------------------------------------------------------------------
C .. Scalar Arguments ..
DOUBLE PRECISION a,b,eps,x,y
INTEGER n
C ..
C .. Local Scalars ..
DOUBLE PRECISION ap1,apb,d,l,r,t,w
INTEGER i,k,kp1,mu,nm1
C ..
C .. External Functions ..
DOUBLE PRECISION brcmp1,exparg
EXTERNAL brcmp1,exparg
C ..
C .. Intrinsic Functions ..
INTRINSIC abs,exp
C ..
C .. Executable Statements ..
C
C OBTAIN THE SCALING FACTOR EXP(-MU) AND
C EXP(MU)*(X**A*Y**B/BETA(A,B))/A
C
apb = a + b
ap1 = a + 1.0D0
mu = 0
d = 1.0D0
IF (n.EQ.1 .OR. a.LT.1.0D0) GO TO 10
IF (apb.LT.1.1D0*ap1) GO TO 10
mu = abs(exparg(1))
k = exparg(0)
IF (k.LT.mu) mu = k
t = mu
d = exp(-t)
C
10 bup = brcmp1(mu,a,b,x,y)/a
IF (n.EQ.1 .OR. bup.EQ.0.0D0) RETURN
nm1 = n - 1
w = d
C
C LET K BE THE INDEX OF THE MAXIMUM TERM
C
k = 0
IF (b.LE.1.0D0) GO TO 50
IF (y.GT.1.D-4) GO TO 20
k = nm1
GO TO 30
20 r = (b-1.0D0)*x/y - a
IF (r.LT.1.0D0) GO TO 50
k = nm1
t = nm1
IF (r.LT.t) k = r
C
C ADD THE INCREASING TERMS OF THE SERIES
C
30 DO 40 i = 1,k
l = i - 1
d = ((apb+l)/ (ap1+l))*x*d
w = w + d
40 CONTINUE
IF (k.EQ.nm1) GO TO 70
C
C ADD THE REMAINING TERMS OF THE SERIES
C
50 kp1 = k + 1
DO 60 i = kp1,nm1
l = i - 1
d = ((apb+l)/ (ap1+l))*x*d
w = w + d
IF (d.LE.eps*w) GO TO 70
60 CONTINUE
C
C TERMINATE THE PROCEDURE
C
70 bup = bup*w
RETURN
END
|