R語言對布豐投針(蒲豐投針)實驗進行模擬和動態可視化生成GIF動畫

原文鏈接:http://tecdat.cn/?p=13033


介紹

布豐投針是幾何概率領域中最古老的問題之一。它最早是在1777年提出的。它涉及將針頭放到襯有襯紙的紙上,並確定針頭越過頁面上一行的可能性。引人注目的結果是概率與pi的值直接相關。R程序將根據上段所述的情況估算pi的值並使用gganimate進行動態可視化。

第1部分

對於A部分,我們創建一個數據幀,該數據幀將在3個不同的間隔上生成隨機值,這些間隔將代表x,y的範圍以及每個落針點的角度。這是一個易於實現的隨機數情況,需要使用runif函數。此功能要求輸入數量,後跟一個間隔。生成數字後,我們會將值保存到數據框中。

rneedle <- function(n) {
  x = runif(n, 0, 5) 
  y = runif(n,0, 1)
  angle = runif(n,-pi, pi) #angle from -180 to 180 
  values<-data.frame(cbind(x, y, angle))
  return(values)
}
values<-rneedle(50)
#check that a 50 by 3 matrix is generated 

values
#Our dataframe has been successfully produced.
            x           y      angle
1  4.45796267 0.312440618  1.3718465
2  3.43869230 0.462824677  2.9738367
3  2.55561523 0.596722445 -2.9638285
4  3.68098572 0.670877506 -0.6860502
5  0.03690118 0.202724803 -0.3315141
6  4.64979938 0.180091416 -0.3293093
7  4.92459238 0.172328845 -0.5221133
8  3.50660347 0.752147374  2.9100221
9  2.03787919 0.167897415 -0.3213833
10 0.38647133 0.539615776 -0.1188982
11 3.28149935 0.102886770 -1.6318256
12 3.68811892 0.765077533  1.2459037
13 1.52004894 0.682455494 -0.4219802
14 3.76151379 0.508555610  0.1082087
...

 

第2部分

我們繪製第一部分中的針。重要的是不要在這個問題上出現超過2條水平線。它使我們可以進行較小的檢查以瞭解此處描繪的幾何特性的一般概念。話雖如此,讓我們注意我們決定在每個方向上將圖形擴展1個單位。原因是想象一個針的尾巴從y = 1開始,其角度爲pi / 2。我們需要假設該方向的範圍最大爲2。


plotneedle(values)

第3部分

在下面,將基於閱讀布馮針和基本幾何原理的知識,查看pi的估算值。


buffon(values) 

 

第4部分

運行代碼後,我們收到以下答案。> buffon(X)[1] 3.846154

set.seed(10312013)
X <- rneedle(50)
plotneedle(X)
buffon(X)
> buffon(X)
[1] 3.846154

 

第5部分

如前幾節所述,當我們放下更多的針頭時,我們期望以最小的可變性獲得更準確的答案。從Approxpi函數運行代碼後,我們收到了平均值= 3.172314和方差0.04751391的值。對於這樣一個簡單的實驗,它對pi進行了很高的估計。


Approxpi(500)
mean(Approxpi(500)) 
var(Approxpi(500)) 
> mean(Approxpi(500)) 
[1] 3.172314
> var(Approxpi(500)) 
[1] 0.04751391

接下來對模擬次數從500~600的預測進行動態可視化,紅色表示針投放到了直線上:

 

參考資料

Schroeder,L.(1974年)。布馮針問題:許多數學概念的激動人心的應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章