2016-09-24 104 views
0

我需要在python中減少quad()的運行時間(我正在集成幾千個積分)。我在這裏發現了一個類似的問題,他們建議做幾個集成並添加部分值。但是,這不會提高性能。有什麼想法嗎?這裏是一個簡單的例子:數值積分python

import numpy as np      
from scipy.integrate import quad 
from scipy.stats import norm 
import time 

funcB = lambda x: norm.pdf(x,0,1) 

start = time.time() 
good_missclasified,_ = quad(funcB, 0,3.3333) 
stop = time.time() 
time_elapsed = stop - start 
print ('quad : ' + str(time_elapsed)) 

start = time.time() 
num = np.linspace(0,3.3333,10) 
Lv = [] 
last, lastG = 0, 0 
for g in num: 
    Lval,x = quad(funcB, lastG, g) 
    last, lastG = last + Lval, g 
    Lv.append(last) 
Lv = np.array(Lv) 
stop = time.time() 

time_elapsed = stop - start 
print ('10 int : ' + str(time_elapsed)) 
print(good_missclasified,Lv[9]) 

回答

1

quadpy(我的一個項目)是矢量,可以一次整合在許多領域(例如,間隔)的功能。儘管如此,您必須選擇自己的集成方法。

import numpy 
import quadpy 

a = 0.0 
b = 1.0 
n = 100 
start_points = numpy.linspace(a, b, n, endpoint=False) 
h = (b-a)/n 
end_points = start_points + h 
intervals = numpy.array([start_points, end_points]) 

vals = quadpy.line_segment.integrate(
     numpy.exp, 
     intervals, 
     quadpy.line_segment.GaussKronrod(3) 
     ) 

print(vals)