蒙特卡洛方法手搓图形
下面是一个使用蒙特卡罗方法绘制图形的 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)
运行结果


浙公网安备 33010602011771号