第7章 蒙特卡罗方法 附录.docx

上传人:b****8 文档编号:9649652 上传时间:2023-02-05 格式:DOCX 页数:37 大小:22.83KB
下载 相关 举报
第7章 蒙特卡罗方法 附录.docx_第1页
第1页 / 共37页
第7章 蒙特卡罗方法 附录.docx_第2页
第2页 / 共37页
第7章 蒙特卡罗方法 附录.docx_第3页
第3页 / 共37页
第7章 蒙特卡罗方法 附录.docx_第4页
第4页 / 共37页
第7章 蒙特卡罗方法 附录.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

第7章 蒙特卡罗方法 附录.docx

《第7章 蒙特卡罗方法 附录.docx》由会员分享,可在线阅读,更多相关《第7章 蒙特卡罗方法 附录.docx(37页珍藏版)》请在冰豆网上搜索。

第7章 蒙特卡罗方法 附录.docx

第7章蒙特卡罗方法附录

第7章附录

7.2.1均匀分布随机数

例题7.2.1计算程序

!

rand1.for

programrand1

implicitnone

realr

integern,c,x,i

open(5,file='rand1.txt')

n=32768

c=889

x=13

doi=1,1000

x=c*x-n*int(c*x/n)

r=real(x)/(n-1)

write(5,'(f8.5)')r

enddo

end

!

!

!

!

!

!

rand2.for!

!

!

!

!

programrand2

implicitnone

integer,parameter:

:

n=1000

integerix,i

realr

open(5,file='rand2.txt')

ix=32765

doi=1,n

callrand(ix,r)

write(5,'(f8.6)')r

enddo

endprogramrand2

subroutinerand(ix,r)

i=ix*259

ix=i-i/32768*32768

r=float(ix)/32768

return

end

7.2.3随机抽样

例题7.2.2计算程序

%例题7_2_2.m

figure

(1);

set(gca,'FontSize',16);

t=rand(1000,1);

y=-log(t);

z=exp(-y);

plot(y,z,'.');

xlabel('图7.2-2例题7.2.2-指数分布抽样')

====================================================

例题7.2.5计算程序

!

例题7.2.5

programscores

parameter(nmax=10,mmax=13)

real(8)x(nmax),y(nmax),l(0:

nmax),z(mmax),ys(mmax),r

integeri,j,k

datax/5.0,15.0,25.0,35.0,45.0,55.0,65.0,75.0,85.0,95.0/

datay/0,0,0,0,0.08,0.19,0.31,0.27,0.11,0.04/

open(2,file='scores_old.txt')

open(5,file='scores_new.txt')!

mmax个抽样学生成绩

open(7,file='scores_sample.txt')

write(2,'(2f15.5)')(x(i),y(i),i=1,nmax)

ix=32765

l(0)=0

doi=1,nmax

l(i)=l(i-1)+y(i)

enddo

doj=1,mmax

callrand(ix,r)

dok=1,nmax

if(r.le.l(k))goto11

enddo

11z(j)=x(k)

enddo

write(5,*)(z(i),i=1,mmax)

ys=0

doi=1,mmax

k=z(i)/float(nmax)!

确定抽样学生所在的分数段

ys(k)=ys(k)+1.0!

统计每个分数段的学生数

enddo

doi=1,nmax

ys(i)=ys(i)/float(mmax)

write(7,*)x(i),ys(i)

enddo

end

subroutinerand(ix,r)

integeri

real(8)r

i=ix*259

ix=i-i/32768*32768

r=float(ix)/32768

return

end

====================================================

7.3.1方程求根的M-C方法

例题7.3.1计算程序

!

例题3.1

programroots_MC1

implicitnone

realb,bmax,a,h,f,x

open(5,file='x.txt')

b=0.0;bmax=4.0;h=0.3

4a=b

b=b+h

if((f(a)*f(b)).gt.0.0)goto4

callsr(a,b,x)

write(5,'(f12.8)')x

write(*,'(f12.8)')x

if(b.lt.bmax)goto4

end

subroutinesr(a,b,x)

implicitnone

