www.pudn.com > Fortran.zip > MBETA.FOR, change:1995-04-01,size:1148b


 
	FUNCTION MBETA(A,B,X) 
	DOUBLE PRECISION MBETA,A,B,X 
	DOUBLE PRECISION Y,BETA,MGAM1 
	IF (A.LE.0.0) THEN 
	  WRITE(*,*) ' ERR** A=0 !' 
	  MBETA=-1.0 
	  RETURN 
	END IF 
	IF (B.LE.0.0) THEN 
	  WRITE(*,*) ' ERR** B=0 !' 
	  MBETA=-1.0 
	  RETURN 
	END IF 
	IF ((X.LT.0.0).OR.(X.GT.1.0)) THEN 
	  WRITE(*,*) ' ERR** X<0 or X>1 !' 
	  MBETA=1.0D+35 
	  RETURN 
	END IF 
	IF ((X+1.0.EQ.1.0).OR.(X+1.0.EQ.2.0)) THEN 
          Y=0.0 
	ELSE 
	  Y=A*LOG(X)+B*LOG(1.0-X) 
	  Y=EXP(Y) 
	  Y=Y*MGAM1(A+B)/(MGAM1(A)*MGAM1(B)) 
	END IF 
	IF (X.LT.(A+1.0)/(A+B+2.0)) THEN 
	  Y=Y*BETA(A,B,X)/A 
	ELSE 
	  Y=1.0-Y*BETA(B,A,1.0-X)/B 
	END IF 
	MBETA=Y 
	RETURN 
	END 
 
	FUNCTION BETA(A,B,X) 
	DOUBLE PRECISION BETA,A,B,X 
	DOUBLE PRECISION D,P0,Q0,P1,Q1,S0,S1 
	P0=0.0 
	Q0=1.0 
	P1=1.0 
	Q1=1.0 
	DO 10 K=1,100 
	  D=(A+K)*(A+B+K)*X 
	  D=-D/((A+K+K)*(A+K+K+1.0)) 
	  P0=P1+D*P0 
	  Q0=Q1+D*Q0 
	  S0=P0/Q0 
	  D=K*(B-K)*X 
	  D=D/((A+K+K-1.0)*(A+K+K)) 
	  P1=P0+D*P1 
	  Q1=Q0+D*Q1 
	  S1=P1/Q1 
	  IF (ABS(S1-S0).LT.ABS(S1)*1.0D-07) THEN 
	    BETA=S1 
	    RETURN 
	  END IF 
10	CONTINUE 
	WRITE(*,*) ' A or B too big !' 
	BETA=S1 
	RETURN 
	END