Matlab模拟蒲丰投针实验计算Π值

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, 0x2a,0ϕπ, S S S表示长宽分别为 a 2 \frac{a}{2} 2a π π π的长方形,要使针与平行线相交,必须保证 x ≤ l 2 s i n ϕ x≤\frac{l}{2}sin\phi x2lsinϕ,满足这个关系式的区域 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=SG=21aπ210π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
第一次1100003.148779847809
第二次1100003.147128245476
第三次11000003.149440974227
第四次11000003.140539125883
第五次110000003.144044393907
第六次110000003.145742237881
第七次1100000003.139098147566
第八次1100000003.142210146825
第九次1200000003.140213681074
第十次1300000003.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)
  • 23
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
根据引用中提供的信息,可以使用Matlab编写程序来模拟蒲丰投针实验的结果。以下是一个可能的Matlab代码示例: ```matlab % 设置参数 num_trials = 1000000; % 实验次数 needle_length = 1; % 针的长度 grid_size = 1; % 格子的大小 % 初始化计数器 num_crosses = 0; % 针和线相交的次数 num_hits = 0; % 针和线完全重合的次数 % 执行实验 for i = 1:num_trials % 生成随机位置和角度 x = rand() * grid_size; % 针的中心x坐标 y = rand() * grid_size; % 针的中心y坐标 angle = rand() * pi; % 针的角度(弧度制) % 计算针的两个端点的坐标 x1 = x - needle_length/2 * cos(angle); y1 = y - needle_length/2 * sin(angle); x2 = x + needle_length/2 * cos(angle); y2 = y + needle_length/2 * sin(angle); % 检查针是否和线相交 if (floor(y1) ~= floor(y2)) || (floor(x1) ~= floor(x2)) num_crosses = num_crosses + 1; end % 检查针是否和线完全重合 if (floor(y1) == floor(y2)) && (floor(x1) == floor(x2)) num_hits = num_hits + 1; end end % 计算概率和估计的圆周率 P = num_crosses / num_trials; Pi = (2 * needle_length) / (grid_size * P); % 显示结果 disp(['实验次数: ', num2str(num_trials)]); disp(['概率P: ', num2str(P)]); disp(['估计的圆周率Pi: ', num2str(Pi)]); ``` 该代码通过蒙特卡洛方法模拟蒲丰投针实验的结果,通过不断增加实验次数来获得更加精确的结果。该代码计算实验次数、概率P和估计的圆周率Pi,并将结果显示在命令窗口中。使用该代码可以得到通过Matlab进行蒙特卡洛模拟丰布投针实验的结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Matlab模拟蒲丰投针实验计算&Pi;](https://blog.csdn.net/qq_44744042/article/details/112171387)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [蒲丰投针问题](https://blog.csdn.net/weixin_30359737/article/details/118954495)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值