基本介紹
- 中文名:蒲豐投針問題
- 外文名:Buffon's needle problem
- 別稱:布豐投針問題
- 提出者:布豐
- 提出時間:1777年
- 套用學科:計算圓周率,機率學
- 適用領域範圍:蒙特卡羅方法
投針步驟,實驗數據,證明,蒙特卡羅方法,
投針步驟
法國數學家布豐(1707-1788)最早設計了投針試驗。
這一方法的步驟是:
1) 取一張白紙,在上面畫上許多條間距為a的平行線。
2) 取一根長度為l(l≤a) 的針,隨機地向畫有平行直線的紙上擲n次,觀察針與直線相交的次數,記為m。
3)計算針與直線相交的機率.
布豐本人證明了,這個機率是:
(其中π為圓周率)
由於它與π有關,於是人們想到利用投針試驗來估計圓周率的值。
布豐驚奇地發現:有利的扔出與不利的扔出兩者次數的比,是一個包含π的表示式.如果針的長度等於a/2,那么有利扔出的機率為1/π.扔的次數越多,由此能求出越為精確的π的值。
實驗數據
下面是利用這個公式,用機率的方法得到圓周率的近似值的一些資料。
試驗者 | 時間 | 投擲次數 | 相交次數 | 圓周率估計值 |
---|---|---|---|---|
Wolf | 1850年 | 5000 | 2532 | 3.1596 |
Smith | 1855年 | 3204 | 1218.5 | 3.1554 |
C.De Morgan | 1860年 | 600 | 382.5 | 3.137 |
1884年 | 1030 | 489 | 3.1595 | |
Lazzerini | 1901年 | 3408 | 1808 | 3.1415929 |
Reina | 1925年 | 2520 | 859 | 3.1795 |
公元1901年,義大利數學家拉茲瑞尼宣稱進行了多次的投針試驗,每次投針數為3408次,平均相交數為1808次,給出π的值為3.1415929——準確到小數後6位。不過,不管拉茲瑞尼是否實際上投過針,他的實驗還是受到了美國猶他州奧格登的國立韋伯大學的L·巴傑的質疑.通過幾何、微積分、機率等廣泛的範圍和渠道發現π,這是著實令人驚訝的!
布豐投針實驗是第一個用幾何形式表達機率問題的例子,他首次使用隨機實驗處理確定性數學問題,為機率論的發展起到一定的推動作用。
證明
證明一:找一根鐵絲彎成一個圓圈,使其直徑恰恰等於平行線間的距離d。可以想像得到,對於這樣的圓圈來說,不管怎么扔下,都將和平行線有兩個交點。因此,如果圓圈扔下的次數為n次,那么相交的交點總數必為2n。現在構想把圓圈拉直,變成一條長為πd的鐵絲。顯然,這樣的鐵絲扔下時與平行線相交的情形要比圓圈複雜些,可能有4個交點,3個交點,2個交點,1個交點,甚至於都不相交。由於圓圈和直線的長度同為πd,根據機會均等的原理,當它們投擲次數較多,且相等時,兩者與平行線組交點的總數期望也是一樣的。這就是說,當長為πd的鐵絲扔下n次時,與平行線相交的交點總數應大致為2n。
為了求出k來,注意到l=πd時的特殊情形,有m=2n。於是求得。
代入前式就有:,將此結論推廣到l=a/2,那么最多也只有一個交點,m與n的比值是針與直線相交的機率。但此證明較不嚴謹,例如圓和直線期望相等,鐵絲與平行線的交點成正比。接下來用機率論和微積分提供嚴謹的證明。
證明二:由於向桌面投針是隨機的,所以用二維隨機變數(X,Y)來確定它在桌上的具體位置。設X表示針的中點到平行線的的距離,Y表示針與平行線的夾角,如果時,針與直線相交。
並且X在服從均勻分布,Y在服從均勻分布,XY相互獨立,由此可以寫出(X,Y)的機率密度函式
因此所求機率
蒙特卡羅方法
像投針實驗一樣,用通過機率實驗所求的機率來估計我們感興趣的一個量,這樣的方法稱為蒙特卡羅方法(Monte Carlo method)。當由於這類模型含有不確定的隨機因素,分析起來通常比確定性的模型困難.有的模型難以作定量分析,得不到解析的結果,或者是雖有解析結果,但計算代價太大以至不能使用.在這種情況下,可以考慮採用 Monte Carlo 方法,蒙特卡羅方法是在第二次世界大戰期間隨著計算機的誕生而興起和發展起來的。這種方法在套用物理、原子能、固體物理、化學、生態學、社會學以及經濟行為等領域中得到廣泛利用。
利用鈍角三角形的邊長計算圓周率
此外,隨便說出3個正數,以這3個正數為邊長可以圍成一個鈍角三角形的機率P也與π有關,這個機率為 (π-2)/4,證明如下:
設這三個正數為x,y,z,不妨設x≤y≤z,對於每一個確定的z,則必須滿足x+y>z,x^2+y^2﹤z^2,容易證明這兩個式子即為以這3個正數為邊長可以圍成一個鈍角三角形的充要條件,用線性規劃可知滿足題設的可行域為直線x+y=z與圓x^2+y^2=z^2;圍成的弓形,總的可行域為一個邊長為z的正方形,則可以圍成一個鈍角三角形的機率P=S弓形/S正方形=(πz^2/4-z^2/2)/z^2=(π-2)/4.因為對於每一個z,這個機率都為(π-2)/4,因此對於任意的正數x,y,z,有P=(π-2)/4,命題得證。
為了估算π的值,我們需要通過實驗來估計它的機率,這一過程可交由計算機編程來實現,事實上x+y>z,x^2+y^2﹤z^2等價於(x+y-z)(x^2+y^2-z^2)﹤0,因此只需檢驗這一個式子是否成立即可。若進行了m次隨機試驗,有n次滿足該式,當m足夠大時,n/m趨近於(π-2)/4,令n/m=(π-2)/4,解得π=4n/m+2,即可估計出π值。
值得注意的是這裡採用的方法:設計一個適當的試驗,它的機率與我們感興趣的一個量(如π)有關,然後利用試驗結果來估計這個量,隨著計算機等現代技術的發展,這一方法已經發展為具有廣泛套用性的蒙特卡羅方法。
計算機模擬
MATLAB語言編程實現:
l=1;
n=1000;
d=2;
m=0;
for k=l:n
x=unifrnd(0,d/2);
p=unifrnd(0,pi);
if x<0.5*sin(p)
m=m+1;
else
end
end
p=m/n
pi_m=1/p
運行,即得結果。
c++語言編程實現:
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include<iostream>
using namespace std;
int main()
{
longi,in,N=1000000;
doublex,y,pi;
srand(time(NULL));
for(i=0,in=0;i<N;i++)
{
x=2.0*rand()/RAND_MAX-1;
y=2.0*rand()/RAND_MAX-1;
if((x*x+y*y)<=1)
in++;
}
pi=4.0*in/N;
cout<<pi<<endl;
getch();
return 1;
}
#include<time.h>
#include<iostream>
using namespace std;
int main()
{
longi,in,N=1000000;
doublex,y,pi;
srand(time(NULL));
for(i=0,in=0;i<N;i++)
{
x=2.0*rand()/RAND_MAX-1;
y=2.0*rand()/RAND_MAX-1;
if((x*x+y*y)<=1)
in++;
}
pi=4.0*in/N;
cout<<pi<<endl;
getch();
return 1;
}
任意曲邊梯形面積的近似計水塘的面積.應該怎樣做呢?測量方法如下:假定水塘位於一塊面積已知的矩形農田之中。如圖 所示:隨機地向這塊農田扔石頭使得它們都落在農田內。被扔到農田中的石頭可能濺上了水,也可能沒有濺上水,估計被“濺上水的”石頭量占總的石頭量的百分比。試想如何利用這估計的百分比去近似計算該水塘面積?