今天看啥  ›  专栏  ›  焰雨追虹

【Python学习笔记】使用蒙特卡洛模拟计算圆周率

焰雨追虹  · 简书  ·  · 2020-01-24 22:53

一、蒙特卡洛模拟

蒙特卡罗方法(英語:Monte Carlo method),也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。—— 摘自维基百科

1.1 基本原理

蒙特卡罗方法基于这样的思想:假想你有一袋豆子,把豆子均匀地朝这个图形上撒,然后数这个图形之中有多少颗豆子,这个豆子的数目就是图形的面积。当你的豆子越小,撒的越多的时候,结果就越精确。借助计算机程序可以生成大量均匀分布坐标点,然后统计出图形内的点数,通过它们占总点数的比例和坐标点生成范围的面积就可以求出图形面积。

1.2 主要步骤

  1. 构建和描述概率过程;
  2. 实现从已知概率分布抽样;
  3. 建立各种估计量。

1.3 特点

随机采样上计算得到近似结果,随着采样的增多,得到正确结果的概率越大。

二、基于Python计算圆周率

# 运行于Jupyter Notebook
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#随机点的数量
n=10000
# 半径
r = 1.0
# 原点坐标
O_x,O_y = (0.0,0.0)
xmin,xmax = O_x-r,O_x+r
ymin,ymax = O_y-r,O_y+r

x = np.random.uniform(xmin,xmax,size=n)
y = np.random.uniform(ymin,ymax,size=n)

# 画图
fig = plt.figure(figsize=(9.0,9.0))
axes = fig.add_subplot(111)

plt.scatter(x,y,s=7)
plt.axis('equal')

#画圆
from matplotlib.patches import Circle
circle = Circle(xy = (O_x,O_y),radius = r,alpha=0.4,color='r')
axes.add_patch(circle)

plt.grid(True,linestyle='--',linewidth='0.8')

# 计算圆周率
d = np.sqrt((x-O_x)**2 + (y-O_y)**2)
res = np.sum(np.where(d<r,1,0))
pi = 4.0 * (res / n)



原文地址:访问原文地址
快照地址: 访问文章快照