【蒙特卡洛方法估计π的值】python,附代码

原理:当使用蒙特卡洛方法来估算π时,我们利用了圆的面积和正方形的面积的关系。假设我们有一个半径为1的圆和一个边长为2的正方形,圆完全包含在正方形内。蒙特卡洛方法的基本思想是,通过在正方形内生成大量的随机点,然后统计落在圆内的点的数量,以此来近似计算圆的面积。

具体来说,我们在正方形内生成大量的随机点,然后判断每一个点是否在圆内。如果一个点的坐标为(x, y),我们可以通过计算x^2 + y^2 是否小于等于1来确定该点是否在圆内。如果在圆内的点的数量足够大,那么这些点占正方形面积的比例将近似于圆和正方形面积的比例,即 π/4。

因此,通过统计落在圆内的点的数量,并将其与总点数的比值乘以4,我们就可以得到一个近似的π值。这就是蒙特卡洛方法估算π的基本原理。随着生成的随机点数量的增加,我们可以得到更接近真实π值的估计结果。

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

def main():
    total = 0
    print('Start experiment: ')
    
    n = int(input("Enter the number of iterations: "))
    
    for i in range(n):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        
        if math.sqrt(x ** 2 + y ** 2) <= 1.0:
            total += 1
            plt.plot(x, y, 'ro')
        else:
            plt.plot(x, y, 'b*')
    
    mypi = 4.0 * total / n
    
    plt.show()
    
    print('Iteration Times = ', n, 'PI estimate value = ', mypi)
    print('math.pi = ', math.pi)
    print('Errors = ', abs(math.pi - mypi) / math.pi)

if __name__ == "__main__":
    main()

运行之后填入数字,也就是你选择多少个点落入这个区域。

这段代码使用蒙特卡洛方法估计π的值,并使用matplotlib可视化这个过程。现在让我来解释一下它的工作原理:

1. 首先导入了必要的库:`random`、`math`、`sys` 和 `matplotlib.pyplot`。

2. 定义了 `main()` 函数,这是程序的入口点。

3. 在 `main()` 函数中:
   - 初始化了一个变量 `total` 用于跟踪落入单位圆内的点的数量。
   - 打印了一个指示实验开始的消息。
   - 要求用户输入实验的迭代次数(`n`)。
   - 进入循环,迭代 `n` 次:
     - 生成范围在[-1, 1]之间的随机坐标 `x` 和 `y`。
     - 检查生成的点 `(x, y)` 是否落在单位圆内(即它距离原点的距离是否小于或等于1)。
     - 如果点在单位圆内,增加 `total` 计数器,并在图上将该点绘制为红色圆圈 (`'ro'`)。否则,将该点绘制为蓝色星形 (`'b*'`)。
   - 使用公式计算估算的 π 值:
   - 显示图表,展示生成的随机点及其分布。
   - 打印迭代次数、估算的 π 值、从 `math.pi` 模块获得的实际 π 值,以及估算误差。

4. `if __name__ == "__main__":` 块确保 `main()` 函数只在直接运行脚本时执行,而不是在另一个脚本中导入时执行。

这就是这段代码的要点。实际上,它使用蒙特卡洛方法通过随机抽样点,并观察有多少点落在单位圆内来估计 π 的值。

运行结果:600为输入的点数,

红色点近似一个单位圆,蓝色落在单位圆外面的点。

搜了另一种代码:

下面是一个使用蒙特卡洛方法估算π的Python代码示例:

import random

def estimate_pi(num_samples):
    num_points_in_circle = 0
    for i in range(num_samples):
        x = random.uniform(-1,1)
        y = random.uniform(-1,1)
        if x**2 + y**2 <= 1:
            num_points_in_circle += 1

    pi_estimate = 4 * num_points_in_circle / num_samples
    return pi_estimate

这个代码中,我们定义了一个`estimate_pi()`函数,用于估计π的值。在函数内部,我们循环生成指定数量的随机点,并计算这些点是否在圆内。根据落在圆内的点和总点数的比例,我们可以求得π的近似值。

这个函数的参数是`num_samples`,它代表了我们生成的随机点的数量。如果点的数量越多,我们就能得到一个更准确的π的估计值。

下面是一个使用`estimate_pi()`函数进行π估计的例子:

estimated_pi = estimate_pi(100000)
print("Estimated pi: ", estimated_pi)

这行代码调用`estimate_pi()`函数并输出结果,以告诉我们估计出的π的值。

感谢观看!!!!!

python运行快捷键shift+enter

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值