從scipy參考手冊中,dblquad在數學上相當於重複四次。最初,我認爲dblquad必須具有超過兩倍四倍的性能優勢(除了該方法的便利之外)。令我驚訝的是,似乎dblquad的表現更糟。我從「SciPy的參考指南,發行0.14.0」 12-13一些修改頁面的例子:dblquad在兩次四元組上有沒有性能增益?
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有同樣的問題。
只是爲了確保天道酬勤(不正當的整合),不會造成問題,我改變了天道酬勤的數字,如5,10,和50.輸出結果顯示dblquad花費的時間比雙四分之一多15%。 – sunheng 2014-10-19 06:09:11