4

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

4

1 回答 1

3

看看源代码。很明显,dblquad 只是一个重复的集成,就像你在这里所做的一样。

重新效率:scipy 版本 >0.14 可能更适合多元函数,请参阅https://github.com/scipy/scipy/pull/3262

于 2014-10-20T10:51:21.890 回答