蒙特卡罗(洛)方法及其在布丰投针试验中的应用(一)

何为蒙特卡罗方法

蒙特卡罗并不是一个人名,而是一座袖珍的赌城,蒙特卡罗方法不是一种具体的模型或者算法,而是一种解决多样问题的近似处理办法,其思想与概率论中的大数定理类似,即当样本容量⾜够⼤时,事件的发⽣频率即为其概率。

布丰投针试验

1)在一张空白纸上画许多条间距为a的平行线;
2)取长度为l(l 3)计算针与平行线相交的概率m/n。

解决问题的数学原理如下图所示:
蒙特卡罗(洛)方法及其在布丰投针试验中的应用(一)_第1张图片
最后通过概率相等,即 2 l π a = m n \frac{{{\rm{2l}}}}{{\pi {\rm{a}}}}{\rm{ = }}\frac{{\rm{m}}}{{\rm{n}}} πa2l=nm求出 π \pi π的近似值 π = m a 2 n l \pi {\rm{ = }}\frac{{{\rm{ma}}}}{{{\rm{2nl}}}} π=2nlma

matlab代码

用数字模拟单次布丰投针试验并作出图案

设置数学原理中涉及的各个参数

l = 0.5;  %针的长度
a = 1.2; %行与行间距
n = 100000; %投针次数
m = 0; %记录相交次数
x = rand(1,n) * a/2; %随机生成n个[0,a/2]内的数作为针的中点与最临近直线距离
phi = rand(1,n) * pi; %随机生成n个[0,π]内的数作为针与临近直线的夹角φ
 axis([0,pi, 0,a/2]); %做出横坐标为[0,π],纵坐标为[0,a/2]的平面坐标系

应用循环开始试验

for i = 1:n; %[1,n]区间内生成差值为1的等差数列,即循环n次,重复n次试验
  if x(i) <= l/2 * sin(phi(i)); %判断针与直线是否相交
  m = m+1; %相交次数加1(相当于计数器)
  plot(phi(i),x(i),'r.'); %以phi为横坐标,x为纵坐标绘图
  hold on; %在原有基础上继续打点(若不加最终结果只有一个点)
  end;
end;    

计算概率并输出

p = m/n; %算得概率
mypi = (2 * l)/(a * p); %根据公式计算出π
disp(['蒙特卡罗方法得到的pi为',num2str(mypi)]); %输出结果

求得的近似值和图像

π的近似值
蒙特卡罗(洛)方法及其在布丰投针试验中的应用(一)_第2张图片

多次试验求平均值

由于试验次数有限以及在一次实验中投针次数有限(实则是计算机性能限制),求得π的值有偏差,我们进行多次试验。

代码

result=zeros(100,1); %形成容量为100的初始化矩阵
l = 0.5;  
a = 1.2; 
n = 100000;
for num = 1:100;
m = 0; 
x = rand(1,n) * a/2; 
phi = rand(1,n) * pi; 
 for i = 1:n; 
  if x(i) <= l/2 * sin(phi(i)); 
  m = m+1; 
  end;
 end;    
p = m/n; 
mypi = (2 * l)/(a * p); 
result(num) = mypi; %试验结果存入矩阵
end;
meanpi = mean(result); %100次试验均值
disp(['蒙特卡罗方法得到的pi为',num2str(meanpi)]);

结果

100次试验结果求得的π的平均值

你可能感兴趣的:(数学建模)