📄 gaujac.for
字号:
SUBROUTINE gaujac(x,w,n,alf,bet)
INTEGER n,MAXIT
REAL alf,bet,w(n),x(n)
DOUBLE PRECISION EPS
PARAMETER (EPS=3.D-14,MAXIT=10)
CU USES gammln
INTEGER i,its,j
REAL alfbet,an,bn,r1,r2,r3,gammln
DOUBLE PRECISION a,b,c,p1,p2,p3,pp,temp,z,z1
do 13 i=1,n
if(i.eq.1)then
an=alf/n
bn=bet/n
r1=(1.+alf)*(2.78/(4.+n*n)+.768*an/n)
r2=1.+1.48*an+.96*bn+.452*an*an+.83*an*bn
z=1.-r1/r2
else if(i.eq.2)then
r1=(4.1+alf)/((1.+alf)*(1.+.156*alf))
r2=1.+.06*(n-8.)*(1.+.12*alf)/n
r3=1.+.012*bet*(1.+.25*abs(alf))/n
z=z-(1.-z)*r1*r2*r3
else if(i.eq.3)then
r1=(1.67+.28*alf)/(1.+.37*alf)
r2=1.+.22*(n-8.)/n
r3=1.+8.*bet/((6.28+bet)*n*n)
z=z-(x(1)-z)*r1*r2*r3
else if(i.eq.n-1)then
r1=(1.+.235*bet)/(.766+.119*bet)
r2=1./(1.+.639*(n-4.)/(1.+.71*(n-4.)))
r3=1./(1.+20.*alf/((7.5+alf)*n*n))
z=z+(z-x(n-3))*r1*r2*r3
else if(i.eq.n)then
r1=(1.+.37*bet)/(1.67+.28*bet)
r2=1./(1.+.22*(n-8.)/n)
r3=1./(1.+8.*alf/((6.28+alf)*n*n))
z=z+(z-x(n-2))*r1*r2*r3
else
z=3.*x(i-1)-3.*x(i-2)+x(i-3)
endif
alfbet=alf+bet
do 12 its=1,MAXIT
temp=2.d0+alfbet
p1=(alf-bet+temp*z)/2.d0
p2=1.d0
do 11 j=2,n
p3=p2
p2=p1
temp=2*j+alfbet
a=2*j*(j+alfbet)*(temp-2.d0)
b=(temp-1.d0)*(alf*alf-bet*bet+temp*(temp-2.d0)*z)
c=2.d0*(j-1+alf)*(j-1+bet)*temp
p1=(b*p2-c*p3)/a
11 continue
pp=(n*(alf-bet-temp*z)*p1+2.d0*(n+alf)*(n+bet)*p2)/(temp*
*(1.d0-z*z))
z1=z
z=z1-p1/pp
if(abs(z-z1).le.EPS)goto 1
12 continue
pause 'too many iterations in gaujac'
1 x(i)=z
w(i)=exp(gammln(alf+n)+gammln(bet+n)-gammln(n+1.)-gammln(n+
*alfbet+1.))*temp*2.**alfbet/(pp*p2)
13 continue
return
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -