蒙特卡罗法简介
蒙特卡罗法($Monte\ Carlo\ method$),是一种按
抽样调查法求取统计值来推定未知特征量的计算方法。它的核心方法是通过构造一个和系统性能相近似的概率模型,使用随机数(或称伪随机)来大量重复随机采样,对采样结果进行统计分析得到数值结果,从而得到系统的随机特性
蒙特卡罗基本步骤
$Step\ 1$:构造或描述概率过程
构造一个概率过程,它的某些参量正好是所要求的问题的解。这一步通常要将不具有随机性质的问题转化为具有随机性质的问题
$Step\ 2$:实现从已知概率分布抽样
根据已知的概率分布进行大量的随机抽样
$Step\ 3$:对随机抽样结果进行统计分析
确定一些无偏估计量,它们对应着所要求的问题的解。利用抽样结果对这些无偏估计量进行估计,估计结果就是解的近似
案例:
利用蒙特卡罗法求解 $\pi$ 值,对于一个边长为 $L$ 的正方形,里面有一个内切的圆

我们在这个正方形内投足够多的圆点,这些小圆点可能投在圆内,也可能投在阴影外的白色区域。假设一共投了 $N$ 个圆点,投在圆内的有 $K$ 个

(1). 概率过程
投点总数与投在圆内的点数之比应该
约等于正方形面积与圆的面积之比
$$
\frac{N}{K}\approx \frac{L^2}{\pi(\frac{L}{2})^2}
$$
故,可以得到:
$$
\pi\approx \frac{4K}{N}
$$
那么可以代码求解
import random
import math
random.seed(0) # 初始化随机数种子
n = 1000000 # 投点数
k = 0 # 落在圆内的点计数器
for _ in range(n):
x1,x2 = random.random(),random.random() # 随机生成一个点
if math.sqrt(x1*x1+x2*x2)<=1: # 如果点落在圆内
k += 1
print("pi = {:.10f}".format(4*k/n))
输出为
pi = 3.1424400000
如果将投点数增加,$\pi$ 的值会更加精确,但计算时间也会增加,例如改为
n = 10000000
,输出为
pi = 3.1413028000
参考
最后编辑于:2022 年 09 月 18 日 21:14