2014-10-19 1 views
3

Из справочного руководства scipy dblquad математически эквивалентен повторяемому квадрату в два раза. Первоначально я думал, что dblquad должно обладать преимуществом производительности в два раза (кроме удобства метода). К моему удивлению, кажется, что производительность dblquad еще хуже. Я взял примеры из «SciPy Reference Guide, 0.14.0 Release» с.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

Просто, чтобы убедиться, что Inf (несобственные интеграций) не вызывает проблему, я изменил Inf к ряду, как 5, 10, и 50. Результаты показывают, что dblquad тратит на 15% больше времени, чем двойной квад. – sunheng

ответ

2

Посмотрите на source code. Понятно, что dblquad - это просто повторная интеграция, как и то, что вы здесь делаете.

эффективность Re: SciPy версии> 0,14 может быть лучше для функций многих переменных см https://github.com/scipy/scipy/pull/3262

+0

Спасибо Женя за ответ. (Но я не могу голосовать.) Я попробую версию будущего, когда она будет доступна. Я использую 0.13, упакованный в Ubuntu (Linux Mint). По-прежнему остается загадкой, почему dblquad медленнее. Я ожидаю, что он будет иметь такую ​​же производительность, как и повторный квад, если не лучше. Но я был бы таким разборчивым. Просто подождите, чтобы проверить улучшение, которое Zhenya процитировала в будущем. – sunheng

+0

@sunheng, несмотря на то, что вы еще не можете проголосовать, считая, что принимаете ответ, если он соответствует вашим потребностям ... –

+0

@sunheng для Истинного многомерного метода цифровой интеграции, рассмотрим [Кубатуру] (http://ab-initio.mit.edu/ wiki/index.php/Cubature), доступный при программировании на многих языках ... –