Initial commit
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
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
|
||||
Reference in New Issue
Block a user