realr,xr,x,a,b,p,f

integerix,n,m,i

ix=32765;n=4000;m=0

doi=1,n

callrand(ix,r)

xr=a+(b-a)*r

if(f(xr).le.0.0)m=m+1

enddo

p=real(m)/real(n)

if(f(a).le.0.0)then

x=a+(b-a)*p

else

x=a+(b-a)*(1.0-p)

endif

return

end

functionf(x)

implicitnone

realx,f

!

f=exp(x)*(log(x)-x*x)

f=(((x-10.0)*x+35.0)*x-50.0)*x+24.0

return

end

subroutinerand(ix,r)

i=ix*259

ix=i-i/32768*32768

r=float(ix)/32768

return

end

=========================================

例题7.3.2计算程序

!

!

!

!

!

!

!

!

!

!

!

!

roots_MC_2.f90!

!

!

!

!

!

!

!

!

!

!

programroots_MC_2

implicitnone

real(8)x,a,b,r,rp,rm,f,p

integerix,n,i

a=0.0;b=3.1415926/2.0

!

a=0.0;b=1.0

ix=32765

n=2000

rp=0.0;rm=1.0!

注意:

首先将最大赋值最小,将最小赋值最大

if(f(a)<0)then

doi=1,2000

callrand(ix,r)

if(f(a+(b-a)*r)<=0.0)then

callamax(r,rp)

else

callamin(r,rm)

endif

enddo

else

doi=1,2000

callrand(ix,r)

if(f(a+(b-a)*r)>=0.0)then

callamax(r,rp)

else

callamin(r,rm)

endif

enddo

endif

p=(rp+rm)/2.0

x=a+(b-a)*p

write(*,*)'x=',x

endprogramroots_MC_2

subroutineamax(x,xmax)

implicitnone

real(8)x,xmax

if(xmax.ge.x)then

return

else

xmax=x

endif

return

end

subroutineamin(x,xmin)

implicitnone

real(8)x,xmin

if(xmin.le.x)then

return

else

xmin=x

endif

return

end

functionf(x)

real(8)x

f=exp(-x*x*x)-tan(x)+800.0

!

f=x-exp(-x)

return

end

subroutinerand(ix,r)

real(8)r

integerix

i=ix*259

ix=i-i/32768*32768

r=float(ix)/32768

return

end

===========================================

7.3.2计算定积分的M-C方法

例题7.3.3计算程序

!

例题7.3.3

programint_MC1

real(8)f,s,a,b

a=2.5!

积分下限

b=8.4!

积分上限

callint_mc(a,b,s)

print*,'s=',s

end

functionf(x)

real(8)x

f=x*x+sin(x)

end

subroutineint_mc(a,b,s)

real(8)a,b,f,s,r,x

integerm,i

r=1.0

m=10000

s=0.0

doi=1,m

x=a+(b-a)*rand(r)

s=s+f(x)

enddo

s=s*(b-a)/real(m)

return

end

functionrand(r)

real(8)s,u,v,r

integerm

s=65536.0

u=2053.0

v=13849.0

m=r/s

r=r-m*s

r=u*r+v

m=r/s

r=r-m*s

rand=r/s

return

end

=================================================

例题7.3.4计算程序

!

例题3.4

programpi_MC1

integerm,n,s,ntotal

real(8)r,x,y,rand,iseed

open(5,file='pi.txt')

iseed=1.0

n=100000

m=10000

s=0

dontotal=1,n

x=rand(iseed)

y=rand(iseed)

r=sqrt(x*x+y*y)

if(r<=1.0)s=s+1

if(mod(ntotal,m).eq.0)then

print*,ntotal,4.0*float(s)/float(ntotal)

write(5,'(2x,i8,3x,f18.8)')ntotal,4.0*float(s)/float(ntotal)

endif

enddo

end

functionrand(r)

real(8)s,u,v,r

integerm

s=65536.0

u=2053.0

v=13849.0

m=r/s

r=r-m*s

r=u*r+v

m=r/s

r=r-m*s

rand=r/s

return

end

%pi的计算(例题7.3.4)

