先來個(gè)測試題:
用仿真的方法計(jì)算圓周率π尘吗,請寫出計(jì)算步驟和簡單的公式:
(思考十秒鐘翎朱,想不出來可以繼續(xù)往下看斋日,后面有答案)
001 什么是蒙特卡洛模擬
蒙特卡洛模擬苞慢,又稱為統(tǒng)計(jì)實(shí)驗(yàn)方法
以概率論和統(tǒng)計(jì)理論方法為基礎(chǔ)的一種計(jì)算方法
通過隨機(jī)數(shù)來解決很多計(jì)算問題
主要步驟是:
將實(shí)際問題轉(zhuǎn)化為概率模型
通過計(jì)算機(jī)實(shí)現(xiàn)統(tǒng)計(jì)模擬,以獲得問題的近似解
002 基本原理
蒙特卡洛模擬抓住事物運(yùn)動的幾何數(shù)量和幾何特征儡炼,利用數(shù)學(xué)方法來模擬擎浴,是一種數(shù)字模擬實(shí)驗(yàn)期吓。它是一個(gè)以概率模型為基礎(chǔ),按照這個(gè)模型所描繪的過程焰檩,通過模擬實(shí)驗(yàn)的結(jié)果憔涉,作為問題的近似解订框。
可以把蒙特卡洛解法分為三步
1.構(gòu)造或描繪概率過程
2.實(shí)現(xiàn)從已知概率分布抽樣
3.建立各種估計(jì)量
借助計(jì)算機(jī)技術(shù)析苫,蒙特卡洛模擬方法有兩大優(yōu)點(diǎn)
1.簡單,省去了繁復(fù)的數(shù)學(xué)推導(dǎo)和驗(yàn)算過程穿扳,使普通人能夠理解
2.快速衩侥,確定了概率模型,后續(xù)運(yùn)算完全用計(jì)算機(jī)實(shí)現(xiàn)
蒙特卡洛模擬的特點(diǎn):
隨機(jī)采樣得到的近似解矛物,隨著隨機(jī)采樣數(shù)值增多茫死,得到正確結(jié)果的概率越大
003 怎么用
回到最初的測試題,用蒙特卡洛模擬計(jì)算圓周率π
圓周率π的計(jì)算推導(dǎo)十分復(fù)雜履羞,普通人難以明白峦萎,但是我們可以用數(shù)值模擬的方式計(jì)算出圓周率
在這個(gè)正方形內(nèi)部有個(gè)內(nèi)切圓,他們的面積之比是π/4
現(xiàn)在忆首,在這個(gè)正方形內(nèi)部隨機(jī)生產(chǎn)10000個(gè)點(diǎn)(坐標(biāo)是(x,y))爱榔,計(jì)算它們與中心點(diǎn)的距離,從而判斷是否落在圓內(nèi)糙及。
園內(nèi)的點(diǎn)數(shù)/正方形內(nèi)的點(diǎn)數(shù) = π/4
以此來計(jì)算得出π的值
直接上代碼(python3.6)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
%matplotlib inline
n = 10000
r = 1.0
a,b = (0.0,0.0)
xmin, xmax = a-r, a+r
ymin, ymax = b-r, b+r
x = np.random.uniform(xmin,xmax,n)
y = np.random.uniform(ymin,ymax,n)
fig = plt.figure(figsize=(6,6))
axes = fig.add_subplot(1,1,1)#添加子圖
#畫子圖
plt.plot(x,y,'ko',markersize = 1) #plot繪圖 markersize表示點(diǎn)的大邢暧摹;‘ro’r表示red浸锨,o表示圓圈
plt.axis('equal')
d = np.sqrt((x-a)**2 + (y-a)**2)
#res 得到圓中的點(diǎn)數(shù)
res = sum(np.where(d<r,1,0)) #numpy.where(conditon,x,y) 滿足條件輸出x唇聘,不滿足輸出y
pi = res/n*4
print('pi:',pi)
#計(jì)算pi的近似值,蒙特卡洛模擬方法柱搜,用統(tǒng)計(jì)值去近似真實(shí)值
#繪制圓形子圖
circle = Circle(xy = (a,b), radius = r,alpha = 0.5, color = 'gray')
axes.add_patch(circle)#添加圓形子圖
plt.grid(True,linestyle = '--',linewidth = '0.8')
plt.show()
#總結(jié)
#蒙特卡洛模擬是用統(tǒng)計(jì)值逼近真實(shí)值迟郎,展示了統(tǒng)計(jì)思想
JupyterNotebook運(yùn)行結(jié)果如下
隨著我們設(shè)置的點(diǎn)的數(shù)量n越多,計(jì)算的到的pi值就會越接近真實(shí)值3.1415926
好了聪蘸,蒙特卡洛模擬就講到這里谎亩。
這只是一個(gè)簡單的例子,關(guān)于真實(shí)場景下運(yùn)用蒙特卡洛模擬的例子宇姚,等我下一篇文章咯~
下一篇預(yù)告:用蒙特卡洛模擬人類財(cái)富分配