问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

蒙特卡洛法计算圆周率

创作时间:
作者:
@小白创作中心

蒙特卡洛法计算圆周率

引用
CSDN
1.
https://blog.csdn.net/wbk0127/article/details/130009008

蒙特卡洛方法是一种基于随机抽样的数值计算方法,广泛应用于科学计算、工程设计和金融分析等领域。本文将通过一个具体的例子——计算圆周率π,来介绍蒙特卡洛方法的基本原理和实现过程。

一、问题分析

蒙特卡洛方法的理论基础是大数定律。大数定律是描述相当多次数重复试验的结果的定律,在大数定理的保证下,可以利用事件发生的频率作为事件发生的概率的近似值。

本例中需要求解的是圆周率π。计算π时可以考虑将一个单位圆放在一个正方形中,从而将求解圆周率转化为计算出圆和正方形面积的比例。

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

二、算法实现

  1. 首先根据题目要求,生成伪随机数,设置随机数种子random.seed(123),接着获取用户输入的撒点数量,同时定义计数器,记录圆内点的数量。

  2. 接下来是撒点,循环n次,用random.uniform(a,b)函数生成浮点数(随机生成一个a到b之间的一个浮点数,a<=n<=b)。

  3. 然后通过解析几何上的原理判断点是否在圆内。最后计算圆周率pi = 4 * count / n,并输出结果。

为了使结果更加直观,我们导入了matplotlib.pyplot as plt库进行可视化。

三、源代码以及结果分析

import random
import matplotlib.pyplot as plt

def monte_carlo_pi(n):
    random.seed(123)
    count = 0
    for _ in range(n):
        x, y = random.uniform(-1, 1), random.uniform(-1, 1)
        if x**2 + y**2 <= 1:
            count += 1
    pi_estimate = 4 * count / n
    return pi_estimate

# 测试不同撒点数量的结果
points = [1024, 2048, 4096, 1000000]
results = [monte_carlo_pi(n) for n in points]

# 可视化结果
plt.plot(points, results, marker='o')
plt.xscale('log')
plt.xlabel('Number of Points')
plt.ylabel('Estimated Pi')
plt.title('Monte Carlo Estimation of Pi')
plt.grid(True)
plt.show()

# 输出结果
for n, pi in zip(points, results):
    print(f"输入:{n}\n输出:{pi:.6f}\n")

运行结果如下:

  1. 输入:1024
    输出:3.218750

  2. 输入:2048
    输出:3.195312

  3. 输入:4096
    输出:3.139648

  4. 输入:1000000
    输出:3.141212

从结果可以看出,随着撒点数量的增加,计算得到的π值逐渐趋近于真实值3.1415926...。但需要注意的是,即使撒点数量足够多,得到的也只是π的一个近似值,而不是精确值。

四、心得体会

蒙特卡洛方法不仅在计算圆周率中有应用,在其他领域也有广泛的应用。例如,在机器学习中,蒙特卡洛算法常用于强化学习算法。一般情况下,针对得到的样本数据集创建相对模糊的模型,通过蒙特卡罗方法对于模型中的参数进行选取,使之于原始数据的残差尽可能的小,从而达到创建模型拟合样本的目的。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号