自定函数逼近整数的未知误差

2024-10-02 18:15:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我将以下函数定义为使用布尔法则近似积分的方法:

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之后的代码应该/可能很清楚。你知道吗


Tags: 方法函数答案return定义def错误np
3条回答

首先,正如尼克松所指出的,你的一个系数是错误的。那么,我认为你并不真正理解布尔法则是如何工作的——它只使用函数的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...

从快速检查来看,f(x4)的乘积应该是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])

我不知道你希望你的代码符合w.r.t.布尔法则。为什么要对函数的样本求和(即np.sum(fN[2:-3:4]))?我认为你的N参数也没有很好的定义,我不确定它应该代表什么。也许你在用另一条我不熟悉的规则:我让你决定。你知道吗

不管怎样,这里有一个布勒规则的实现,正如维基百科所定义的。变量映射到您链接的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的正确答案。你知道吗

嗯。你知道吗

相关问题 更多 >