dblquad相比于两次quad有性能提升吗?

4 投票
1 回答
1409 浏览
提问于 2025-04-28 08:52

根据scipy的参考手册,dblquad在数学上等同于重复使用quad两次。起初,我以为dblquad在性能上应该比使用两次quad更好(除了方法上更方便)。但让我惊讶的是,dblquad的性能似乎更差。我从“SciPy参考指南,版本0.14.0”的第12-13页取了一些例子,并做了一些修改:

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也有同样的疑问。

暂无标签

1 个回答

3

看看这个源代码。很明显,dblquad其实就是重复进行积分,就像你在这里做的那样。

关于效率:scipy版本大于0.14可能在处理多变量函数时表现更好,具体可以参考这个链接

撰写回答