Python 黎曼和编码

Python 黎曼和编码,python,numerical-integration,Python,Numerical Integration,我只是在用中点黎曼和测试Python,但我似乎遗漏了一步,因为我的答案是错误的。以下是我的代码示例: from math import pi, sin a=0 b=pi/2 n=10 dx=(b-a)/n ends = [a+i*dx for i in range(n+1)] mids=[(i+i-1)/2 for i in ends] f = lambda x: x*sin(x) area = [f(i)*dx for i in mids] sum(area) 我的答案应该是1,但我得到了

我只是在用中点黎曼和测试Python,但我似乎遗漏了一步,因为我的答案是错误的。以下是我的代码示例:

from math import pi, sin
a=0
b=pi/2
n=10

dx=(b-a)/n
ends = [a+i*dx for i in range(n+1)]
mids=[(i+i-1)/2 for i in ends]
f = lambda x: x*sin(x)
area = [f(i)*dx for i in mids]
sum(area)

我的答案应该是1,但我得到了0.5022。我怀疑我在mids下的理解列表是错误的,但我不知道如何修复它。任何帮助都将不胜感激。

mids

mids = [(ends[i] + ends[i-1]) / 2 for i in range(1, len(ends))]

i-1
不是
end
i-1
th元素。它只是
i
th元素减去1。

mids
应该是

mids = [(ends[i] + ends[i-1]) / 2 for i in range(1, len(ends))]

i-1
不是
end
i-1
th元素。这只是
i
th元素减去1。

首先,由于
范围(n+1)

那么你的计算是错误的

ends[0] == 0 (a == 0, i == 0  => a+i*dx == 0)
=> mids[0] == -1/2 (i == ends[0] => (i+i-1)/2 == -1/2)
如果改用
范围(1,n+1)
,您会得到:

ends[0] == pi/20 (a == 0, i == 1 => a+i*dx == pi/20)
=> mids[0] == pi/20-1/2 (i == ends[0] == pi/20 => (i+i-1)/2 == (pi/10-1)/2)
这些仍然不正确-
结束
看起来正常,但是
mids[0]
需要计算为
pi/40


我的建议是使用调试器检查此处每个点的值,并确认它们是您认为应该的值。

对于初学者,由于
范围(n+1)

那么你的计算是错误的

ends[0] == 0 (a == 0, i == 0  => a+i*dx == 0)
=> mids[0] == -1/2 (i == ends[0] => (i+i-1)/2 == -1/2)
如果改用
范围(1,n+1)
,您会得到:

ends[0] == pi/20 (a == 0, i == 1 => a+i*dx == pi/20)
=> mids[0] == pi/20-1/2 (i == ends[0] == pi/20 => (i+i-1)/2 == (pi/10-1)/2)
这些仍然不正确-
结束
看起来正常,但是
mids[0]
需要计算为
pi/40


我的建议是使用调试器检查此处每个点的值,并确认它们是您认为应该的值。

这很好!那很好!仅供参考,这位先生的名字是。哈哈哈。。。谢谢你指出这一点!仅供参考,这位先生的名字是。哈哈哈。。。谢谢你指出这一点!