袁佳婧


摘 要:蒙特卡羅模擬是通過計算機模擬實際發生的事情。通過蒙特卡羅模擬能計算出相應事件發生的概率,模擬與計算過程有效、可行、易理解。其基本思想是,將各種隨機事件的概率特征與模擬聯系起來,用試驗的方法確定事件的相應概率與數學期望。應用蒙特卡羅模擬方法解決了實際概率問題,為解決用傳統方法不能解決的問題,提供了有意義的參考。主要介紹蒙特卡羅方法及基本原理,并通過實例說明蒙特卡羅方法在數學建模中的應用。
關鍵詞:蒙特卡羅模擬;隨機試驗;正態分布;數學建模
中圖分類號:TB 文獻標識碼:Adoi:10.19311/j.cnki.1672-3198.2019.11.106
1 蒙特卡羅方法與基本原理
蒙特卡羅方法又稱為計算機模擬方法,它是以概率統計理論為基礎的一種方法。該方法與一般數值計算方法有本質區別,蒙特卡羅模擬采用的是頻率近似概率的數學思想,來解決物理、數學、生產管理或工程技術等方面的問題。蒙特卡羅方法的起源,最早可以追溯到18世紀下半葉時,由Buffon提出的用試驗的方法求值,即:蒲豐投針問題。蒲豐投針問題的解決方法就是蒙特卡羅模擬的典型運用。當時的投針試驗是利用人工進行實際操作,然后統計試驗結果,最后得出結論。但是人工進行大量實際的隨機試驗,一方面成本較高;另一方面統計結果的準確率較低,因此只能稱Buffon試驗只能稱為近代統計模擬的雛形。隨著現今計算機技術的高速發展,蒙特卡羅模擬實驗已不再需要人工實際操作,通過計算機隨機模擬更加方便快捷,所得的估計值也更精確。
蒙特卡羅模擬方法求解概率問題的基本思想是:當所求問題的解是某個隨機變量的數學期望或者某個事件的概率,或者是與數學期望、概率有關的量時,通過試驗的方法模擬事件的發生,求出該事件發生的頻率,計算所求參數的統計特征,最后給出近似值作為問題的解。
2 實際問題
校車在每個工作日,都會在A校區與B校區之間擺渡。李華家住B校區附近。校車從A校區到B校區的運行時間服從均值為30分鐘,標準差為2分鐘的正態隨機分布。校車大約中午13:00從A校區出發,李華大約13:30步行到達B校區,校車從A校區出發的時刻及概率如表1所示。
3 問題分析
記T1為校車從A校區出發的時刻,T2為校車從A校區到B校區運行的時間,T3為李華到達B校區的時刻。T1、T2、T3均是隨機變量,且T2~N(30,22),T1、T3的分布律如表所示:其中記中午13時為時刻t=0。
通過分析可知,此人能及時趕上校車的充分必要條件是:T1+T2>T3。由此得到,此人趕上校車的概率是P{T1+T2>T3}。
4 建立模型
利用蒙特卡羅方法隨機模擬校車出發時刻,校車車運行時間,李華到達B校區的時刻。然后判斷多次試驗中滿足上述充要條件的試驗有多少次。若在n次試驗中,有k次成功,則用頻率k/n作為李華能趕上校車的概率。當n很大時,頻率值與概率值近似相等。
設r1,r2 是(0,1)區間上均勻分布的隨機數。則T1,T3的分布律的模擬公式為:
t1=0,0 令 t2 是服從正態分布N(30,22) 的隨機數,則將t2 看成火車運行時間T2的觀察值。 在每次試驗中,產生兩個U(0,1) 的隨機數r1,r2,來構造 t1,t3。產生一個N(30,22) 的隨機數r3,來構造 t2。當 t1+t2>t3,認為試驗成功(能夠趕上校車)。若在n次試驗中,有k次成功,則用頻率k/n 作為此人趕上火車的概率。當n很大時,頻率值與概率值近似相等。 5 模型求解 下面是利用python語言進行蒙特卡羅模擬的程序。其中montefun()是自定義的蒙特卡羅模擬函數。 import numpy as np def montefun(): t1 = np.random.rand() t2 = np.random.normal(30,2) t3 = np.random.rand() arrtime1=0 arrtime2=t2 arrtime3=0 if t1<0.7: arrtime1=0 elif 0.7<=t1<0.9: arrtime1=5 else: arrtime1 = 10 if t3 < 0.3: arrtime3 = 28 elif 0.3<= t3 <0.7: arrtime3 = 30 elif 0.7<= t3 < 0.9: arrtime3 = 32 else: arrtime3 = 34 return arrtime1,arrtime2,arrtime3 if __name__ == "__main__": t=0 f=0 for i in range(10000): t1,t2,t3 = montefun() if (t1 +t2) > t3: t+=1 else: f += 1 print (float(t)/10000) 程序運行的最后結果為:0.6317,故李華可以趕上校車的概率是0.6317。 6 模型推廣 眾所周知,在實際生活中有很多概率事件,這些事件可能沒有明確的概率分布。這種情況下,蒙特卡羅模擬是最有效且直接的方法。 我們都玩過套圈圈的游戲:游戲者拿著圈,去套擺放在地上的玩具,如果套中即可拿走。這個游戲貌似很誘人,但事實上投圈游戲攤的老板是穩賺不賠的。現在我們用蒙特卡羅模擬計算能套中的概率,證明這個事實。 假設目標物品中心點的坐標為(0,0),目標物品的半徑為5cm。下面用python代碼畫出目標物品坐標圖。 import matplotlib.pyplot as plot import numpy as np import matplotlib.patches as mpts target_circle = mpts.circle([0,0],radius=5,edgecolor='r',fill=False) plot.ylim(-80,80) plot.xlim(-80,80) plot.axes().add_patch(circle_target) plot.show() 代碼運行后得到目標物品,如圖1所示。 對此我們假設投圈的半徑為8cm。投圈中心點圍繞目標物品中心點呈二維正態分布,且假設其均值和標準差分別為:μ=0cm,σ=20cm。模擬1000個參與游戲者每人投圈1 次,即模擬投圈過程1000次。用python代碼完成模擬的程序如下。 N=1000 u,beta = 0,20 points = u + beta * np.random.randn(N,2) plot.scatter ( [x[0] for x in points],[x[1] for x in points],c=np.random.rand(N),alpha=0.5) 運行代碼之后,得到的投圈中心點的分布圖如圖2所示。 計算1000次投圈的過程中,投圈能夠套住目標物品的概率。用python代碼完成計算:print(len([xy for xy in points if xy[0] ** 2 + xy[1] ** 2 < (8-5) ** 2])/N)。 代碼執行后輸出的結果值為0.012。可以解釋為投圈1000次,其中只有12次能夠套住物品。這是個小概率事件,所以不難理解投圈游戲的老板幾乎時穩賺不賠了。 7 總結 蒙特卡羅方法的發明,無疑是人類思維史上的重大突破。通過一個隨機性的構想,它打破了過去的思考空白區,開啟了人類新的思維空間。 蒙特卡羅方法的使用過程可以歸納為以下三個主要步驟: (1)構造概率過程:對于本身具有隨機性質的問題,需要正確地描述和模擬這個概率過程;對于本來不是隨機性質的確定性問題,需要事先人為地構造概率過程,將不具有隨機性質的問題轉化為隨機性質的問題。 (2)利用概率分布抽樣:各種概率模型可以看作是由各種各樣的概率分布構成的,所以實現蒙特卡羅方法模擬實驗的基本手段是產生已知概率分布的隨機變量。然后依據概率分布進行隨機抽樣模擬概率過程。 (3)建立估計量:實現模擬實驗后確定一個隨機變量,作為所要求的問題的解。蒙特卡羅方法通過構造符合一定規則的隨機數來解決各種實際問題。對于那些由于計算過于復雜而難以得到解析解或者根本沒有解析解的問題,蒙特卡羅方法是一種有效的求出數值解的方法。 蒙特卡羅模擬方法的優點是能夠比較逼真地描述具有隨機性質的事物的特點及物理實驗過程。受幾何條件限制小。程序結構簡單,易于實現。是中學生入門數學建模與實驗的不二選擇。 參考文獻 [1]向東等.蒙特卡羅方法在核類本科專業的教學初探[J].價值工程,2010,(29). [2]孫榮恒.趣味隨機問題[M].北京:科學出版社,2008. [3]徐鐘濟.蒙特卡羅方法[M].上海:上海科學技術出版社,1985. [4]宋來忠等.數學建模常用方法與實驗[M].北京:科學出版社,2015. [5]汪曉銀等.數學建模方法入門及其應用[M].北京:科學出版社,2018.