正方形內部有乙個相切的圓,它們的面積之比是π/4。
由圓面積和正方形面積公式可得:
s圓現在向上面的正方形區域均勻的隨機撒點,通過計算落在圓內的點數與總的點數來估計π面積s正
方形=π
r2(2
r)2=
π4
# -*- coding:utf8 -*-
import numpy as np
import matplotlib.pyplot as plt
defpi_exp
(r, n):
x = np.random.uniform(-r * 1.0, r * 1.0, (n,))
y = np.random.uniform(-r * 1.0, r * 1.0, (n,))
incircle = np.sum(np.power(x, 2) + np.power(y, 2) <= (r * 1.0)**2)
error = np.pi - (4.0 * incircle / n)
print error
######################################
theta = np.linspace(0, 2*np.pi, 3600)
cx = r * np.cos(theta)
cy = r * np.sin(theta)
plt.plot(cx,cy, color="r")
######################################
rx = np.asarray([-1, 1, 1, -1, -1] *r, dtype = np.float)
ry = np.asarray([1, 1, -1, -1, 1] *r, dtype = np.float)
plt.plot(rx,ry, color="b")
######################################
cl = ["r"
if i**2 + j**2
<= r else
"b"for i, j in zip(x,y)]
plt.scatter(x, y, c=cl)
plt.text(-1.2, 1.2, s = "r=, n=, error=, pi=".format(r=r, n=n, error=error, pi=np.pi))
plt.show()
if __name__ == "__main__":
pi_exp(1, 10000)
執行結果如下圖:
隨著取樣數的增大,**的
π 與真實
π 之間的誤差會越來越小。
參考:
蒙特卡洛方法計算圓周率
import random import math defcalpai n 10000000 隨機實驗次數 r 1.0 圓的半徑 a,b 0.0 0.0 中心點 x neg,x pos a r,a r x座標取值範圍 y neg,y pos b r,b r y座標取值範圍 count 0 落在圓內的...
蒙特卡洛法求圓周率
利用蒙特卡洛演算法求圓周率是乙個概率的方法,關於這方面的內容很多,而且也很容易理解,更多具體分析過程可以參考如下文章 下面是我的理解和 蒙特卡洛演算法是通過概率來計算pi的值的。對於乙個單位為1的正方形,以其某乙個頂點為圓心,邊為半徑在正方形內畫扇形 乙個1 4的圓形的扇形 那麼扇形的面積就是pi ...
利用蒙特卡洛演算法求圓周率
from 背景知識 蒙特卡洛是摩納哥公國第一大城市,與澳門 美國拉斯維加斯並稱世界三大賭城。位於地中海沿岸,首都摩納哥之北,建於阿爾卑斯山脈突出地中海的懸崖之上。景色優美,是地中海地區旅遊勝地。市內置有豪華的旅館 俱樂部 歌劇院 商店 游泳池 溫泉浴室 運動場等娛樂設施 城內開設有蒙特卡洛大賭場。賭...