54 lines
1.3 KiB
Fortran
54 lines
1.3 KiB
Fortran
SUBROUTINE laguer(a,m,x,its)
|
|
INTEGER m,its,MAXIT,MR,MT
|
|
REAL EPSS
|
|
COMPLEX a(m+1),x
|
|
PARAMETER (EPSS=2.e-7,MR=8,MT=10,MAXIT=MT*MR)
|
|
INTEGER iter,j
|
|
REAL abx,abp,abm,err,frac(MR)
|
|
COMPLEX dx,x1,b,d,f,g,h,sq,gp,gm,g2
|
|
SAVE frac
|
|
DATA frac /.5,.25,.75,.13,.38,.62,.88,1./
|
|
do 12 iter=1,MAXIT
|
|
its=iter
|
|
b=a(m+1)
|
|
err=abs(b)
|
|
d=cmplx(0.,0.)
|
|
f=cmplx(0.,0.)
|
|
abx=abs(x)
|
|
do 11 j=m,1,-1
|
|
f=x*f+d
|
|
d=x*d+b
|
|
b=x*b+a(j)
|
|
err=abs(b)+abx*err
|
|
11 continue
|
|
err=EPSS*err
|
|
if(abs(b).le.err) then
|
|
return
|
|
else
|
|
g=d/b
|
|
g2=g*g
|
|
h=g2-2.*f/b
|
|
sq=sqrt((m-1)*(m*h-g2))
|
|
gp=g+sq
|
|
gm=g-sq
|
|
abp=abs(gp)
|
|
abm=abs(gm)
|
|
if(abp.lt.abm) gp=gm
|
|
if (max(abp,abm).gt.0.) then
|
|
dx=m/gp
|
|
else
|
|
dx=exp(cmplx(log(1.+abx),float(iter)))
|
|
endif
|
|
endif
|
|
x1=x-dx
|
|
if(x.eq.x1)return
|
|
if (mod(iter,MT).ne.0) then
|
|
x=x1
|
|
else
|
|
x=x-dx*frac(iter/MT)
|
|
endif
|
|
12 continue
|
|
pause 'too many iterations in laguer'
|
|
return
|
|
END
|