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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:41:05