蒙特卡罗方法入门
http://www.ruanyifeng.com/blog/2015/07/monte-carlo-method.html
?
作者:?阮一峰
日期:?2015年7月27日
本文通過五個(gè)例子,介紹蒙特卡羅方法(Monte Carlo Method)。
一、概述
蒙特卡羅方法是一種計(jì)算方法。原理是通過大量隨機(jī)樣本,去了解一個(gè)系統(tǒng),進(jìn)而得到所要計(jì)算的值。
它非常強(qiáng)大和靈活,又相當(dāng)簡(jiǎn)單易懂,很容易實(shí)現(xiàn)。對(duì)于許多問題來說,它往往是最簡(jiǎn)單的計(jì)算方法,有時(shí)甚至是唯一可行的方法。
它誕生于上個(gè)世紀(jì)40年代美國(guó)的"曼哈頓計(jì)劃",名字來源于賭城蒙特卡羅,象征概率。
二、π的計(jì)算
第一個(gè)例子是,如何用蒙特卡羅方法計(jì)算圓周率π。
正方形內(nèi)部有一個(gè)相切的圓,它們的面積之比是π/4。
現(xiàn)在,在這個(gè)正方形內(nèi)部,隨機(jī)產(chǎn)生10000個(gè)點(diǎn)(即10000個(gè)坐標(biāo)對(duì) (x, y)),計(jì)算它們與中心點(diǎn)的距離,從而判斷是否落在圓的內(nèi)部。
如果這些點(diǎn)均勻分布,那么圓內(nèi)的點(diǎn)應(yīng)該占到所有點(diǎn)的 π/4,因此將這個(gè)比值乘以4,就是π的值。通過R語(yǔ)言腳本隨機(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)動(dòng)。下面的例子模擬單車道的交通堵塞。
根據(jù) Nagel-Schreckenberg 模型,車輛的運(yùn)動(dòng)滿足以下規(guī)則。
- 當(dāng)前速度是 v 。
- 如果前面沒車,它在下一秒的速度會(huì)提高到 v + 1 ,直到達(dá)到規(guī)定的最高限速。
- 如果前面有車,距離為d,且 d < v,那么它在下一秒的速度會(huì)降低到 d - 1 。
- 此外,司機(jī)還會(huì)以概率 p 隨機(jī)減速, 將下一秒的速度降低到 v - 1 。
在一條直線上,隨機(jī)產(chǎn)生100個(gè)點(diǎn),代表道路上的100輛車,另取概率 p 為 0.3 。
上圖中,橫軸代表距離(從左到右),縱軸代表時(shí)間(從上到下),因此每一行就表示下一秒的道路情況。
可以看到,該模型會(huì)隨機(jī)產(chǎn)生交通擁堵(圖形上黑色聚集的部分)。這就證明了,單車道即使沒有任何原因,也會(huì)產(chǎn)生交通堵塞。
五、產(chǎn)品厚度
某產(chǎn)品由八個(gè)零件堆疊組成。也就是說,這八個(gè)零件的厚度總和,等于該產(chǎn)品的厚度。
已知該產(chǎn)品的厚度,必須控制在27mm以內(nèi),但是每個(gè)零件有一定的概率,厚度會(huì)超出誤差。請(qǐng)問有多大的概率,產(chǎn)品的厚度會(huì)超出27mm?
取100000個(gè)隨機(jī)樣本,每個(gè)樣本有8個(gè)值,對(duì)應(yīng)8個(gè)零件各自的厚度。計(jì)算發(fā)現(xiàn),產(chǎn)品的合格率為99.9979%,即百萬分之21的概率,厚度會(huì)超出27mm。
六、證券市場(chǎng)
證券市場(chǎng)有時(shí)交易活躍,有時(shí)交易冷清。下面是你對(duì)市場(chǎng)的預(yù)測(cè)。
- 如果交易冷清,你會(huì)以平均價(jià)11元,賣出5萬股。
- 如果交易活躍,你會(huì)以平均價(jià)8元,賣出10萬股。
- 如果交易溫和,你會(huì)以平均價(jià)10元,賣出7.5萬股。
已知你的成本在每股5.5元到7.5元之間,平均是6.5元。請(qǐng)問接下來的交易,你的凈利潤(rùn)會(huì)是多少?
取1000個(gè)隨機(jī)樣本,每個(gè)樣本有兩個(gè)數(shù)值:一個(gè)是證券的成本(5.5元到7.5元之間的均勻分布),另一個(gè)是當(dāng)前市場(chǎng)狀態(tài)(冷清、活躍、溫和,各有三分之一可能)。
模擬計(jì)算得到,平均凈利潤(rùn)為92, 427美元。
七,參考鏈接
- Introduction To Monte Carlo Methods,by Alex Woods
- Monte Carlo Simulation Tutorial
- 蒙特卡羅(Monte Carlo)方法簡(jiǎn)介,by 王曉勇
- 蒙特卡羅(Monte Carlo)模擬的一個(gè)應(yīng)用實(shí)例
(完)
?
?
?
總結(jié)
- 上一篇: 用钩子函数实现鼠标动作录制
- 下一篇: 正向代理和Nginx反向代理配置介绍