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

Python实现蒙特卡洛中点求和法求解1-8维积分咨询

D维蒙特卡洛中点求和法实现修正

你想要实现的是D维积分的蒙特卡洛中点求和法,对应公式如下:
中点求和公式

现有代码的问题

你当前实现的是确定性均匀网格中点求积法,属于传统确定性数值积分方案,全程没有用到随机采样逻辑,因此和蒙特卡洛中点求和法的定义完全不符。
另外你当前的实现本质上仅处理了一维积分,仅因为你使用的被积函数可分离、积分结果刚好等于一维积分结果乘以维度D,才得到了正确的输出,并没有真正实现D维积分的计算逻辑。

蒙特卡洛中点求和法的核心逻辑

蒙特卡洛类积分方法的核心是通过随机采样的统计期望近似积分值,D维蒙特卡洛中点求和的执行流程如下:

  • 确定D维积分域为[0,1]^D,该域的体积为1
  • 将每个维度的区间[0,1]均匀划分为K个小段,每个小段的长度为1/K
  • 随机生成N组D维的区间索引(每组索引对应D维空间中的一个网格单元)
  • 取每个网格单元的中点作为采样点,计算所有采样点的被积函数值的平均值,即为积分的近似结果

正确实现代码

import numpy as np
from time import process_time

# 定义D维被积函数:输入x是形状为(N, D)的数组,N是采样数,D是维度
def f(x):
    return np.sum(x**2, axis=1)

a = 0
b = 1
N = 10**6  # 蒙特卡洛采样数,可根据精度需求调整

for D in range(1,9):
    t_start = process_time()
    # 随机生成N组D维的区间索引
    idx = np.random.randint(0, N, size=(N, D))
    # 计算每个采样点的D维坐标(网格中点)
    dx = (b - a) / N
    x_mid = (idx + 0.5) * dx
    # 计算积分近似值:函数值平均 * 积分域体积(D维单位立方体体积为1)
    mc_midpoint = np.mean(f(x_mid))
    t_stop = process_time()
    
    print(f"维度D={D}时CPU耗时:{t_stop-t_start:.6f}秒")
    print(f"积分近似结果:{mc_midpoint:.8f}\n")

补充说明

  • 蒙特卡洛积分的结果存在随机误差,多次运行结果会有小幅波动,误差量级约为1/√N,你可以通过增大采样数N来降低误差
  • 如果要达到你原确定性方法的高精度结果,可将N调整到1e7以上,误差会降到1e-4以内
  • 你原代码中引入的scipy随机数、sympy积分、matplotlib、scipy.stats.norm等依赖在当前积分场景中没有用到,可以按需移除

内容的提问来源于stack exchange,提问作者J.Snowden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:45:03