Python 使用NumPy编写函数,以计算具有特定公差的积分
我想编写一个自定义函数,以数字方式将表达式(python或lambda函数)与特定的容差进行集成。我知道使用Python 使用NumPy编写函数,以计算具有特定公差的积分,python,numpy,numerical-integration,Python,Numpy,Numerical Integration,我想编写一个自定义函数,以数字方式将表达式(python或lambda函数)与特定的容差进行集成。我知道使用scipy.integrate.quad可以简单地更改epsabs,但我想自己用numpy编写函数 从我了解的功能: def integrate(f, a, b, N): x = np.linspace(a+(b-a)/(2*N), b-(b-a)/(2*N), N) fx = f(x) area = np.sum(fx)*(b-a)/N return ar
scipy.integrate.quad
可以简单地更改epsabs
,但我想自己用numpy编写函数
从我了解的功能:
def integrate(f, a, b, N):
x = np.linspace(a+(b-a)/(2*N), b-(b-a)/(2*N), N)
fx = f(x)
area = np.sum(fx)*(b-a)/N
return area
给出了N段的数值积分。如何编写另一个函数或扩展此函数以获取
tol
输入并增加N,直到两个后续计算之间的差值小于给定的公差?使用您拥有的函数,可以从合理的N开始,例如5,并将数字加倍,直到达到所需的精度
def integrate_tol(f, a, b, tol):
N = 5
old_integral = integrate(f, a, b, N)
while True:
N *= 2
new_integral = integrate(f, a, b, N)
if np.abs(old_integral - new_integral) < tol:
return (4*new_integral - old_integral)/3
old_integral = new_integral
印刷品
2.3504023872876028
2.3504023872876028
不能保证错误确实小于tol
(但同样,scipy.quad
也不能保证)。在实践中,由于我使用的技巧,误差将比tol小得多:返回值(4*new\u integral-old\u integral)/3
通常比新的或旧的近似值本身更精确。(说明:由于integrate
使用了中点规则,N的每一倍都会减少大约4倍的误差。因此,采用组合4*new_integral-old_integral
几乎可以抵消这两个结果中的残余误差。)
(备注:在while循环中,从N=1开始是不明智的;这可能不够,而且由于一些数值上的巧合,例如函数在很多地方为零,过早停止的风险更高。)干得好。我认为我们也可以计算一些随机N的积分,然后考虑Int(N)渐近线的函数,我们可以拟合一个S形函数(例如erf)来估计正确的N以获得正确的公差。你怎么想?没有一种数值积分方法,在没有对函数的某些假设(如导数边界)的情况下,可以保证误差边界。如果错误界限很重要,那么从读取开始。拟合具有超指数衰减的erf在这里没有意义。
2.3504023872876028
2.3504023872876028