以下是使用蒙特卡罗方法生成椭圆形的逐步实现:
import numpy as np
import matplotlib.pyplot as plt# 设置椭圆参数
a = 2.0 # x轴半长轴
b = 1.0 # y轴半长轴
n_points = 50000 # 总点数# 生成随机点(范围覆盖整个椭圆)
x = np.random.uniform(-a, a, n_points)
y = np.random.uniform(-b, b, n_points)# 判断点是否在椭圆内(椭圆方程变形)
is_inside = (x**2)/(a**2) + (y**2)/(b**2) <= 1# 分离内外点
inside_x = x[is_inside]
inside_y = y[is_inside]
outside_x = x[~is_inside]
outside_y = y[~is_inside]# 创建画布
plt.figure(figsize=(8, 4)) # 调整画布比例适应椭圆形状# 绘制散点图
plt.scatter(inside_x, inside_y, s=0.1, color='blue', alpha=0.3, label='内部点')
plt.scatter(outside_x, outside_y, s=0.1, color='red', alpha=0.3, label='外部点')# 绘制理论椭圆边界
theta = np.linspace(0, 2*np.pi, 100) # 角度采样
plt.plot(a*np.cos(theta), b*np.sin(theta), # 参数方程color='black', linewidth=2, label='真实椭圆')# 添加图形元素
plt.title(f'椭圆蒙特卡罗模拟 (a={a}, b={b}, 点数={n_points})')
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.axis('equal') # 保持坐标轴比例
plt.grid(alpha=0.3)
plt.legend(markerscale=50) # 放大图例中的点标记# 显示结果
plt.show()
代码解释:
- 首先导入需要的工具库,
numpy
处理数字,matplotlib
画图 - 设置椭圆形状参数:x方向拉长到2,y方向保持1
- 生成随机点时:
- x坐标范围设为-2到2(因为a=2)
- y坐标范围保持-1到1(因为b=1)
- 判断是否在椭圆内的公式变形自标准椭圆方程
- 用布尔索引快速分离内外点
- 画图时特别注意:
- 使用
plt.axis('equal')
防止图形变形 - 参数方程画椭圆边界时,记得乘以a和b
- 调整画布比例为8x4,更符合椭圆形状
- 使用
运行效果:
- 蓝色点会逐渐在黑色椭圆线内聚集
- 红色点分布在椭圆外红色区域
- 点越多(比如改成100000点),边界越清晰
小提示:如果想改变椭圆形状,只需修改a和b的值:
- 尝试a=1.5, b=0.8 看看效果
- 极端情况a=1, b=1时会变成标准圆