与黎曼和集成 Python

Integration with Riemann Sum Python

我一直在尝试用黎曼和求解积分。我的函数有 3 个参数 a、b、d,所以 a 是下限 b 是上限,d 是 a +(n-1)*d < b 的部分。到目前为止,这是我的代码。我的输出是 28.652667999999572 我应该得到的是 28.666650000000388。此外,如果输入 b 低于 a,它必须计算,但我已经解决了这个问题。

def integral(a, b, d):
    if a > b:
        a,b = b,a
    delta_x = float((b-a)/1000)
    j = abs((b-a)/delta_x)
    i = int(j)
    n = s = 0
    x = a
    while n < i:
        delta_A = (x**2+3*x+4) * delta_x
        x += delta_x
        s += delta_A

        n += 1

    return abs(s)

print(integral(1,3,0.01))

这里没有错误,无论是算法还是您的代码(或 python)。黎曼和是积分的近似值,本身不是 "exact"。你近似宽度为 dx 的(小)条纹的面积,比如在 x 和 x+dx 之间,以及 f(x) 与具有相同宽度和 f(x) 的高度的矩形的面积,因为它在左上角.如果当你从 x 到 x+dx 时函数改变了它的值,那么矩形的面积就会偏离真实的积分。
正如您所注意到的,您可以通过制作越来越薄的切片来使近似值更接近,但代价是需要更多的计算工作量和时间。 在您的示例中,函数是 f(x) = x^2 + 3*x + 4,它在 [1.0,3.0) 中对 x 的精确积分是 28 2/3 或 28.66666...

矩形的近似值是粗略的,您无法更改它。但是您可以改变的是您的代码计算 10^8 步而不是 10^3 步所花费的时间。看这段代码:

def riemann(a, b, dx):
    if a > b:
        a,b = b,a
    # dx = (b-a)/n
    n = int((b - a) / dx)
    s = 0.0
    x = a
    for i in xrange(n):
        f_i = (x + 3.0) * x + 4.0
        s += f_i
        x += dx
    return s * dx  

在这里,我使用了 3 个技巧来加速,一个技巧用来提高精度。首先,如果您编写了一个循环并且您事先知道重复次数,那么请使用 for 循环而不是 while 循环。它更快。 (顺便说一句,循环变量通常是 ijk ... 而限制或最终值是 n)。其次,使用 xrange 而不是 range 对于 python 2.x 的用户来说更快。第三,经常计算时分解多项式。你应该从代码中明白我在这里的意思。这样,结果在数值上是稳定的。最后一个技巧:循环内不依赖于循环变量的操作可以在循环结束后提取和应用。在这里,最后与 dx 相乘。