用推导式逼近黎曼和

Approximate the Riemann sum with comprehensions

我正在按照 sicp 计算黎曼和的积分:

#+begin_src ipython :session sicp :results output
def integral(f, a, b, dx):
    add_dx = lambda x: x + dx
    return sum_recur(f, a+(dx/2), add_dx, b) * dx

from functools import lru_cache
@lru_cache(maxsize=None)
def sum_recur(term, a, next, b):
    if a > b: return 0
    return term(a) + sum_recur(term, next(a), next, b)

def cube(x): return x ** 3

print(integral(cube, 0, 1, 0.01))

#+end_src

#+RESULTS:
: 0.24998750000000042

它工作正常,但是当用列表理解实现它时

#+begin_src ipython :session sicp :results output
def integral(f, a, b, dx):
    return sum(a+dx/2+n*dx for n in range(b-1)) * dx
print(integral(cube, 0, 1, 0.001))
#+end_src

#+RESULTS:
: 5e-07

没有按预期工作,有什么问题?

在您的示例中,range(a-b) 部分正在评估 range(-1)。此外,您没有在任何地方调用 cube 函数。

试试这个:

def cube(x): return x ** 3

def integral(f, a, b, dx):
    return sum(f(a+dx/2+n*dx) for n in range(int((b-a)/dx)) ) * dx

print(integral(cube, 0, 1, 0.01))

打印:

0.24998750000000006