函数修改自 Numerical Recipes
输出图形如图:
完整代码如下:
Module Gauss_Err_Func Implicit None Private gammq , gammp , gser , gcf , gammln contains Real FUNCTION fc_erf(x) REAL x if(x < 0.0)then fc_erf=-gammp(.5,x**2) else fc_erf=gammp(.5,x**2) endif END FUNCTION fc_erf Real FUNCTION fc_erfc(x) REAL x if(x < 0.)then fc_erfc=1.+gammp(.5,x**2) else fc_erfc=gammq(.5,x**2) endif END FUNCTION fc_erfc Real FUNCTION gammq(a,x) REAL a,x REAL gammcf,gamser,gln if(x<0.0 .or. a<=0.0) return if(x<a+1.)then call gser(gamser,a,x,gln) gammq=1.-gamser else call gcf(gammcf,a,x,gln) gammq=gammcf endif End Function gammq Real Function gammp(a,x) REAL a,x REAL gammcf,gamser,gln if(x<0..or.a<=0.) return !'bad arguments in gammp' if(x<a+1.)then call gser(gamser,a,x,gln) gammp=gamser else call gcf(gammcf,a,x,gln) gammp=1.-gammcf endif End Function gammp Subroutine gser(gamser,a,x,gln) INTEGER ITMAX REAL a,gamser,gln,x,EPS PARAMETER (ITMAX=100,EPS=3.e-7) INTEGER n REAL ap,del,sum gln=gammln(a) if(x<=0.)then if(x<0.) return ! 'x < 0 in gser' gamser=0. return endif ap=a sum=1./a del=sum do 11 n=1,ITMAX ap=ap+1. del=del*x/ap sum=sum+del if(abs(del)<abs(sum)*EPS)goto 1 11 continue return 1 gamser=sum*exp(-x+a*log(x)-gln) End Subroutine gser SUBROUTINE gcf(gammcf,a,x,gln) INTEGER ITMAX REAL a,gammcf,gln,x,EPS,FPMIN PARAMETER (ITMAX=100,EPS=3.e-7,FPMIN=1.e-30) INTEGER i REAL an,b,c,d,del,h gln=gammln(a) b=x+1.-a c=1./FPMIN d=1./b h=d do 11 i=1,ITMAX an=-i*(i-a) b=b+2. d=an*d+b if(abs(d)<FPMIN)d=FPMIN c=b+an/c if(abs(c)<FPMIN)c=FPMIN d=1./d del=d*c h=h*del if(abs(del-1.)<EPS)goto 1 11 continue return ! 'a too large, ITMAX too small in gcf' 1 gammcf=exp(-x+a*log(x)-gln)*h END Subroutine gcf Real Function gammln(xx) REAL xx INTEGER j DOUBLE PRECISION ser,stp,tmp,x,y,cof(6) SAVE cof,stp DATA cof,stp/76.18009172947146d0,-86.50532032941677d0, & 24.01409824083091d0,-1.231739572450155d0,.1208650973866179d-2, & -.5395239384953d-5,2.5066282746310005d0/ x=xx y=x tmp=x+5.5d0 tmp=(x+0.5d0)*log(tmp)-tmp ser=1.000000000190015d0 do 11 j=1,6 y=y+1.d0 ser=ser+cof(j)/y 11 continue gammln=tmp+log(stp*ser/x) End Function gammln End Module Gauss_Err_Func Program www_fcode_cn use Gauss_Err_Func Implicit None integer i real :: r = -2.5 Do i = 1 , 250 r = r + 0.02 write(134,*) r , fc_erfc(r) , fc_erf(r) End Do End Program www_fcode_cn