我一直试图解决与黎曼和的整合问题。我的函数有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))
答案 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循环。它更快。 (顺便说一句,循环变量通常是i
,j
,k
...而限制或最终值是n
)。其次,使用xrange
代替range
对于python 2.x的用户来说更快。第三,经常计算它们时分解多项式。您应该从代码中看到我的意思。这样,结果在数值上是稳定的。最后一招:可以在循环结束后提取并应用不依赖于循环变量的循环内的操作。这里,最后乘以dx。