2014-10-19 71 views
3

從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有同樣的問題。

+0

只是爲了確保天道酬勤(不正當的整合),不會造成問題,我改變了天道酬勤的數字,如5,10,和50.輸出結果顯示dblquad花費的時間比雙四分之一多15%。 – sunheng 2014-10-19 06:09:11

回答

2

看看source code。很明顯,dblquad只是一個重複的整合,就像你在這裏做的一樣。

重效率:SciPy的版本> 0.14可能是多元的功能更好,看到https://github.com/scipy/scipy/pull/3262

+0

感謝振亞的回答。 (但我不能投票。)我會嘗試未來的版本。我使用0.13打包在Ubuntu(Linux Mint)。這仍然是一個謎,爲什麼dblquad更慢。如果不是更好,我希望它具有與重複四倍的性能相同的性能。但我會那麼挑剔。等待測試未來引用的改進振亞。 – sunheng 2014-10-21 03:43:20

+0

@sunheng儘管你還沒有投票,考慮接受答案,如果它符合你的需求... – 2014-10-25 10:33:33

+0

@sunheng爲真正的多維數值積分方法,考慮[Cubature](http://ab-initio.mit.edu/ wiki/index.php/Cubature)包,可用於編程許多語言...... – 2014-10-25 10:34:37

相關問題