1.前言
学习了概率论,决定自己动手编程实现蒲丰投针实验来计算 π \pi π的值,其中本文代码部分参考了这篇文章.
2.实验目的
通过仿真模拟实现蒲丰投针实验来计算 π π π 值.
3.实验原理
(1)问题描述
平面上画着许多间距为 a a a的平行线,随机地向此平面任投掷一长度为 l ( l < a ) l(l<a) l(l<a)的针 N N N次,观察针与直线相交的次数记为 n n n,计算此针与任意直线相交的概率。
(2)问题求解
以 x x x表示针的中点到最近的一条平行线的距离, ϕ \phi ϕ表示针与平行线的夹角。可知 0 ≤ x ≤ a 2 , 0 ≤ ϕ ≤ π , 0≤x≤\frac{a}{2},0≤\phi≤\pi, 0≤x≤2a,0≤ϕ≤π,以 S S S表示长宽分别为 a 2 \frac{a}{2} 2a和 π π π的长方形,要使针与平行线相交,必须保证 x ≤ l 2 s i n ϕ x≤\frac{l}{2}sin\phi x≤2lsinϕ,满足这个关系式的区域 G G G为下图(图中 b b b即为 l l l)中黄色部分,则所求概率即表示为 p = G 的 面 积 S 的 面 积 = 1 2 ∫ 0 π l sin ϕ d ϕ 1 2 a π = 2 l π a p=\frac{G的面积}{S的面积}=\frac{\frac{1}{2}\int_0^\pi l\sin \phi d\phi}{\frac{1}{2}a \pi}=\frac{2l}{\pi a} p=S的面积G的面积=21aπ21∫0πlsinϕdϕ=πa2l.用频率 n N \frac{n}{N} Nn代替概率 p p p即可得 π = 2 l N a n \pi=\frac{2lN}{an} π=an2lN,并以此来计算 π \pi π值.
(图来源网络,侵删)
4.实验过程
根据实验原理用Matlab编写程序,通过蒙特卡洛法生成规定量的随机数模拟蒲丰投针实验的结果,通过不断增加试验次数来得到更加精确结果.
5.实验结果
a a a | n n n | P i Pi Pi | |
---|---|---|---|
第一次 | 1 | 10000 | 3.148779847809 |
第二次 | 1 | 10000 | 3.147128245476 |
第三次 | 1 | 100000 | 3.149440974227 |
第四次 | 1 | 100000 | 3.140539125883 |
第五次 | 1 | 1000000 | 3.144044393907 |
第六次 | 1 | 1000000 | 3.145742237881 |
第七次 | 1 | 10000000 | 3.139098147566 |
第八次 | 1 | 10000000 | 3.142210146825 |
第九次 | 1 | 20000000 | 3.140213681074 |
第十次 | 1 | 30000000 | 3.141194329202 |
6.实验结论
由实验结果可以看出,可以看出当 n n n足够大时,频率接近概率,蒲丰投针模拟实验可以得到较为精确的 π π π值。
7.Matlab代码
l = 0.6; %针长度
a = 1; %平行线宽度,l和a均可修改,只要满足l<a即可
n = 100000; %做n次投针试验
y = unifrnd(0, a/2, 1, n); %在[0, a/2]内服从均匀分布随机产生n个数
theta = unifrnd(0, pi, 1, n); %在[0, pi]内服从均匀分布随机产生n个数
k=sum(y<(l/2)*sin(theta));%记录针与平行线相交的次数
pival = (2*l*n)/(a*k);
z=sprintf('%.12f',pival);
disp(z)