蒙特卡洛方法手搓图形

下面是一个使用蒙特卡罗方法绘制图形的 Python 脚本。蒙特卡罗方法基于随机采样,可以用来估计不规则形状的面积或体积。这个脚本将展示如何使用该方法估算圆形的面积并可视化采样过程。

import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]


def monte_carlo_circle(num_points=1000, radius=1.0, visualize=True):
    """
    使用蒙特卡罗方法估算圆形面积并可视化

    参数:
    num_points: 采样点数
    radius: 圆的半径
    visualize: 是否可视化采样过程
    """
    # 生成随机点 (x, y) 在 [0, radius] x [0, radius] 范围内
    x = np.random.uniform(0, radius, num_points)
    y = np.random.uniform(0, radius, num_points)

    # 计算到原点的距离
    distances = np.sqrt(x ** 2 + y ** 2)

    # 判断点是否在圆内
    inside = distances <= radius

    # 估算圆的面积 (只计算第一象限,所以乘以4)
    circle_area = np.sum(inside) / num_points * radius ** 2 * 4

    # 理论面积
    true_area = np.pi * radius ** 2

    # 计算误差
    error = abs(circle_area - true_area) / true_area * 100

    if visualize:
        # 创建图形
        fig, ax = plt.subplots(figsize=(8, 8))

        # 绘制圆
        circle = plt.Circle((0, 0), radius, fill=False, color='blue', linewidth=2)
        ax.add_patch(circle)

        # 绘制采样点,圆内的点用红色,圆外的点用绿色
        ax.scatter(x[inside], y[inside], color='red', s=5, alpha=0.6, label='圆内点')
        ax.scatter(x[~inside], y[~inside], color='green', s=5, alpha=0.6, label='圆外点')

        # 设置图形属性
        ax.set_xlim(0, radius * 1.1)
        ax.set_ylim(0, radius * 1.1)
        ax.set_aspect('equal')
        ax.grid(True, linestyle='--', alpha=0.7)
        ax.set_title(
            f'蒙特卡罗方法估算圆面积\n采样点数: {num_points}, 估算值: {circle_area:.6f}, 真实值: {true_area:.6f}, 误差: {error:.2f}%')
        ax.legend()

        plt.tight_layout()
        plt.show()

    return circle_area, error


if __name__ == "__main__":
    # 运行蒙特卡罗模拟
    monte_carlo_circle(num_points=5000, radius=1.0)

运行结果

posted @ 2025-05-09 09:12  521yy  阅读(29)  评论(0)    收藏  举报