我将以下函数定义为使用布尔法则近似积分的方法:
def integrate_boole(f,l,r,N):
h=((r-l)/N)
xN = np.linspace(l,r,N+1)
fN = f(xN)
return ((2*h)/45)*(7*fN[0]+32*(np.sum(fN[1:-2:2]))+12*(np.sum(fN[2:-3:4]))+14*(np.sum(fN[4:-5]))+7*fN[-1])
我使用这个函数得到0和pi之间的sin(x)dx
的积分值(其中N=8),并将其赋给变量sine_int
。你知道吗
给出的答案是1.3938101893248442
在手工计算了原始方程(见here)之后,我意识到这个答案是不准确的。你知道吗
fN的和给出了错误的值,但我不知道为什么。例如,np.sum(fN[4:-5])
将变为0。你知道吗
有没有更好的方法来编码所涉及的和,或者我的参数中有没有导致计算不准确的错误?你知道吗
提前谢谢。你知道吗
编辑
我应该说得更清楚一点,这应该是这个规则的一个复合版本,即在N点上近似,其中N可以被4整除。很不幸,典型的5点4个间隔不会在这里减少。我想把我用的公式复制到这里,但我没有它的图像,乳胶也不是一个选择。我在return
之后的代码应该/可能很清楚。你知道吗
首先,正如尼克松所指出的,你的一个系数是错误的。那么,我认为你并不真正理解布尔法则是如何工作的——它只使用函数的5个点来近似函数的积分。因此,像
np.sum(fN[1:-2:2])
这样的术语毫无意义。你只需要五个点,你可以通过xN = np.linspace(l,r,5)
获得。你的h
就是两个相邻点h = xN[1] - xN[0]
之间的距离。然后,简单的豌豆:从快速检查来看,f(x4)的乘积应该是32,而不是14:
我不知道你希望你的代码符合w.r.t.布尔法则。为什么要对函数的样本求和(即
np.sum(fN[2:-3:4])
)?我认为你的N
参数也没有很好的定义,我不确定它应该代表什么。也许你在用另一条我不熟悉的规则:我让你决定。你知道吗不管怎样,这里有一个布勒规则的实现,正如维基百科所定义的。变量映射到您链接的Wikipedia版本:
然后,测试:
输出
1.9985707318238357
,非常接近2
的正确答案。你知道吗嗯。你知道吗
相关问题 更多 >
编程相关推荐