“投针实验 ”求圆周率的方法
- 格式:doc
- 大小:30.50 KB
- 文档页数:2
布丰用投针法得出圆周率的故事1777年的一天,法国科学家布丰的家里宾客满堂,原来他们是应主人的邀请前来观看一次奇特试验的。
试验开始,但见年已古稀的布丰先生兴致勃勃地拿出一张纸来,纸上预先画好了一条条等距离的平行线。
接着他又抓出一大把原先准备好的小针。
然后布丰先生宣布:“请诸位把这些小针一根一根往纸上扔吧!不过,请大家务必把扔下的针是否与纸上的平行线相交,以及相交的次数告诉我。
客人们不知布丰先生要玩什么把戏,只好客随主意,一个个加入了试验的行列。
一把小针扔完了,把它捡起来再扔。
而布丰先生本人则不停地在一旁数着、记着,如此这般地忙碌了将近一个钟头。
最后,布丰先生高声宣布:“先生们,我这里记录了诸位刚才的投针结果,共投针2212次,其中与平行线相交的有704次。
总次数2212与相交次数704的比值为3.142。
”说到这里,布丰先生故意停了停,并对大家报以神秘的一笑,接着有意提高声调说:“先生们,这就是圆周率π的近似值!”客人们一片哗然,议论纷纷,大家全都感到莫名其妙:“圆周率π?这可跟投针半点也不沾边呀!”布丰先生似乎猜透了大家的心思,得意洋洋地解释道:“诸位,这里用的是概率的原理,如果大家有耐心的话,再增加投针的次数,还能得到π的更精确的近似值呢。
”那么,“布丰投针实验”的依据究竟是什么呢?假设那组平行线的间距等于d。
如果把一个直径为d的铁丝圆圈,因为它的周长等于πd。
所以,不论怎样扔,圆圈落到那组平行线上,都会和平行线有两个交点。
因此,如果圆圈扔下的次数为n,交点的总数为m,必定有m=2n。
还用那组平行线,不过这回把圆圈剪开,变成长度是πd的直铁丝。
显然,直铁丝与平行线相交的情形要比圆圈复杂,最多可能有4个交点,也可能有3个交点、2个交点、1个交点,也可能不相交,没有交点。
不过,由于圆圈和直铁丝的长度相同,根据概率学的“机会均等原理”,当圆圈和直铁丝投掷的次数较多并且相等时,它们与平行线组的交点总数可望也是一样的。
教材提到了“投针实验”求圆周率的方法。
1777年,法国数学家蒲丰取一根针,量出它的长度,然后在纸上画上一组间距相等的平行线,这根针的长度是这些平行线的距离是的一半。
把这根针随机地往画满了平行线的纸面上投去。
小针有的与直线相交,有的落在两条平行直线之间,不与直线相交。
这次实验共投针2212次,与直线相交的有704次,2212÷704≈3.142。
得数竟然是π的近似值。
这就是著名的蒲丰投针问题。
后来他把这个试验写进了他的论文《或然性算术尝试》中。
蒲丰证明了针与任意平行线相交的概率为p= 2l/πd 。
这个公式中l为小针的长,d为平行线的间距。
由这个公式,可以用概率方法得到圆周率的近似值。
当实验中投的次数相当多时,就可以得到π的更精确的值。
蒲丰实验的重要性并非仅仅是为了求得比其它方法更精确的π值。
而在于它是第一个用几何形式表达概率问题的例子。
计算π的这一方法,不但因其新颖,奇妙而让人叫绝,而且它开创了使用随机数处理确定性数学问题的先河,是用偶然性方法去解决确定性计算的前导。
找一根粗细均匀,长度为 d 的细针,并在一张白纸上画上一组间距为l 的平行线(方便起见,常取l = d/2),然后一次又一次地将小针任意投掷在白纸上。
这样反复地投多次,数数针与任意平行线相交的次数,布丰(Comte de Buffon)设计出他的著名的投针问题(needleproblem)。
依靠它,可以用概率方法得到π的近似值。
假定在水平面上画上许多距离为a的平行线,并且,假定把一根长为l<a的同质均匀的针随意地掷在此平面上。
布丰证明:该针与此平面上的平行线之一相交的概率为:p=2l/(api) 把这一试验重复进行多次,并记下成功的次数,从而得到P的一个经验值,然后用上述公式计算出π的近似值,用这种方法得到的最好结果是意大利人拉泽里尼(Lazzeri ni)于1901年给出的。
用C语言计算蒲丰氏投针计算圆周率#include <stdio.h>#include <time.h>main(){int n1=0,n,i;double rand_num1,rand_num2;printf(" input the n:");printf("%d");for(i=0;i<n;i++){rand_num1=(double)time(0)*rand();while(rand_num1>1)rand_num1-=2;rand_num2=(double)time(0)*rand();while(rand_num2>1)rand_num2-=2;if(rand_num1*rand_num1+rand_num2*rand_num2<1)n1++;}printf("π=%f\n",4*n1/n);/* n1/n=π/4 距离小于1就是在圆里,取点范围在(-1,-1)到(1,1)的正方形里*/}MATLAB计算蒲丰氏投针计算圆周率(蒙特卡罗方法)cleara=1; l=0.6;counter=0;n=10000000;% 投掷次数x=unifrnd(0,a/2,1,n);%产生n个(0,a/2)之间均匀分布的随机数,这里a/2是投针的中点到最近的平行线的距离phi=unifrnd(0,pi,1,n);% 产生n个(0,pi)之间均匀分布的随机数,这里pi是投针到最近的平行线的角度for i=1:nif x(i)<l*sin(phi(i))/2 % 只要x小于l*sin(phi(i))/2,则相交counter=counter+1;endendfrequency=counter/n; % 计算相交的频率,即相交次数比总次数Pi=2*l/(a*frequency) % 从相交的频率总求的pi%运行结果>> testPi =3.1416一个蒲峰问题的蒙特卡罗方法实现的C语言程序。
一、问题的提出在人类数学文化史中,对圆周率π精确值的追求吸引了许多学者的研究兴趣。
在众多的圆周率计算方法中,最为奇妙的是法国物理学家布丰(Boffon)在1777年提出的“投针实验”。
与传统的“割圆术”等几何计算方法不同的是,“投针实验”是利用概率统计的方法计算圆周率的值,进而为圆周率计算开辟了新的研究途径,也使其成为概率论中很有影响力的一个实验。
本节我们将借助于MATLAB仿真软件,对“投针实验”进行系统仿真,以此来研究类比的系统建模方法和离散事件系统仿真。
二、系统建模“投针实验”的具体做法是:在一个水平面上画上一些平行线,使它们相邻两条直线之间的距离都为a;然后把一枚长为l(0<l<a)的均匀钢针随意抛到这一平面上。
投针的结果将会有两种,一种是针与这组平行线中的一条直线相交,一种是不相交。
设n为投针总次数,k为相交次数,如果投针次数足够多,就会发现公式2lnak计算出来的值就是圆周率π。
当然计算精度与投针次数有关,一般情况下投针次数要到成千上万次,才能有较好的计算精度。
有兴趣的读者可以耐心地做一下这个实验。
90)相交为了能够快速的得到实验结果,我们可以通过编写计算机程序来模拟这个实验,即进行系统仿真。
所谓的系统仿真是指以计算机为工具,对具有不确定性因素的、可模型化的系统的一种研究方法。
建立能够反映实验情况的数学模型是系统仿真的基础。
系统建模中需解决两个问题,一个是如何模拟钢针的投掷结果,另一个是如何判断钢针与平行线的位置关系。
这里,设O 为钢针中点,y 为O 点与最近平行线之间的距离,θ为钢针与平行线之间的夹角(0180θ≤<)。
首先,由于人的投掷动作是随机的,钢针落下后的具体位置也是随机的,因此可用按照均匀分布的两个随机变量y 和θ来模拟钢针投掷结果。
其次,人工实验时可以用眼睛直接判断出钢针是否与平行线相交,而计算机仿真实验则需要用数学的方法来判别。
如下图所示,如果y 、l 和θ满足关系式1sin 2y l θ≤,那么钢针就与平行线相交,否则反之,进而可以判断钢针与平行线的位置关系。
蒲丰投针最简单的代码
蒲丰投针是一种概率统计实验,可以用来求圆周率。
这里介绍一下最简单的蒲丰投针代码。
首先,需要导入Python中的random模块来生成随机数。
然后,定义需要用到的变量和常数,如针长(L)和两根地板板缝之间的距离(d)。
接下来,生成两个随机数,分别表示针的中心点距离地板板缝的距离(x)和针与竖直方向的夹角(theta)。
利用这两个随机数可以计算出针与地板板缝相交的情况。
再用一个计数器变量count来记录针与地板板缝相交的次数,重复这个实验若干次后,圆周率的近似值就可以通过下面的公式计算出来:
pi = 2 * L / (d * p)
其中,p为相交次数与总次数之比。
代码如下:
import random
L = 1 # 针长
d = 2 # 地板板缝间距
n = 10000000 # 实验次数
count = 0 # 相交次数
for i in range(n):
x = random.uniform(0, d) # 针中心距地板板缝距离
theta = random.uniform(0, 180) # 针与竖直方向的夹角
if x <= L * 0.5 * math.sin(theta / 180 * math.pi): # 判断是否相交
count += 1
p = count / n # 相交次数与总次数之比
pi = 2 * L / (d * p) # 计算圆周率
print(pi)
需要注意的是,模拟次数越多,计算出的圆周率越接近真实值。
但是过多的模拟次数会导致程序运行时间增长,因此需要根据实际情况来选择合适的实验次数。
投针问题概率计算
投针问题是一个著名的概率问题,其本质是求解一个针落在两个平行线之间的概率。
在这个问题中,我们假设有一根长度为L的针,在两个平行线之间随机投掷,求解针与线相交的概率。
假设这两条平行线的距离为D,那么可以通过几何分析,推导出针与线相交的概率为:
P=2L/πD
其中,π是圆周率。
通过这个公式,我们可以计算出针与线相交的概率。
不过需要注意的是,这个公式只适用于针的长度小于等于两条平行线之间的距离,否则会出现无法相交的情况。
投针问题是一个典型的几何概率问题,它不仅具有理论研究的价值,还有很多实际应用。
例如在统计物理中,可以通过投针问题来推导出理想气体状态方程,或者用于模拟随机游走等过程。
- 1 -。
小学趣味数学:比丰投针问题
比丰投针问题(Buffon'sneedleproblem)是第一个用几何形式表达概率问题的例子。
这问题是十八世纪法国数学家比丰和勒克莱尔提出的,并记载于比丰1777年出版的著作中──“在一平面上画有一组间距为d的并行线,将一根长度为L(L<d)的针任意投掷这个平面上,求此针与任一并行线相交的概率。
”。
比丰证明了该针与任意并行线相交的概率为p=2L/(dπ)。
利用这公式,将这一试验重复进行多次,并记下相交的次数,便得到p的经验值,即可算出圆周率π的近似值。
1850年沃尔夫在投掷五千多次后,得到π的近似值为3.1596.1855年英国人史密斯投了3200次,得到π的值为3.1533.
另一英国人福克斯只投了1100次,却得到了精确的三位小数的π值3.1419.直到目前,用这方法得到最好π值的是意大利人拉泽里尼,他在1901年投了3408次,得到的圆周率近似值精确到6位小数。
比丰投针问题开创了使用随机数处理确定性数学问题的先河,对概率论的发展有一定贡献。
——来源网络,仅供个人学习参考1 / 1。
Buffon投针实验一、实验目的:在计算机上用试验方法求圆周率的近似值。
二、实验原理:假设平面上有无数条距离为1的等距平行线,现向该平面随机投掷长度为L(L≤1)的针,则针与平行线相交的概率 P=。
设针的中心M与最近一条平行线的距离为x,则x~U(0,1);针与平行线的夹角为(不管相交与否),则~U(0,)如图:()在矩阵上均匀分布,且针与平行线相交的充要条件为x≤=;P=P{ x=}。
记录≤成立的次数,记为由-大数定理:≈,则=2。
在计算机上产生则=~U(0,),i=1,2,…,n;再产生,则, i=1,2,…,n三、实验方法及代码:在计算机上进行模拟实验,求出的实验值。
给定L,在计算机上利用MFC独立随机产生x和,然后判断≤是否成立.代码如下:#include "stdafx.h"#include "buffon.h"#include "ChildView.h"#include "ChoiceDlg.h"#include <ctime>#include <cmath>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// CChildViewCChildView::CChildView(){Trynum=1000;}CChildView::~CChildView(){}BEGIN_MESSAGE_MAP(CChildView,CWnd )//{{AFX_MSG_MAP(CChildView)ON_WM_PAINT()ON_COMMAND(ID_TOOL_NUM, OnToolNum)ON_COMMAND(ID_TOOL_RETRY, OnToolRetry)//}}AFX_MSG_MAPEND_MESSAGE_MAP()// CChildView message handlersBOOL CChildView::PreCreateWindow(CREATESTRUCT& cs){if (!CWnd::PreCreateWindow(cs))return FALSE;cs.dwExStyle |= WS_EX_CLIENTEDGE;cs.style &= ~WS_BORDER;cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);return TRUE;}void CChildView::OnPaint(){CPaintDC dc(this),*pDC;pDC=&dc;CFont font, *pOldFont;font.CreatePointFont(200,"宋体");pOldFont=pDC->SelectObject(&font);pDC->SetTextColor(RGB(255,0,0));pDC->TextOut(100,5,"蒲丰投针试验");pDC->SelectObject(pOldFont);CPen myPen1,myPen2, *pOldPen1,*pOldPen2;CRect rect1(30,30,920,620);pDC->Rectangle(rect1);myPen1.CreatePen(PS_SOLID, 1, RGB(0,0,255));pOldPen1=pDC->SelectObject(&myPen1);for(int i=100;i<600;i+=50){pDC->MoveTo(50,i);pDC->LineTo(900, i);}pDC->SelectObject(pOldPen1);myPen2.CreatePen(PS_SOLID, 1, RGB(0,255,0));pOldPen2=pDC->SelectObject(&myPen2);srand(time(0));int a,b,q,a1,b1,su,flag;np=0;for(int j=0;j<Trynum;j++){a=rand()%850+50;b=rand()%450+100;q=rand()%180;a1=25*cos(q);b1=25*sin(q);su=pow(-1,rand()%2);pDC->MoveTo((a-su*a1),(b-su*b1));pDC->LineTo((a+su*a1),(b+su*b1));if( (b%50) >= 25 )flag =50-b%50;elseflag = b%50;if( 25*sin(q) >= flag )np++;}pDC->SelectObject(pOldPen2);CString str;int c=Trynum/(np*1.0);int d=(int)((Trynum/(np*1.0)*100000))%100000;str.Format("投针次数:%d;\n相交次数:%d;\nπ的估算值:%d.%d",Trynum,np,c,d);MessageBox(str,"实验数据信息");}void CChildView::OnToolNum(){CChoiceDlg mydlg;if(mydlg.DoModal()==IDOK){this->Trynum = mydlg.m_Trynum ;this->RedrawWindow();}}void CChildView::OnToolRetry(){// TODO: Add your command handler code herethis->RedrawWindow();}四、实验数据处理与分析:根据实验数据,得到近似值为3.2313,可得相对误差为δ=(3.2313-π)/π≈0.02856;运行截图:五、实验小结:本次实验,通过MFC进行模拟投针,模拟效果较好,随着投针次数模拟的增多,实验结果逼近于π的真实值,但是实验程序有待优化,在较多投针次数的模拟中,实验程序运行速度较慢,可以改进相关算法来做适当调节。
教材提到了“投针实验”求圆周率的方法。
1777年,法国数学家蒲丰取一根针,量出它的长度,然后在纸上画上一组间距相等的平行线,这根针的长度是这些平行线的距离是的一半。
把这根针随机地往画满了平行线的纸面上投去。
小针有的与直线相交,有的落在两条平行直线之间,不与直线相交。
这次实验共投针2212次,与直线相交的有704次,2212÷704≈3.142。
得数竟然是π的近似值。
这就是著名的蒲丰投针问题。
后来他把这个试验写进了他的论文《或然性算术尝试》中。
蒲丰证明了针与任意平行线相交的概率为 p = 2l/πd 。
这个公式中l为小针的长,d为平行线的间距。
由这个公式,可以用概率方法得到圆周率的近似值。
当实验中投的次数相当多时,就可以得到π的更精确的值。
蒲丰实验的重要性并非仅仅是为了求得比其它方法更精确的π值。
而在于它是第一个用几何形式表达概率问题的例子。
计算π的这一方法,不但因其新颖,奇妙而让人叫绝,而且它开创了使用随机数处理确定性数学问题的先河,是用偶然性方法去解决确定性计算的前导。
找一根粗细均匀,长度为d 的细针,并在一张白纸上画上一组间距为l 的平行线(方便起见,常取l = d/2),然后一次又一次地将小针任意投掷在白纸上。
这样反复地投多次,数数针与任意平行线相交的次数,
布丰(Comte de Buffon)设计出他的著名的投针问题(needle problem)。
依靠它,可以用概率方法得到π的近似值。
假定在水平面上画上许多距离为a的平行线,并且,假定把一根长为l<a的同质均匀的针随意地掷在此平面上。
布丰证明:该针与此平面上的平行线之一相交的概率为:p=2l/(api) 把这一试验重复进行多次,并记下成功的次数,从而得到P的一个经验值,然后用上述公式计算出π的近似值,用这种方法得到的最好结果是意大利人拉泽里尼(Lazzerini)于1901年给出的。
他只掷了3408次针,就得到了准确到6位小数的π的值。
他的试验结果比其他试验者得到的结果准确多了,甚至准确到使人们对它有点怀疑。
还有别的计算π的概率方法。
例如,1904年,查尔特勒斯(R·Chartres)就写出了应用下列实例的报告:如果写下任意两个整数测它们互素的概率为6/π2。
下面就是一个简单而巧妙的证明。
找一根铁丝弯成一个圆圈,使其直径恰恰等于平行线间的距离d。
可以想象得到,对于这样的圆圈来说,不管怎么扔下,都将和平行线有两个交点。
因此,如果圆圈扔下的次数为n次,那么相交的交点总数必为2n。
现在设想把圆圈拉直,变成一条长为πd的铁丝。
显然,这样的铁丝扔下时与平行线相交的情形要比圆圈复杂些,可能有4个交点,3个交点,2个交点,1个交点,甚至于都不相交。
由于圆圈和直线的长度同为πd,根据机会均等的原理,当它们投掷次数较多,且相等时,两者与平行线组交点的总数可望也是一样的。
这就是说,当长为πd的铁丝扔下n次时,与平行线相交的交点总数应大致为2n。
现在转而讨论铁丝长为l的情形。
当投掷次数n增大的时候,这种铁丝跟平行线相交的交点总数m应当与长度l成正比,因而有:m=kl,式中k是比例系数。
为了求出k来,只需注意到,对于l=πk的特殊情形,有m=2n。
于是求得k=(2n)/(πd)。
代入前式就有:m≈(2ln)/(πd)从而π≈(2ln)/(dm)属于连续型随机变量。
概率为2/π = 64%。