clc;clear;formatlong;

i=1;count=0.;

n=5000;

x=rand(n,1);

y=rand(n,1);

figure

(1);

set(gca,'FontSize',16);

fori=1:

n

if(x(i)*x(i)+y(i)*y(i))<=1.0

plot(x(i),y(i),'r.');

count=count+1.;

else

holdon;

plot(x(i),y(i),'b.');

end

end

pi_val=4.*count/(i-1)

xlabel('x');

ylabel('y');

title('图7.3-2计算\pi值示意图');

============================================================

例题7.3.5计算程序

!

例题3.5

programMint_MC1

implicitnone

real(8)c,xmax,rand

integerix,n,m,j,k

open(4,file='gama.txt')

ix=32765

n=2000

dom=5,9

c=0.0

doj=1,n

xmax=rand(ix)

dok=2,m

xmax=max(xmax,rand(ix))

enddo

c=c+dlog(dabs(m*dlog(xmax)))

enddo

c=c/n

write(4,100)m,c

write(*,100)m,c

enddo

100format(2x,'gama(',i2,')=',f18.8)

end

realfunctionrand(ix)

integeri,ix

i=ix*259

ix=i-i/32768*32768

rand=real(ix)/32768.0

return

end

=========================================

例题7.3.6计算程序

!

!

!

!

int_MC2.f90!

!

!

!

!

!

!

programint_MC2

integerm,n,s,ntotal

real(8)r,x,y,rand,iseed

open(5,file='pi.txt')

iseed=1.0

n=100000

m=10000

s=0

dontotal=1,n

x=rand(iseed)

y=rand(iseed)

r=sqrt(x*x+y*y)

if(r<=1.0)s=s+1

if(mod(ntotal,m).eq.0)then

print*,ntotal,4.0*float(s)/float(ntotal)

write(5,'(2x,i8,3x,f18.8)')ntotal,4.0*float(s)/float(ntotal)

endif

enddo

end

functionrand(r)

real(8)s,u,v,r

integerm

s=65536.0

u=2053.0

v=13849.0

m=r/s

r=r-m*s

r=u*r+v

m=r/s

r=r-m*s

rand=r/s

return

end

/*Mint_MC2.c例题3.6*/

#include

#definef(x,y)x*y*y

staticdoublexn=1;

doublerand()

{doublelambda=16807,p=2147483647;

xn=fmod(lambda*xn,p);

returnxn/p;}

voidsrand(doubleseed)

{xn=seed;}

main()

