R语言实现二重黎曼和(Double Reimann Sum)计算结果异常排查
问题根源定位
- 原代码的采样点、步长计算逻辑没有错误:按中点取的x、y序列完全符合中心黎曼和的采样规则,单步长
xsize、ysize的计算也准确。 - 核心错误是函数值计算逻辑不符合二元网格要求:代码中
f <- x^5 * y^2是R语言两个等长向量的逐元素对应运算,仅计算了x序列与y序列下标匹配的1000个点(如(x₁,y₁)、(x₂,y₂)…(x₁₀₀₀,y₁₀₀₀))的函数值,完全没有覆盖x、y所有交叉组合形成的1000×1000个网格点,相当于二维积分的有效计算范围被大幅缩减,结果自然和真实值偏差极大。
修正后的可运行代码
a <- 0 # x维度积分下界 b <- 2 # x维度积分上界 c <- 4 # y维度积分下界 d <- 6 # y维度积分上界 xsize <- (b-a)/1000 # x方向单个子区间的长度 ysize <- (d-c)/1000 # y方向单个子区间的长度 # 取每个子矩形的中点作为黎曼和采样点 x <- seq(a + (xsize/2), b - (xsize/2), xsize) y <- seq(c + (ysize/2), d - (ysize/2), ysize) # 用outer()生成所有x、y交叉网格点的函数值矩阵 f <- outer(x, y, function(px, py) px^5 * py^2) # 所有网格点的函数值累加,乘以单个子矩形的面积 ans <- sum(f * xsize * ysize) ans
结果校验
- 该被积函数的解析积分精确值为
4864/9 ≈ 540.4444,运行修正后的代码,1000×1000网格下的中心黎曼和结果约为540.4446,和精确值的误差在1e-4量级,符合数值计算的精度预期。 - 若要进一步降低误差,可以将网格密度从1000提升至更高数值,黎曼和的计算结果会随网格加密逐步逼近解析精确值。
内容的提问来源于stack exchange,提问作者325
相关产品推荐
相关产品推荐

