Python 如何限制scipy.integrate.quad中函数调用的数量?
Scipy.integrate.quad()在某些情况下似乎进行了太多的函数调用。下面是一个简单的测试来演示:Python 如何限制scipy.integrate.quad中函数调用的数量?,python,scipy,integrate,quad,Python,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=epsab
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]范围内,它似乎在连续较窄的点集上对函数进行求值。既然您可以像我一样阅读文档,我可能就不必费心评论了。你理解全部输出吗?你看过其他的集成方法吗?我在几个描述中看到了gausian。从文档中可以看出,0.667是积分的结果,我用手检查了它,它对3digits是正确的。1.11e-14是估计的绝对误差,这对我来说已经足够接近零了。“nval”是函数求值的数量,“last”是子区间的数量,它不低于1。我同意一个可能的解决方案就是不要使用quad。但我的问题是万一quad没事,而我做错了什么,为什么你做的事情会有什么问题呢。任务被传递给一些“优化”的Fortran/C包。我们不知道它是如何运作的(我对此一无所知)。除了研究代码,我们能做的最好的事情就是实验。也许我们无法做任何事情来减少呼叫数量。编写自己的原始数字积分并不难。我们都学会了基本的梯形法则。“辛普森一家”是我想到的另一个名字,虽然我已经研究了很多年了。我认为你的评论可能没有任何方法来减少函数调用的数量才是真正的答案。谢谢你花时间思考这个问题。