{inti,n=15000;doublex,y,s=0;

srand(4);

for(i=0;i

{x=rand()+2/3.0;y=(3*x-2)*rand()+(2-x);

s=s+(3*x-2)*f(x,y);}

s=s/n;

printf("N=%8dV=%10.6f\n",n,s);

}

例题7.3.7计算程序

/*Mint_MC3.c例题.3.7*/

#include

staticdoublexn=1;

doublerand()

{doublelambda=16807,p=2147483647;

xn=fmod(lambda*xn,p);

returnxn/p;}

voidsrand(doubleseed)

{xn=seed;}

main()

{inti,n=10000,m=0;doublex,y,z,v=0;

srand(256);

for(i=0;i

{x=-0.5+rand();y=-0.5+rand();z=-0.5+rand();

if((sqrt(x*x+y*y+z*z)<=0.5)&&(sqrt(x*x+y*y)>=0.3))

m=m+1;}

v=1.*(double)m/n;

printf("N=%8dV=%10.6f\n",n,v);

}

======================================================

7.3.3MC方法求解Laplace方程

例题7.3.8计算程序

!

programWalk_MC1.for

!

蒙特卡罗方法求解2d_Laplaciandifferenceequation

parameter(imax=50,jmax=50,pi=3.1415926,kmax=10000)

dimensionT(imax,jmax),a(imax,jmax),

&qx(imax,jmax),qy(imax,jmax),q(imax,jmax),an(imax,jmax)

reallamda,Tu,Td,Tl,Tr,kpx,kpy,dx,dy,r

open(2,file='walk2.dat')

open(3,file='q2.dat')

lamda=1.5;Tu=100.;Tl=75.;Tr=50.;Td=0.;dx=0.1;dy=0.1;ix=32765

kpx=-0.49/2./dx;kpy=-0.49/2./dy

T(:

:

)=0.0

T(1,1)=0.5*(Td+Tl);T(1,jmax)=0.5*(Tl+Tu)

T(imax,jmax)=0.5*(Tu+Tr);T(imax,1)=0.5*(Tr+Td)

T(1,2:

jmax-1)=Tl;T(imax,2:

jmax-1)=Tr

T(2:

imax-1,1)=Td;T(2:

imax-1,jmax)=Tu

doi=2,imax-1

print*,'i=',i

ii=i

doj=2,jmax-1

jj=j

do20k=1,kmax

a(i,j)=T(i,j)

6callrand(ix,r)

if(r.le.0.25)then

ii=ii+1

else

if(r.le.0.5)then

jj=jj-1

else

if(r.le.0.75)then

ii=ii-1

else

jj=jj+1

endif

endif

endif

if(ii.eq.1.or.ii.eq.imax)goto18

if(jj.eq.1.or.jj.eq.jmax)goto19

goto6

18T(i,j)=T(ii,j)

goto17

19T(i,j)=T(i,jj)

17T(i,j)=a(i,j)+T(i,j)

20continue

T(i,j)=T(i,j)/float(kmax)

enddo

enddo

doj=1,jmax

write(2,222)(T(i,j),i=1,imax)

enddo

222format(1x,50(2x,f14.10))

doi=2,imax-1

doj=2,jmax-1

qx(i,j)=kpx*(T(i+1,j)-T(i-1,j))

qy(i,j)=kpy*(T(i,j+1)-T(i,j-1))

q(i,j)=sqrt(qx(i,j)*qx(i,j)+qy(i,j)*qy(i,j))

if(qx(i,j).gt.0.)then

an(i,j)=atan(qy(i,j)/qx(i,j))

else

an(i,j)=atan(qy(i,j)/qx(i,j))+pi

endif

enddo

enddo

doj=2,jmax-1

doi=2,imax-1

!

write(3,333)dx*(i-1),dy*(j-1),an(i,j),q(i,j)

write(3,333)dx*(i-1),dy*(j-1),qx(i,j),qy(i,j)

enddo

enddo

333format(1x,4(2x,f18.12))

end

subroutinerand(ix,r)

i=ix*259

ix=i-i/32768*32768

r=float(ix)/32768

return

end

======================================================

7.3.4核链式反应的模拟

!

!

!

!

!

!

MC_1.f90!

!

!

!

!

programmc_1

implicitnone

integeri,j,k,nmax,kmax

real(8)x,n,m,dm,t,pi,a,b,nin,rand,f,xi(50),fi(50)

real(8)r(9),x0,y0,z0,x1,y1,z1,p,c,s,d

open(2,file='k_m.txt')

x=1.0;n=10000.0;m=0.98

dm=0.02;t=1.0;pi=3.14159265

nmax=n;kmax=50

dok=1,kmax

m=m+dm

xi(k)=m

a=(m*t)**(1.0/3.0)

b=(m/(t*t))**(1.0/3.0)

nin=0.0

doj=1,nmax

doi=1,9

r(i)=rand(x)

enddo

x0=a*(r

(1)-0.5)

y0=a*(r

(2)-0.5)

z0=b*(r(3)-0.5)

do1i=1,2

p=2.0*pi*r(2*i+2)

c=2.0*(r(2*i+3)-0.5)

s=sqrt(1.0-c*c)

d=r(i+7)

x1=x0+d*s*cos(p)

y1=y0+d*s*sin(p)

z1=z0+d*c

if(abs(x1).gt.0.5*a)goto1

if(abs(y1).gt.0.5*a)goto1

if(abs(z1).gt.0.5*b)goto1

nin=nin+1.0

1continue

enddo

f=nin/n

fi(k)=f

write(2,'(5x,d13.8,5x,d13.8)')m,f

enddo

endprogrammc_1

rea

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1