与黎曼和集成 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 循环。它更快。 (顺便说一句,循环变量通常是 i
、j
、k
... 而限制或最终值是 n
)。其次,使用 xrange
而不是 range
对于 python 2.x 的用户来说更快。第三,经常计算时分解多项式。你应该从代码中明白我在这里的意思。这样,结果在数值上是稳定的。最后一个技巧:循环内不依赖于循环变量的操作可以在循环结束后提取和应用。在这里,最后与 dx 相乘。
我一直在尝试用黎曼和求解积分。我的函数有 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 循环。它更快。 (顺便说一句,循环变量通常是 i
、j
、k
... 而限制或最终值是 n
)。其次,使用 xrange
而不是 range
对于 python 2.x 的用户来说更快。第三,经常计算时分解多项式。你应该从代码中明白我在这里的意思。这样,结果在数值上是稳定的。最后一个技巧:循环内不依赖于循环变量的操作可以在循环结束后提取和应用。在这里,最后与 dx 相乘。