蒙特卡洛模拟方法
蒙特卡洛方法(Monte Carlo method)是指的通过大量产生随机数的模拟方法来用于数值统计计算以获得问题的近似解。蒙特卡洛方法最简单的计算就是用于pi的计算。
Pi的计算
采用蒙特卡洛方法计算Pi就是使用随机产生点(x,y),x和y均为0~1之间的数值,然后判断该点和原点之间的距离,如果少于等于1则表示其位于圆圈内,由圆的面积公式即可得pi的值就近似等于圆圈内的概率与4的积。
Python代码如下:
import math
import random
def calc_pi(times):
""" 采用蒙特卡罗算法计算pi """
random.seed()
in_circle = 0
for _ in range(times):
x,y = random.random(), random.random()
if x**2 + y**2 <= 1:
in_circle += 1
return 4*in_circle/times
def main():
for i in range(2, 10):
times = 10**i
pi = calc_pi(times)
sq = abs(pi - math.pi)/math.pi*100
print("蒙特卡罗模拟次数:{}, 结果:{}, 误差:{}%".format(times, pi, sq))
if __name__ == '__main__':
main()
其结果如下:
蒙特卡罗模拟次数:100, 结果:3.2, 误差:1.8591635788130243%
蒙特卡罗模拟次数:1000, 结果:3.224, 误差:2.6231073056541225%
蒙特卡罗模拟次数:10000, 结果:3.1512, 误差:0.3058113342361133%
蒙特卡罗模拟次数:100000, 结果:3.13928, 误差:0.073614050094963%
蒙特卡罗模拟次数:1000000, 结果:3.143012, 误差:0.045179199428836934%
蒙特卡罗模拟次数:10000000, 结果:3.1419012, 误差:0.00982133727153544%
蒙特卡罗模拟次数:100000000, 结果:3.1416454, 误差:0.0016789703829496415%
蒙特卡罗模拟次数:1000000000, 结果:3.14167924, 误差:0.002756131037808187%
优点和缺点
从蒙特卡洛方法的计算方法和思路可以知道如下,其本质是通过大量的模拟随机数来完成对应的近似值估计,因此其主要优点和缺点如下:
-思想较简单,易于实现,可以有广泛的应用
-部分应用问题只能通过模拟来求解
-时间复杂度和空间复杂度较高
-近似解,对于模拟的随机值必须有初步的概率了解,否则其模型的选择对结果影响很大