阮一峰:蒙特卡羅方法入門
一、概述
蒙特卡羅方法是一種計(jì)算方法。原理是通過大量隨機(jī)樣本,去了解一個(gè)系統(tǒng),進(jìn)而得到所要計(jì)算的值。
它非常強(qiáng)大和靈活,又相當(dāng)簡單易懂,很容易實(shí)現(xiàn)。對于許多問題來說,它往往是最簡單的計(jì)算方法,有時(shí)甚至是唯一可行的方法。
它誕生于上個(gè)世紀(jì) 40 年代美國的”曼哈頓計(jì)劃”,名字來源于賭城蒙特卡羅,象征概率。
二、π的計(jì)算
***個(gè)例子是,如何用蒙特卡羅方法計(jì)算圓周率π。
正方形內(nèi)部有一個(gè)相切的圓,它們的面積之比是π/4。
現(xiàn)在,在這個(gè)正方形內(nèi)部,隨機(jī)產(chǎn)生 10000 個(gè)點(diǎn)(即 10000 個(gè)坐標(biāo)對 (x, y)),計(jì)算它們與中心點(diǎn)的距離,從而判斷是否落在圓的內(nèi)部。
如果這些點(diǎn)均勻分布,那么圓內(nèi)的點(diǎn)應(yīng)該占到所有點(diǎn)的 π/4,因此將這個(gè)比值乘以4,就是π的值。通過R語言腳本隨機(jī)模擬 30000 個(gè)點(diǎn),π的估算值與真實(shí)值相差 0.07%。
三、積分的計(jì)算
上面的方法加以推廣,就可以計(jì)算任意一個(gè)積分的值。
比如,計(jì)算函數(shù) y = x2 在 [0, 1] 區(qū)間的積分,就是求出下圖紅色部分的面積。
這個(gè)函數(shù)在 (1,1) 點(diǎn)的取值為1,所以整個(gè)紅色區(qū)域在一個(gè)面積為 1 的正方形里面。在該正方形內(nèi)部,產(chǎn)生大量隨機(jī)點(diǎn),可以計(jì)算出有多少點(diǎn)落在紅色區(qū)域(判斷條件 y < x2)。這個(gè)比重就是所要求的積分值。
用 Matlab 模擬 100 萬個(gè)隨機(jī)點(diǎn),結(jié)果為 0.3328。
四、交通堵塞
蒙特卡羅方法不僅可以用于計(jì)算,還可以用于模擬系統(tǒng)內(nèi)部的隨機(jī)運(yùn)動。下面的例子模擬單車道的交通堵塞。
根據(jù) Nagel-Schreckenberg 模型,車輛的運(yùn)動滿足以下規(guī)則。
- 當(dāng)前速度是 v 。
- 如果前面沒車,它在下一秒的速度會提高到 v + 1 ,直到達(dá)到規(guī)定的***限速。
- 如果前面有車,距離為d,且 d < v,那么它在下一秒的速度會降低到 d – 1 。
- 此外,司機(jī)還會以概率 p 隨機(jī)減速, 將下一秒的速度降低到 v – 1 。
在一條直線上,隨機(jī)產(chǎn)生 100 個(gè)點(diǎn),代表道路上的 100 輛車,另取概率 p 為 0.3 。
上圖中,橫軸代表距離(從左到右),縱軸代表時(shí)間(從上到下),因此每一行就表示下一秒的道路情況。
可以看到,該模型會隨機(jī)產(chǎn)生交通擁堵(圖形上黑色聚集的部分)。這就證明了,單車道即使沒有任何原因,也會產(chǎn)生交通堵塞。
五、產(chǎn)品厚度
某產(chǎn)品由八個(gè)零件堆疊組成。也就是說,這八個(gè)零件的厚度總和,等于該產(chǎn)品的厚度。
已知該產(chǎn)品的厚度,必須控制在 27mm 以內(nèi),但是每個(gè)零件有一定的概率,厚度會超出誤差。請問有多大的概率,產(chǎn)品的厚度會超出 27mm?
取 100000 個(gè)隨機(jī)樣本,每個(gè)樣本有 8 個(gè)值,對應(yīng) 8 個(gè)零件各自的厚度。計(jì)算發(fā)現(xiàn),產(chǎn)品的合格率為 99.9979%,即百萬分之 21 的概率,厚度會超出 27mm。
六、證券市場
證券市場有時(shí)交易活躍,有時(shí)交易冷清。下面是你對市場的預(yù)測。
- 如果交易冷清,你會以平均價(jià) 11 元,賣出 5 萬股。
- 如果交易活躍,你會以平均價(jià) 8 元,賣出 10 萬股。
- 如果交易溫和,你會以平均價(jià) 10 元,賣出 7.5 萬股。
已知你的成本在每股 5.5 元到 7.5 元之間,平均是 6.5 元。請問接下來的交易,你的凈利潤會是多少?
取 1000 個(gè)隨機(jī)樣本,每個(gè)樣本有兩個(gè)數(shù)值:一個(gè)是證券的成本(5.5 元到 7.5 元之間的均勻分布),另一個(gè)是當(dāng)前市場狀態(tài)(冷清、活躍、溫和,各有三分之一可能)。
模擬計(jì)算得到,平均凈利潤為 92, 427 美元。