Simulation

近似𝑒ee使用蒙特卡羅模擬

  • February 4, 2016

我最近一直在研究蒙特卡洛模擬,並一直在使用它來近似常數,例如(矩形內的圓圈,比例區域)。

但是,我想不出相應的方法來近似[歐拉數] 使用蒙特卡洛積分。

您對如何做到這一點有任何指示嗎?

簡單而優雅的估算方法 $ e $ Monte Carlo 在本文中進行了描述。這篇論文實際上是關於教學的 $ e $ . 因此,該方法似乎非常適合您的目標。這個想法是基於 Gnedenko 的一本流行的烏克蘭概率論教科書的練習。見第 183 頁的 ex.22

它的發生是這樣的 $ E[\xi]=e $ , 在哪裡 $ \xi $ 是一個隨機變量,定義如下。這是最小數量 $ n $ 這樣 $ \sum_{i=1}^n r_i>1 $ 和 $ r_i $ 是來自均勻分佈的隨機數 $ [0,1] $ . 漂亮,不是嗎?!

由於這是一個練習,我不確定我在這裡發布解決方案(證明)是否很酷:)如果您想自己證明,這裡有一個提示:本章稱為“時刻”,應該指出你在正確的方向。

如果您想自己實現它,請不要進一步閱讀!

這是一個簡單的蒙特卡羅模擬算法。抽一個統一的隨機數,然後再抽一個,依此類推,直到總和超過 1。抽出的隨機數是您的第一次試驗。假設你有:

0.0180
0.4596
0.7920

然後你的第一個試驗呈現 3. 繼續做這些試驗,你會注意到平均你得到 $ e $ .

MATLAB 代碼、仿真結果和直方圖如下。

N = 10000000;
n = N;
s = 0;
i = 0;
maxl = 0;
f = 0;
while n > 0
   s = s + rand;
   i = i + 1;
   if s > 1
       if i > maxl
           f(i) = 1;
           maxl = i;
       else
           f(i) = f(i) + 1;
       end
       i = 0;
       s = 0;
       n = n - 1;
   end
end

disp ((1:maxl)*f'/sum(f))
bar(f/sum(f))
grid on

f/sum(f)

結果和直方圖:

2.7183


ans =

 Columns 1 through 8

        0    0.5000    0.3332    0.1250    0.0334    0.0070    0.0012    0.0002

 Columns 9 through 11

   0.0000    0.0000    0.0000

在此處輸入圖像描述

更新:我更新了我的代碼以擺脫試驗結果數組,這樣它就不會佔用 RAM。我還打印了 PMF 估計值。

更新 2:這是我的 Excel 解決方案。在 Excel 中放置一個按鈕並將其鏈接到以下 VBA 宏:

Private Sub CommandButton1_Click()
n = Cells(1, 4).Value
Range("A:B").Value = ""
n = n
s = 0
i = 0
maxl = 0
Cells(1, 2).Value = "Frequency"
Cells(1, 1).Value = "n"
Cells(1, 3).Value = "# of trials"
Cells(2, 3).Value = "simulated e"
While n > 0
   s = s + Rnd()
   i = i + 1
   If s > 1 Then
       If i > maxl Then
           Cells(i, 1).Value = i
           Cells(i, 2).Value = 1
           maxl = i
       Else
           Cells(i, 1).Value = i
           Cells(i, 2).Value = Cells(i, 2).Value + 1
       End If
       i = 0
       s = 0
       n = n - 1
   End If
Wend


s = 0
For i = 2 To maxl
   s = s + Cells(i, 1) * Cells(i, 2)
Next


Cells(2, 4).Value = s / Cells(1, 4).Value

Rem bar (f / Sum(f))
Rem grid on

Rem f/sum(f)

End Sub

在單元格 D1 中輸入試驗次數,例如 1000,然後單擊按鈕。這是第一次運行後屏幕的樣子:

在此處輸入圖像描述

更新 3: Silverfish 以另一種方式啟發了我,雖然不像第一個那樣優雅,但仍然很酷。它使用Sobol序列計算了 n-單純形的體積。

s = 2;
for i=2:10
   p=sobolset(i);
   N = 10000;
   X=net(p,N)';
   s = s + (sum(sum(X)<1)/N);
end
disp(s)

2.712800000000001

巧合的是,他寫了我在高中讀過的第一關於蒙特卡洛方法的書。在我看來,這是對該方法的最佳介紹。

更新 4:

評論中的 Silverfish 建議了一個簡單的 Excel 公式實現。這是你在大約 100 萬個隨機數和 185K 次試驗後使用他的方法得到的結果:

在此處輸入圖像描述

顯然,這比 Excel VBA 實現要慢得多。特別是,如果您修改我的 VBA 代碼以不更新循環內的單元格值,並且僅在收集所有統計信息後才執行此操作。

更新 5

西安的解決方案#3 密切相關(甚至在某種意義上與 jwg 在線程中的評論相同)。很難說是誰首先提出了這個想法,Forsythe 或 Gnedenko。Gnedenko 的 1950 年俄文原版在章節中沒有問題部分。所以,乍一看,我在以後的版本中找不到這個問題。也許它是後來添加的或埋在文本中。

正如我在西安的回答中評論的那樣,Forsythe 的方法與另一個有趣的領域有關:隨機 (IID) 序列中峰值(極值)之間的距離分佈。平均距離恰好是 3。Forsythe 方法中的向下序列以底部結束,因此如果您繼續採樣,您將在某個點得到另一個底部,然後是另一個底部,等等。您可以跟踪它們之間的距離並建立分佈。

引用自:https://stats.stackexchange.com/questions/193990

comments powered by Disqus