You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:27:03