与Riemann Sum Python集成

时间:2015-03-28 15:06:29

标签: python integral

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

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))

1 个答案:

答案 0 :(得分:2)

这里既没有错误,也没有算法或代码(或python)。黎曼和是积分的近似值,本身不是“精确的”。你接近宽度为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。