Python中点积分近似:两种中点公式的效率与差异咨询
两个中点积分公式的差异与效率分析
一、数学等价性(看似不同,实则同源)
先对两个公式做代数化简:
- 书中公式:
midpoint = 0.5 * (2 * a + delta_x * (2 * i - 1))
展开后:midpoint = a + delta_x * i - delta_x / 2 - 搜索到的公式:
midpoint = a + (dx / 2) + (i * dx)
整理后:midpoint = a + dx * i + dx / 2
两者的核心差异仅在于循环变量i的起始取值范围:
- 若书中公式的
i从1到n(n为区间数),第一个中点是a + delta_x/2,正好对应积分区间[a, a+delta_x]的中点; - 若搜索到的公式的
i从0到n-1,第一个中点同样是a + dx/2,和书中公式的计算结果完全一致。
你觉得效果差异大,大概率是实现时搞错了i的取值范围——比如搜索到的公式被错误地让i从1到n,导致所有中点都偏移了一个dx,积分结果自然偏差极大,需要更多区间来弥补误差。
二、效率与精度对比
- 计算效率
两个公式的浮点运算次数几乎相同:
- 书中公式:1次乘法、1次加法、1次除法(0.5等价于除以2);
- 搜索到的公式:1次乘法、2次加法、1次除法。
实际运行中两者的效率差距可以忽略不计,除非是极端大规模的循环场景。
- 精度表现
从数值计算精度来看,书中的公式更有优势:
0.5*(2*a)可以避免a直接和小数相加的精度损失(比如当a是极大数时,a + dx/2的浮点精度会比0.5*(2a)差);delta_x*(2i-1)的计算,在i为整数时,2i-1是整数,乘法的精度损失更小。
这就是为什么书中公式用更少的区间就能达到准确结果——不是公式本身逻辑不同,而是数值精度更高,相同区间数下的误差更小。
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

