2016-09-24 4 views
0

Мне нужно сократить время работы для quad() в python (я интегрирую несколько тысяч интегралов). Я нашел здесь аналогичный вопрос, где они предложили сделать несколько интеграций и добавить частичные значения. Однако это не улучшает производительность. Есть предположения? вот простой пример:численное интегрирование 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) 
Смежные вопросы