如何限制 scipy.integrate.quad 中函数调用的次数?

问题描述 投票:0回答: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()使用更少的函数调用?

python scipy numerical-integration quad
1个回答
1
投票

这些是对

x
 的所有 21 次调用的 
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] 范围内,它似乎在逐渐缩小的点集上评估函数。

© www.soinside.com 2019 - 2024. All rights reserved.