我已经定义了以下函数作为使用布尔定律近似积分的方法:
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])
我使用该函数获取sin(x)dx
在0和pi之间的积分值(其中N = 8),并将其分配给变量sine_int
。
给出的答案是1.3938101893248442
手工完成原始方程式(请参阅here)后,我意识到这个答案很不准确。
fN的总和给出了不正确的值,但是我不确定为什么。例如,np.sum(fN[4:-5])
将为0。
是否有更好的方式对涉及的总和进行编码,或者我的参数中存在导致计算不准确的错误?
谢谢。
编辑
我应该更清楚地表明这应该是规则的复合版本,即近似于N点,其中N可以被4整除。因此,典型的5点(4个间隔)不会在这里被切掉,很不幸。我会在这里复制我正在使用的方程式,但是我没有它的图片,LaTex不是一个选择。从我在return
之后得到的代码中/应该很清楚。
答案 0 :(得分:1)
通过快速检查,看起来乘以f(x_4)的术语应为32,而不是14:
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]))+32*(np.sum(fN[4:-5]))+7*fN[-1])
答案 1 :(得分:1)
首先,@ nixon指出您的一个系数是错误的。然后,我认为您不太了解Boole规则的工作原理-它仅使用函数的5个点来近似函数的积分。因此,像np.sum(fN[1:-2:2])
这样的术语没有任何意义。您只需要五个点,您可以使用xN = np.linspace(l,r,5)
获得五个点。您的h
就是两个重叠点h = xN[1] - xN[0]
之间的距离。然后,轻松自如:
import numpy as np
def integrate_boole(f,l,r):
xN = np.linspace(l,r,5)
h = xN[1] - xN[0]
fN = f(xN)
return ((2*h)/45)*(7*fN[0]+32*fN[1]+12*fN[2]+32*fN[3]+7*fN[4])
def f(x):
return np.sin(x)
I = integrate_boole(f, 0, np.pi)
print(I) # Outputs 1.99857...
答案 2 :(得分:1)
我不确定您希望代码执行什么操作。布尔的规则。为什么要对函数样本(即np.sum(fN[2:-3:4])
)求和?我认为您的N
参数也没有很好地定义,因此我不确定它应该代表什么。也许您使用的是我不熟悉的另一条规则:我会让您决定。
无论如何,这是Wikipedia定义的Boole规则的实现。变量映射到您链接的Wikipedia版本:
def integ_boole(func, left, right):
h = (right - left) / 4
x1 = left
x2 = left + h
x3 = left + 2*h
x4 = left + 3*h
x5 = right # or left + 4h
result = (2*h / 45) * (7*func(x1) + 32*func(x2) + 12*func(x3) + 32*func(x4) + 7*func(x5))
return result
然后进行测试:
import numpy as np
print(integ_boole(np.sin, 0, np.pi))
输出1.9985707318238357
,非常接近2
的正确答案。
HTH。