问题描述
Scipy.integrate.quad() 在某些情况下似乎会调用太多函数。下面是一个简单的测试来演示:
import numpy as np
from scipy import integrate
def intgnd(x):
p = x + x**2
return p
x0=-1
x1=1
epsrel=0.1
epsabs=0.1
I,err,info = integrate.quad(intgnd,x0,x1,full_output=1,epsabs=epsabs,epsrel=epsrel)
print("{:.3f},{:.3g},{},{}".format(I,info['neval'],info['last']))
要积分的函数是二次多项式,可以通过两点高斯求积精确积分。 quad() 得到正确答案,但使用 21 点来做到这一点。这是输出:
0.667,1.11e-14,21,1
此外,我只要求 0.1 的绝对误差,所以我什至不需要确切的结果。我发现无法强制 quad() 使用少于 21 次的函数调用,而不管 epsabs、epsrel 或 limit 的值如何。如何让 quad() 使用更少的函数调用?
解决方法
这些是所有 21 次调用 x
的 intgnd
值
In [323]: np.array(j)
Out[323]:
array([ 0.,-0.97390653,0.97390653,-0.86506337,0.86506337,-0.67940957,0.67940957,-0.43339539,0.43339539,-0.14887434,0.14887434,-0.99565716,0.99565716,-0.93015749,0.93015749,-0.78081773,0.78081773,-0.56275713,0.56275713,-0.29439286,0.29439286])
在 [-1,1] 边界下,它似乎在连续更窄的一组点上评估函数。