Python计算定积分结果差异:两种有限差分法孰优及差异原因
定积分数值计算:两种左矩形法实现的对比分析
实现的两种Python函数
function1(基础左矩形法)
def function1(f, dx, a, b): g=0 while a<b: g=g + dx*f(a) a=a + dx return g
function2(带提前终止阈值的左矩形法)
def function2(f, dx, a, b): g=0 while a<b-dx*0.1: g=g + dx*f(a) a=a + dx return g
测试结果
- 计算
f(x)=x²,参数dx=0.001, a=0, b=11时,结果分别为443.727和443.606(省略部分小数); - 计算
f(x)=x²,参数dx=0.001, a=0, b=12时,结果分别为576.072和575.928(省略部分小数); - 计算
f(x)=x²,参数dx=0.001, a=0, b=1时,两者结果相同,为0.333328(省略部分小数); - 计算
f(x)=x^x,参数dx=0.001, a=0, b=1时,两者结果相同,为0.3328375(省略部分小数)。
问题解答
1. 哪种方法更优?
function1的实现更合理、更优。原因如下:
- 它严格贴合左矩形法的定义,遍历从
a到b的所有区间,不会遗漏本该计算的面积; - function2引入的
b - dx*0.1终止阈值是人为的模糊限制,当b-a不是dx整数倍时,会直接丢弃靠近b的部分区间,反而降低计算精度; - 两者结果一致的情况仅当
b-a恰好是dx整数倍时出现,属于特例,不具备普遍性。
2. 为何两者计算结果会存在差异?
差异的核心是循环终止条件不同:
- function1的
a < b条件,会让程序计算所有左端点a未到达b的区间,哪怕最后一个区间的长度小于dx,也会用dx*f(a)近似该部分面积; - function2的
a < b - dx*0.1条件,相当于提前终止循环,直接放弃了b - dx*0.1到b之间的所有区间面积,导致最终结果偏小; - 当
b-a是dx整数倍时(比如b-a=1,dx=0.001),a最终会刚好到达b,此时b - dx*0.1的值略小于b,程序能完整计算所有区间,所以结果和function1一致。
内容的提问来源于stack exchange,提问作者Takahiro Matsuda
相关产品推荐
相关产品推荐

