Matlab仿真-蒙特卡罗方法求半径为1圆的面积

试用蒙特卡罗方法求出半径为1的圆的面积,并与理论值对比。
(1)数学模型。
        设有两个相互独立的随机变量x,y,服从[0 2]上的均匀分布。那么,由它们所确定的坐标点(x,y)均匀分布于边长为2的一个正方形区域中,该正方形的内接圆的半径为1,显然,坐标点(x,y)落入圆中的概率p等于该圆的面积S1与正方形面积S2的比

所以圆面积                               S1=p*S2

因此,只要通过随机试验统计出落入圆点的频度,即可计算出圆的近似面积来。当随机试验的次数充分大的时候,计算结果就趋近于理论值\pi

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)]);

没跑出来...时间太长了

猜你喜欢

转载自blog.csdn.net/weixin_44422853/article/details/123334555
今日推荐