自定义函数的未知误差,用于逼近积分

时间:2018-11-28 15:56:16

标签: python numpy sum calculus

我已经定义了以下函数作为使用布尔定律近似积分的方法:

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之后得到的代码中/应该很清楚。

3 个答案:

答案 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。