2014-10-19 10 views
3

scipy 참조 설명서에서 dblquad는 수학적으로 반복 쿼드와 2 회 동일합니다. 처음에는 dblquad가 성능 이점을 2 배 쿼드 이상으로 가져야한다고 생각했습니다 (메서드의 편리함 외). 놀라운 것은 dblquad 성능이 더 나빠진 것 같습니다. 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 

우리는 두 가지 방법이 동일한 생산보고 나는 약간의 수정을 "SciPy 참조 설명서, 릴리스 0.14.0"12-13 페이지에서 예를했습니다 결과 (정확한 결과는 1, 1/2, 1/3, 1/4이어야 함). 그러나 dblquad는 더 나쁜 수행합니다.

누군가가 dblquad에 대해 어떤 통찰력을 가지고 있습니까? 나는 또한 tplquad와 nquad에 대해 같은 질문을한다.

+0

는 그냥 문제가 발생하지 않도록 Inf를 (부적절한 통합을)하려면, 내가, 5, 10과 같은 숫자로 Inf를 변경하고 50. 출력 결과는 더블 쿼드보다 약 15 % 더 많은 시간을 소비합니다. – sunheng

답변

2

source code을 살펴보십시오. dblquad는 여기에서하는 것처럼 반복되는 통합입니다.

다시 효율 : scipy 버전> 0.14 참조, 다변량 기능에 대한 더 좋을 수도 https://github.com/scipy/scipy/pull/3262

+0

대답은 Zhenya에게 감사드립니다. (하지만 투표 할 수는 없습니다.) 가능할 때 미래 버전을 시험해 보겠습니다. 나는 Ubuntu (Linux Mint)에 0.13을 사용하고있다. 그것은 여전히 ​​dblquad가 느린 퍼즐입니다. 나는 더 나은 것이 아니라면 반복되는 쿼드와 같은 성능을 기대합니다. 하지만 나는 까다 롭다. Zhenya가 앞으로 인용 한 개선 사항을 테스트하기 위해 기다려주십시오. – sunheng

+0

@ sunheng 당신이 아직 투표 할 수 없다고해도, 당신의 요구에 맞는 대답을 받아들이는 것을 고려해보십시오. ... –

+0

@sunheng 진정한 다차원 적분 방법은 [Cubature] (http://ab-initio.mit.edu/ wiki/index.php/Cubature) 패키지, 다양한 언어로 프로그래밍 가능 ... –