Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用NumPy编写函数,以计算具有特定公差的积分_Python_Numpy_Numerical Integration - Fatal编程技术网

Python 使用NumPy编写函数,以计算具有特定公差的积分

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

我想编写一个自定义函数,以数字方式将表达式(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 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