Buffon投针试验
- 格式:pdf
- 大小:246.25 KB
- 文档页数:9
Buffon 掷针实验的计算机模拟实验的设计与实现收稿日期:2018-12-05基金项目:长沙理工大学大学生研究性学习与创新性实验项目(1203058);长沙理工大学教研教改项目(CNJG201808)作者简介:周浙泉,王志宇,张棣妍(女),隆超怡(女),长沙理工大学信息与计算科学专业2014级学生;万勇(1963-),硕士研究生,教授,研究方向:几何分析与偏微分方程。
一、研究背景18世纪,蒲丰(Buffon )提出Buffon 投针问题:(1)取一张白纸,在上面画上许多条间距为a 的平行线。
(2)取一根长度为l (l ≤a/2)的针,随机地向画有平行直线的纸上掷n 次,观察针与直线相交的次数,记为m 。
(3)计算针与直线相交的概率。
蒲丰证明了这个概率是:p=2l πa。
因为它与π有关,人们想到利用投针实验来估计圆周率的值。
历史上,有不少人做过蒲丰掷针实验:这个问题十分有趣,只是人工实验往往耗时、耗力,而用计算机模拟实验,却能迅速获得结果。
自从20世纪90年代美国率先开始数学实验以来,数学实验改变了人们传统的数学思维方式,人们发现数学是可以借助计算机去探索和发现的。
近十年来,国内外已有不少的数学实验教材和一些好的数学实验范例,但是这需要一定的计算机编程能力,如math-ematica 编程、matlab 编程等,才能实现人机对话,因此数学实验只能在具有一定数学知识和较高计算机编程能力的特定人群中使用,不能“飞入寻常百姓家”。
二、系统的设计本系统研发工具为Java 语言。
Java 是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java 看起来设计得很像C++,但是能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能将更多的时间和精力花在研发上。
Java 是一个面向对象的语言。
一、利用Matlab计算机语言验证蒲丰(Buffon)投针试验问题给定a=10,b=5时,模拟100万次投针实验的Matlab程序如下:a=10;b=5;n=1000000;p=10; % a为平行线间距,b为针的长度,n为投掷次数,p为有效数字位数x=unifrnd(0,a/2,[n,1]);phi=unifrnd(0,pi,[n,1]); % 产生均匀分布的随机数,分别模拟针的中点与最近平行线的距离和针的倾斜角y=x<0.5*b*sin(phi); m=sum(y); % 计数针与平行线相交的次数PI=vpa(2*b*n/(a*m),p)运行结果PI =3.138919145二、利用C++计算机语言编程通过大量重复实验验证以下结论:三个阄,其中一个阄内写着“有”字,两个阄内不写字,三人依次抓取,各人抓到“有”字阄的概率均为1/3。
程序如下:#include<stdio.h>#include<stdlib.h>#include<time.h>void main(){int n=500000;int i,a[3]={0};srand(time(NULL));for(i=0;i<n;i++)a[rand()%3]++;printf("共测试%d次,其中有字事件有%d次, 占%.2f%%\n""抓到无字事件1有%d次,占%.2f%%\n""抓到无字事件2有%d次,占%.2f%%\n""抓到无字事件共%d次,占%.2f%%",n,a[0],a[0]*100.0/n,a[1],a[1]*100.0/n,a[2],a[2]*100.0/n,a[1]+a[2],(a[1]+a[2])*100.0/n);return 0;}。
布丰投针实验详解1777年,法国数学家布丰(D,Buffon,1707年-1788年)提出了随机投针法并通过投针实验计算出了圆周率π的值,与刘徽的“割圆术”不同的是,随机投针法是利用概率统计的方法来计算圆周率π的值,开辟了计算圆周率的新途径,因此,“布丰投针实验”成为概率论中很有影响力的一个实验。
程序运行时,计算机上将显示出每次“投针实验”的具体情况,即显示当前总投掷的次数、钢针与平行线相交的次数以及由此计算出来的圆周率的值,当满足所设置的精度要求后,程序就停止运行,当钢针投掷276427次后,所计算出来的圆周率值满足精度要求,此时钢针与平行线相交131984次,圆周率计算结果为3.14159670869196.当然,由于“投掷动作”具有随机性,因此每次“投针实验”的仿真结果不一定相同,为了使计算结果更趋近于π,可以减小误差,取更小的s的值来提高计算的精度,当然仿真实验的时间也会随之变长,值得说明的是,若将一根钢丝弯成一个圆圈,使其直径恰好等于平行线间的距离a,投掷的结果不外乎有两种:一种是与一条平行线相交,一种是与相邻两条平行线相切,这两种情况都将导致圆圈和平行线有两个交点,因此,如果圆圈扔下的次数为n,那么相交的交点数必为2n。
若将圆圈拉直变成一根长为πa的钢针,显然,这样的钢针被扔下时与平行线相交的情形要比弯成圆圈的情况复杂得多,可能没有交点,还可能有1个交点、2个交点、3个交点、4个交点,由于圆圈和拉直后的钢针的长度相同,根据机会均等的原理可知,当投掷的次数足够多时,两者与平行线组的交点的总数将是一样的,换句话说,当长度为πa的钢针被扔下无穷多次后,它与平行线相交的交点总数也为2n。
從本质上看,上述投针实验运用了离散事件系统仿真,如果按照布丰的做法,进行成千上万次的投针实验和手工计算,势必要消耗大量的人力、物力和财力,而通过运用类比的方法,对实验进行系统建模,在此基础上使用计算机进行系统仿真来解决问题,事情就会变得非常简单,我们只需要根据已掌握的经验与认识,通过对比分析1,运用数学语言、数学符号、数学公式、数学概念等来表达这些量,从多种复杂的因素中抽取主要因素,忽略次要因素,抓住事物的本质特征,运用一系列等式或不等式来表达各个量之间的关系,从而建立起研究对象的数学模型,这有助于掌握复杂事物的内在规律。
布丰的投针试验公元1777年的一天,法国科学家布丰(D.Buffon1707-1788)的家里宾客满堂,原来他们是应主人的邀请前来观看一次奇特试验的。
试验开始,但见年已古稀的布丰先生兴致勃勃地拿出一张纸来,纸上预先画好了一条条等距离的平行线。
接着他又抓出一大把原先准备好的小针,这些小针的长度都是平行线间距离的一半。
然后布丰先生宣布:“请诸位把这些小针一根一根往纸上扔吧!不过,请大家务必把扔下的针是否与纸上的平行线相交告诉我。
”客人们不知布丰先生要干什么,只好客随主意,一个个加入了试验的行列。
一把小针扔完了,把它捡起来又扔。
而布丰先生本人则不停地在一旁数着、记着,如此这般地忙碌了将近一个钟头。
最后,布丰先生高声宣布:“先生们,我这里记录了诸位刚刚的投针结果,共投针2212次,其中与平行线相交的有704次。
总数2212与相交数704的比值为3.142。
”说到这里,布丰先生故意停了停,并对大家报以神秘的一笑,接着有意提升声调说:“先生们,这就是圆周率π的近似值!”众宾哗然,一时议论纷纷,个个感到莫名其妙。
“圆周率π?这不过与圆半点也不沾边的呀!”布丰先生似乎猜透了大家的心思,得意洋洋地解释道:“诸位,这里用的是概率的原理,假如大家有耐心的话,再增加投针的次数,还能得到π的更精确的近似值。
不过,要想弄清其间的道理,只好请大家去看敝人的新作了。
”说着布丰先生扬了扬自己手上的一本《或然算术试验》的书。
π在这种纷纭杂乱的场合出现,实在是出乎人们的意料,不过它却是千真万确的事实。
因为投针试验的问题,是布丰先生最先提出的,所以数学史上就称它为布丰问题。
布丰得出的一般结果是:假如纸上两平行线间相距为d,小针长为l,投针的次数为n,所投的针当中与平行线相交的次数是m,那么当n相当大时有:在上面故事中,针长l等于平行线距离d的一半,所以代入上面公式简化我想,喜欢思考的读者,一定想知道布丰先生投针试验的原理,下面就是一个简单而巧妙的证明。
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进行模拟投针,模拟效果较好,随着投针次数模拟的增多,实验结果逼近于π的真实值,但是实验程序有待优化,在较多投针次数的模拟中,实验程序运行速度较慢,可以改进相关算法来做适当调节。
数学学习真正悲哀的就是,记住了某个神奇而伟大的定理,看懂了其最严密的推导过程,但却始终没能直观地去理解它。
虽然严密的推导是必要的,直观理解往往是不准确的,但如果能悟出一个让定理一瞬间变得很显然的解释,这不但是一件很酷的事,而且对定理更透彻的理解和更熟练的运用也很有帮助。
我惊奇地发现,国内的每一本高数课本上都严格地讲解了微积分基本定理的证明,但几乎没有任何一个课本上讲过积分等于函数下方的图形面积究竟是为什么。
事实上,这几乎是显然的,但还是有不少人学完微积分后仍然没有意识到。
每当谈到这个问题时,我更愿意首先提出一个非常有启发性的事实——圆的周长是2·pi·r,圆的面积就是pi·r^2,后者的导数正好就是前者。
这个现象是很容易理解的,因为圆的半径每增加一点,面积增加的就是周长那么一圈,换句话说面积的变化就等于周长。
类似地,如果你能找到一个函数g(x),它的导数正好就是f(x),那么当x每增加一点,g(x)就增加了一条小竖线段,显然g(x)就应当是f(x)下方的面积。
看清了这一点之后,我们才能欣赏到微积分基本定理真正牛B的地方。
原先大家都是用分割求极限的办法来求函数下方的面积,但Leibniz却把面积看作一个可变的整体,用一种办法“一下子”就把它求了出来。
有趣的是,这种现在看来如此自然的神奇办法,一千多年来居然没有任何人想到。
数学中有很多直观上看很不可思议的东西。
比如,神秘的常数pi就经常出现在一些貌似和它毫无关系的地方,其中最经典的例子莫过于Buffon投针实验。
Buffon投针实验是说,假设地板上画着一组间距为1的平行线。
把一根长度为1的针扔到地上,则这根针与地板上的平行线相交的概率为2/pi。
很多概率论课本上都会用微积分计算可行范围的方法求解Buffon投针问题,计算过程显得相当麻烦。
我一直觉得,这个问题一定有一个异常直观、一目了然的解释,不过我还从来没见到过,自己也没有想到过。
关于Buffon掷针问题的深思
史及民
【期刊名称】《山西师大学报:自然科学版》
【年(卷),期】1996(010)002
【摘要】Buffon掷针问题在概率论研究过程中起过重要作用,对此大多数概率入门教程都已述及本文从比较研究角度讨论这问题,引出某些有启示性的结论。
【总页数】3页(P1-3)
【作者】史及民
【作者单位】山西师范大学数学系
【正文语种】中文
【中图分类】O211.1
【相关文献】
1.利用蒲丰(Buffon)投针问题在Excel中模拟π值 [J], 宗凤喜;李如兵
2.Buffon投针问题的高维推广 [J], 徐瑞标;陈峰
3.正三棱柱的Buffon投针问题 [J], 王媛媛;李德宜;李雪婵;余乐
4.蒲丰(Buffon)投针问题的一些推广 [J], 马丽;韩新方;杨小雪
5.Buffon掷针实验的计算机模拟实验的设计与实现 [J], 周浙泉; 王志宇; 张棣妍; 隆超怡; 万勇
因版权原因,仅展示原文概要,查看原文内容请购买。
(2006-3-7, 2009-9-18再修改)例 ( 蒲丰(Buffon )投针随机试验的讨论 ) 在平面上画有相互距离均为2a 的平行线束,向平面上随机投一枚长为2l 的针,为了避免针与两平行线同时相交的复杂情况,假定0>>l a , 设M 为针的中点,y 为M 与最近平行线的距离,φ为针与平行线的交角(如图1)a y ≤≤0, πϕ≤≤0. 于是,很明显,针与平行线相交的充要条件是ϕsin l y ≤(如图2),故相交的概率为ald l a dy d a p l πϕϕπϕπϕππ2 sin 1 1sin 000===⎰⎰⎰ (1) 我们用n 表示投针次数, n S 表示针与平行线相交次数,由大数定理知,当n 充分大时,频率接近于概率,即aln S n π2≈ 于是有naS nl2≈π (2)这就是上面所说的用随机试验求π值的基本公式。
根据公式(2),19—20世纪,曾有不少学者做了随机投针试验,并得到了π的估计值 . 其中最详细的有如下两个 :其中π的估计值就是利用π的近似公式(8)得到的,即1596.363320002532455000362≈=⨯⨯⨯≈π (Wolf )1415929.31133551808334085.22≈=⨯⨯⨯≈π (Lazzarini )一般情况下,随机抽样试验的精度是不高的,Wolf 的试验结果是π≈3.1596,只准确两位有效数字 .精度是由方差n p p n S D n )1(-=⎪⎭⎫⎝⎛决定的,为了确定概率p ,不妨取l =a 这一极限情况,这时π2≈p =0.6366,n n S D n 2313.0≈⎪⎭⎫⎝⎛,由积分极限定理, dx n p p p n S P x n n ⎰-∞→=⎪⎪⎭⎪⎪⎬⎫⎪⎪⎩⎪⎪⎨⎧≤--λλπλ221-e21)1(lim即频率n S n /近似地服从正态分布律()n p p p N /)1(,- . 如果要求以大于95%的概率(96.1=λ),保证以频率n S n /作为p 的近似值精确到三位有效数字,001.0≤-=p nS nε 即≈⎪⎪⎭⎫⎝⎛≤-001,0p n S P n 95.021/)1(001.0)1(001.0212≥⎰----np p np p x dx eπ则必须有96.1/)1(001.0=≥-λnp p根据上式,要求试验次数7.88001.0/231.096.122≈⨯≥n 万次 .至于Lazzarini 的试验,为什么实验次数少反而精确度却很高呢?这是由于这一试验结果恰好和祖冲之密率355/113相合,而祖冲之密率为无理数π的连分式,属于π的最佳有理逼近 . 很明显,作为一种具有随机性质的试验,其结果恰好与最佳有理逼近的结果一致是非常偶然的;顾及到上述讨论,故Lazzarini 的试验结果是不大可能的 .注:以上的讨论是第6章“假设检验”方法的一个有实际意义的例子。
Buffon投针实验的理论证明我们知道,当正多边形的边数无限增多时,它的极限是圆。
所以“圆”这种图形可以代表弯曲得最厉害的小针。
现在假定圆形小针的直径恰好与纸上两条相邻的平行线间的距离相等,那末这个圆形小针投掷下来时,不是和一条直线相交两次,就是和两条相邻的平行线相切。
不管怎样,它的相交次数是2。
因此,当投掷的次数为n时,碰线的次数便是2n。
现在小针的长度只有两条相邻平行线间距离的一半,所以针的长度只有上述圆形小针长度(即圆周长)的。
但是可能碰线的次数是与针的长度成正比的,因此小针的可能碰线的次数k就必须满足下面的比例式:1:(1/2π) =2n: k于是就得到π=n/k,也就是π=投掷总次数/碰线次数这就是上面“投针实验”的理论根据。
它又叫莆丰氏实验,在概率论中是很出名的,也可以说是近代的“统计试验法”(又叫“蒙特卡罗法”)的滥觞。
蒲丰(Buffon)投针求π蒲丰(Buffon)投针问题:在平面上画有等距离的一些平行线,平行线间的距离为a(a>0),向平面上随机投一长为l (l<a)的针,针与平行线相交的概率P,结果发现π=2*l/(a*p)。
一、实验目的蒲丰实验是采用投针来计算π的值,历史上也有许多的学者曾亲自做过这个实验,如下表:我们也可以来做这个实验,而且希望做更多次,但是投针又比较费时费力,于是,可以采用另一种设计随机实验的方法,随机模拟的办法来模拟蒲丰投针实验。
从而求得π的近似值。
二、实验方法可以采用MatLAB软件进行模拟实验,即用MATLAB编写程序来进行“蒲丰投针实验”。
1.基本原理:由于针投到纸上的时候,有各种不同的方向和位置(图a),但是,每一次投针时,其位置和方向都可以由两个量唯一确定,那就是针的中点和偏离水平的角度(图b)。
随机投针图针的某一特定位置于是,我们可以生成两个n*1随机矩阵,分别设为x和y,x 表示此时针的中点的位置,y表示此时针偏离水平方向的角度。