根据scipy参考手册,dblquad在数学上等价于重复的quad两次。最初,我认为dblquad必须比两倍quad具有性能优势(除了方法的方便性)。令我惊讶的是,dblquad的性能似乎更差。我从第12-13页的“SciPy参考指南,0.14.0版”中获取了一些示例,并做了一些修改:
import scipy
import math
import timeit
def integrand(t, n, x):
return math.exp(-x*t) / t**n
def expint(n, x):
return scipy.integrate.quad(integrand, 1, scipy.Inf, args=(n, x))[0]
def I11():
res = []
for n in range(1,5):
res.append(scipy.integrate.quad(lambda x: expint(n, x), 0, scipy.Inf)[0])
return res
def I2():
res = []
for n in range(1,5):
res.append(scipy.integrate.dblquad(lambda t, x: integrand(t, n, x), 0, scipy.Inf, lambda x: 1, lambda x: scipy.Inf)[0])
return res
print('twice of quad:')
print(I11())
print(timeit.timeit('I11()', setup='from __main__ import I11', number=100))
print('dblquad:')
print(I2())
print(timeit.timeit('I2()', setup='from __main__ import I2', number=100))
我的输出如下:
twice of quad:
[1.0000000000048965, 0.4999999999985751, 0.33333333325010883, 0.2500000000043577]
5.42371296883
dblquad:
[1.0000000000048965, 0.4999999999985751, 0.33333333325010883, 0.2500000000043577]
6.31611323357
我们看到这两种方法产生了相同的结果(准确的结果应该是1,1/2,1/3,1/4)。但是dblquad的性能更差。
有人知道dblquad是怎么回事吗?我对tplquad和nquad也有同样的问题。
最佳答案
看看source code。很明显,dblquad只是一个重复的集成,就像您在这里所做的一样。
回复效率:scipy版本>0.14对于多变量函数可能更好,请参见https://github.com/scipy/scipy/pull/3262