1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| 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 = 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
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)
|