如何限制 scipy.integrate.quad 中的函数调用次数?
How to limit number of function calls in scipy.integrate.quad?
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,err,info['neval'],info['last']))
要积分的函数是一个二次多项式,可以用双点高斯求积法精确积分。 quad() 得到正确答案,但使用 21 个点来做。这是输出:
0.667, 1.11e-14, 21, 1
而且我只要求0.1的绝对误差,所以我什至不需要精确的结果。我发现没有办法强制 quad() 使用少于 21 个函数调用,无论 epsabs、epsrel 或 limit 的值如何。如何让 quad() 使用更少的函数调用?
这些是对 intgnd
的所有 21 次调用的 x
值
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] 范围内,似乎是在连续变窄的一组点上评估函数。
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,err,info['neval'],info['last']))
要积分的函数是一个二次多项式,可以用双点高斯求积法精确积分。 quad() 得到正确答案,但使用 21 个点来做。这是输出:
0.667, 1.11e-14, 21, 1
而且我只要求0.1的绝对误差,所以我什至不需要精确的结果。我发现没有办法强制 quad() 使用少于 21 个函数调用,无论 epsabs、epsrel 或 limit 的值如何。如何让 quad() 使用更少的函数调用?
这些是对 intgnd
x
值
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] 范围内,似乎是在连续变窄的一组点上评估函数。