一、概念

蒙特卡罗方法(Monte Carlo method),也称 统计模拟方法
蒙特卡洛方法的理论基础是大数定律。大数定律是描述相当多次数重复试验的结果的定律,在大数定理的保证下:

利用事件发生的 频率 作为事件发生的 概率 的近似值。

所以只要设计一个随机试验,使一个事件的概率与某未知数有关,然后通过重复试验,以频率近似值表示概率,即可求得该未知数的近似值。

样本数量越多,其平均就越趋近于真实值。

此种方法可以求解微分方程,求多重积分,求特征值等。


二、思考步骤

蒙特卡罗方法一般分为三个步骤,包括构造随机的概率的过程,从构造随机概率分布中抽样,求解估计量。

1 构造随机的概率过程
对于本身就具有随机性质的问题,要正确描述和模拟这个概率过程。对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为的概率过程了。它的某些参数正好是所要求问题的解,即要将不具有随机性质的问题转化为随机性质的问题。如本例中求圆周率的问题,是一个确定性的问题,需要事先构造一个概率过程,将其转化为随机性问题,即豆子落在圆内的概率,而π就是所要求的解。

2 从已知概率分布抽样
由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量,就成为实现蒙特卡罗方法模拟实验的基本手段。如本例中采用的就是最简单、最基本的(0,1)上的均匀分布,而随机数是我们实现蒙特卡罗模拟的基本工具。

3 求解估计量
实现模拟实验后,要确定一个随机变量,作为所要求问题的解,即无偏估计。建立估计量,相当于对实验结果进行考察,从而得到问题的解。如求出的近似π就认为是一种无偏估计。


三、特点

一般情况下,蒙特卡罗算法的特点是,采样越多,越近似最优解,而永远不是最优解。
优点:对于具有统计性质的问题可以直接进行解决,对于连续性的问题也不必进行离散化处理。
缺点
1、对于确定性问题转化成随机性问题做的估值处理,丧失精确性,得到一个接近准确的N值也不太容易。
2、如果解空间的可能情况很多则很难求解(NP问题)

与穷举法的区别:

穷举法是按某特定规则进行搜索
蒙特卡洛方法则是随机搜索

但是两者都是属于盲目搜索

四、举例应用

求圆周率。计算圆周率时可以考虑将一个单位圆放在一个正方形中,从而将求解圆周率转化为计算出圆和正方形面积的比例。
在这里插入图片描述
蒙特卡罗方法的基本思想是这样:假想你有一袋豆子,把豆子均匀地朝这个正方形上撒,然后数落在圆内的豆子数占正方形内豆子数的比例,即可计算出圆的面积,近而计算出π。而且当豆子越小,撒的越多的时候,结果就越精确。

借助计算机程序可以生成大量均匀分布的坐标点,接着统计出图形内的点数,通过它们占总点数的比例和坐标点生成范围的面积就可以求出的近似值。

python代码引用参考文献1

import random
import math
import getopt
import sys
import matplotlib.pyplot as plt

def main():
    total = 0
    print('Start experiment: ')
    n = 0

 #Repeat try the estimate pi, until break it down manually
 while True:
        n=int(input(sys.argv))
 for i in range(n):
            x = random.uniform(-1,1)
            y = random.uniform(-1,1)
 #x^2 + y^2 <=1, means (x, y) in the cycle
 if math.sqrt(x ** 2 + y ** 2) <= 1.0:
                total += 1
                plt.plot(x, y, 'ro')
 # x^2 + y^2 > 1, means (x, y) out of the cycle
 else:
                plt.plot(x, y, 'b*')
        mypi = 4.0 * total / n
 #plot the x, y and close it after 5 seconds
        plt.ion()
        plt.pause(5)
        plt.close()

        print('Iteration Times = ', n, 'PI estimate value = ', mypi)
        print('math.pi = ', math.pi)
        print('Errors = ', abs(math.pi - mypi) / math.pi)

参考文献

1、蒙特卡罗算法-知乎
2、蒙特卡洛算法及其实现

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