Lesson 6 01: 蒙地卡羅方法求Pi值
Lesson 6 01: 蒙地卡羅方法求Pi值
產生兩組介於0.5-0.5的亂數(每組EVN個), 這EVN個亂數點將平均分佈在邊長爲1的正方形內(正方形的中心是位於原點(0,0). 我們可以已原點為中心,半徑爲0.5畫圓,由圓內的數據點跟EVN的比值,可以求出元的面積與圓周率
Example Code
- import numpy as np
- import math
- import matplotlib
- import matplotlib.pyplot as plt;
- EVN=100000;
- posX, posY = (np.random.rand(EVN)-0.5, np.random.rand(EVN)-0.5)
- poxInCirx, poxInCiry =([],[])
- [(poxInCirx.append(posX[x]), poxInCiry.append(posY[x]) ) for x in range(EVN) if math.hypot(posX[x],posY[x]) <=0.5]
- plt.plot(posX,posY, 'r.')
- plt.plot(poxInCirx,poxInCiry, 'go')
- plt.axes().set_aspect('equal')
- print("Monte Carlo Pi=", len(poxInCirx)/EVN*4)
- print("Error of Monte Carlo Pi=", (len(poxInCirx)/EVN*4-math.pi)/math.pi*100)
- plt.text(-0.15, -0.6, r'EVN=%d' %EVN, fontsize=20)
- plt.show()
Note and Comments
- import numpy as np
- import math
- import matplotlib
- import matplotlib.pyplot as plt; 匯入圖形函式庫Matplotlib中的pyplot資料庫
- EVN=100000; 宣告要產生多少數據點
- posX, posY = (np.random.rand(EVN)-0.5, np.random.rand(EVN)-0.5) 產生兩組-0.5到0.5的亂數, 每組有EVN個亂數點.
- poxInCirx, poxInCiry =([],[]) 產生兩組X跟Y的集合,用來存放半徑小於0.5
- [(poxInCirx.append(posX[x]), poxInCiry.append(posY[x]) ) for x in range(EVN) if math.hypot(posX[x],posY[x]) <=0.5]
- 將位於圓內的亂數點用append加到poxInCirx, poxInCiry數組內. math.hypot(x,y)函數將回傳(x*x+y*y)的根號值
- plt.plot(posX,posY, 'r.') 以(posX,posY) 爲數據點,2維作圖 顏色爲紅色r, 數據點以.表示
- plt.plot(poxInCirx,poxInCiry, 'go') 以(poxInCirx,poxInCiry) 爲數據點,2維作圖. 顏色爲綠色g, 數據點以o表示
- plt.axes().set_aspect('equal') 將圖的X軸與Y軸設爲相同比例
- print("Monte Carlo Pi=", len(poxInCirx)/EVN*4)
- print("Error of Monte Carlo Pi=", (len(poxInCirx)/EVN*4-math.pi)/math.pi*100)
- plt.text(-0.15, -0.6, r'EVN=%d' %EVN, fontsize=20) 將文字EVN=10000設置在-0.15, -0.6的位置
- plt.show() 圖形設定完畢,開始作圖
result