如何限制 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,info['neval'],info['last']))

要积分的函数是二次多项式,可以通过两点高斯求积精确积分。 quad() 得到正确答案,但使用 21 点来做到这一点。这是输出

0.667,1.11e-14,21,1

此外,我只要求 0.1 的绝对误差,所以我什至不需要确切的结果。我发现无法强制 quad() 使用少于 21 次的函数调用,而不管 epsabs、epsrel 或 limit 的值如何。如何让 quad() 使用更少的函数调用

解决方法

这些是所有 21 次调用 xintgnd

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] 边界下,它似乎在连续更窄的一组点上评估函数。