📄 miser.for
字号:
SUBROUTINE miser(func,region,ndim,npts,dith,ave,var)
INTEGER ndim,npts,MNPT,MNBS,MAXD,NSTACK
REAL ave,dith,var,region(2*ndim),func,TINY,BIG,PFAC
PARAMETER (MNPT=15,MNBS=4*MNPT,MAXD=10,TINY=1.e-30,BIG=1.e30,
*NSTACK=1000,PFAC=0.1)
EXTERNAL func
CU USES func,ranpt
INTEGER iran,j,jb,jstack,n,naddr,np,npre,nptl,nptr,nptt
REAL avel,fracl,fval,rgl,rgm,rgr,s,sigl,siglb,sigr,sigrb,sum,sumb,
*summ,summ2,varl,fmaxl(10),fmaxr(10),fminl(10),fminr(10),pt(10),
*rmid(10),stack(NSTACK),stf(9)
EQUIVALENCE (stf(1),avel),(stf(2),varl),(stf(3),jb),(stf(4),nptr),
*(stf(5),naddr),(stf(6),rgl),(stf(7),rgm),(stf(8),rgr),(stf(9),
*fracl)
SAVE iran
DATA iran /0/
jstack=0
nptt=npts
1 continue
if (nptt.lt.MNBS) then
np=abs(nptt)
summ=0.
summ2=0.
do 11 n=1,np
call ranpt(pt,region,ndim)
fval=func(pt)
summ=summ+fval
summ2=summ2+fval**2
11 continue
ave=summ/np
var=max(TINY,(summ2-summ**2/np)/np**2)
else
npre=max(int(nptt*PFAC),MNPT)
do 12 j=1,ndim
iran=mod(iran*2661+36979,175000)
s=sign(dith,float(iran-87500))
rmid(j)=(0.5+s)*region(j)+(0.5-s)*region(j+ndim)
fminl(j)=BIG
fminr(j)=BIG
fmaxl(j)=-BIG
fmaxr(j)=-BIG
12 continue
do 14 n=1,npre
call ranpt(pt,region,ndim)
fval=func(pt)
do 13 j=1,ndim
if(pt(j).le.rmid(j))then
fminl(j)=min(fminl(j),fval)
fmaxl(j)=max(fmaxl(j),fval)
else
fminr(j)=min(fminr(j),fval)
fmaxr(j)=max(fmaxr(j),fval)
endif
13 continue
14 continue
sumb=BIG
jb=0
siglb=1.
sigrb=1.
do 15 j=1,ndim
if(fmaxl(j).gt.fminl(j).and.fmaxr(j).gt.fminr(j))then
sigl=max(TINY,(fmaxl(j)-fminl(j))**(2./3.))
sigr=max(TINY,(fmaxr(j)-fminr(j))**(2./3.))
sum=sigl+sigr
if (sum.le.sumb) then
sumb=sum
jb=j
siglb=sigl
sigrb=sigr
endif
endif
15 continue
if (jb.eq.0) jb=1+(ndim*iran)/175000
rgl=region(jb)
rgm=rmid(jb)
rgr=region(jb+ndim)
fracl=abs((rgm-rgl)/(rgr-rgl))
nptl=MNPT+(nptt-npre-2*MNPT)*fracl*siglb/(fracl*siglb+
*(1.-fracl)*sigrb)
nptr=nptt-npre-nptl
region(jb+ndim)=rgm
naddr=1
do 16 j=1,9
stack(jstack+j)=stf(j)
16 continue
jstack=jstack+9
nptt=nptl
goto 1
10 continue
avel=ave
varl=var
region(jb)=rgm
region(jb+ndim)=rgr
naddr=2
do 17 j=1,9
stack(jstack+j)=stf(j)
17 continue
jstack=jstack+9
nptt=nptr
goto 1
20 continue
region(jb)=rgl
ave=fracl*avel+(1.-fracl)*ave
var=fracl**2*varl+(1.-fracl)**2*var
endif
if (jstack.ne.0) then
jstack=jstack-9
do 18 j=1,9
stf(j)=stack(jstack+j)
18 continue
goto (10,20),naddr
pause 'miser: never get here'
endif
return
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -