试用蒙特卡罗方法求出半径为1的圆的面积,并与理论值对比。
(1)数学模型。
设有两个相互独立的随机变量x,y,服从[0 2]上的均匀分布。那么,由它们所确定的坐标点(x,y)均匀分布于边长为2的一个正方形区域中,该正方形的内接圆的半径为1,显然,坐标点(x,y)落入圆中的概率等于该圆的面积与正方形面积的比
所以圆面积
因此,只要通过随机试验统计出落入圆点的频度,即可计算出圆的近似面积来。当随机试验的次数充分大的时候,计算结果就趋近于理论值。
Matlab代码
clear all;
s=0:0.01:2*pi; %
x=sin(s);
y=cos(s); %计算半径为1的圆周上的点,以便做出圆周观察
m=0; %计数器,计算落在院内的点
x1=2*rand(999,1)-1; %rand(999,1)生成999x1 的 0到1的均匀分布数组,2*rand(999,1)-1就是0到2减1,-1到1
y1=2*rand(999,1)-1; %产生均匀分布在[-1 1]之间的两个独立随机数x1 y1
N=999; %设置循环次数
for n=1:N %循环进行重复实验并统计
p1=x1(1:n);
q1=y1(1:n);
if(x1(n)*x1(n)+y1(n)*y1(n))<1 %计算落点到坐标原点的距离,落在圆中m+1
m=m+1;
end
plot(p1,q1,'.',x,y,'-k',[-1 -1 1 1 -1],[-1 1 1 -1 -1],'-k'); %画点,画圆圈线,画外面正方形,顺时针数到结束五个点。
axis equal; %坐标横纵比例相等
axis([-2 2 -2 2]); %固定坐标范围xmin xmax ymin ymax
text(-1,-1.2,['实验总次数 n=',num2str(n)]);
text(-1,-1.4,['落入圆中数 m=',num2str(m)]);
text(-1,-1.6,['近似圆面积 Sc=',num2str(m/n*4)]);
set(gcf,'DoubleBuffer','on'); %防止在不断循环画动画的时候会产生闪烁的现象
drawnow;
end
结果(质量不行,将就看)
为了让值精确到我们熟悉的3.1415...,可以增加实验次数
tic %启动计时器
n=10000000; %每次随机落点100000个
for k=1:n %重复试验1000次
x1=2*rand(n,1)-1;
y1=2*rand(n,1)-1;
m(k)=sum((x1.*x1+y1.*y1)<1);
end
Sc=mean(m).*4./n; %计算并显示结果
disp(['实验总次数 n=',num2str(n)]);
disp(['近似圆面积 Sc=',num2str(Sc)]);
time=toc %显示耗时
disp(['耗时 time=',num2str(time)]);
没跑出来...时间太长了