Monte Carlo模拟积分中判断随机点是否位于绘制图形区域的方法
蒙特卡洛模拟积分随机点区域判定实现方法
判定的核心逻辑非常简单:你要计算的积分本质是被积函数曲线和积分边界围成的区域面积,只要判断随机点的y坐标落在目标区域的上下边界之间即可。下面是两种常用的实现方案:
方案1:直接调用被积函数实时判定(优先推荐)
不需要依赖预先生成的绘图坐标点,生成随机点时直接将随机x值传入你定义的被积函数func,得到对应位置的函数值后直接做大小比较即可,没有精度误差、性能最高。
对你给出的参考代码修改示例如下:import random import numpy as np def montecarlo(func, x1, y1, x2, y2): rectangle_area = (x2 - x1) * (y2 - y1) list_random_x_value = [] list_random_y_value = [] count_in_area = 0 # 统计落在目标区域的点数量 sample_num = 1000 # 采样数可以调大提升精度 # 生成随机点并同时做区域判定 for i in range(sample_num): random_x_value = random.uniform(x1, x2) random_y_value = random.uniform(y1, y2) list_random_x_value.append(random_x_value) list_random_y_value.append(random_y_value) # 区域判定:默认计算x轴上方、func曲线下方的积分,可根据实际需求调整边界 func_ref_y = func(random_x_value) if 0 <= random_y_value <= func_ref_y: count_in_area += 1 # 积分结果计算:区域面积 * 落在区域内的点占比 integral_result = rectangle_area * (count_in_area / sample_num) # 你原有逻辑里的绘图坐标生成可保留,用于可视化 list_x_values = [] list_y_values = [] for values in np.arange(x1, x2, 0.01): list_x_values.append(values) list_y_values.append(func(values)) return integral_result, list_random_x_value, list_random_y_value, list_x_values, list_y_values方案2:基于预先生成的绘图坐标插值判定
如果你的场景下无法直接调用被积函数,只能用已经生成的绘图坐标列表做判定,可以用线性插值的方式匹配随机x对应的近似函数值:# 接你原有代码中已经生成list_x_values、list_y_values、list_random_x_value、list_random_y_value的逻辑 arr_x_plot = np.array(list_x_values) arr_y_plot = np.array(list_y_values) count_in_area = 0 sample_num = len(list_random_x_value) for rx, ry in zip(list_random_x_value, list_random_y_value): # 用线性插值得到随机x对应的近似函数值 interp_func_y = np.interp(rx, arr_x_plot, arr_y_plot) if 0 <= ry <= interp_func_y: count_in_area +=1 integral_result = (x2-x1)*(y2-y1) * (count_in_area/sample_num)
注意:如果你的积分区域是两条曲线围成的范围,或者y轴的下限不是0,只要调整判定逻辑中的边界值即可,比如计算f(x)和g(x)(f(x)始终大于g(x))之间的积分,判定条件改为
g(rx) <= ry <= f(rx)即可。
内容的提问来源于stack exchange,提问作者Gerard
相关产品推荐
相关产品推荐

