Мне нужно выполнить 2D-интеграцию (одно измерение имеет бесконечную границу). В MatLab я сделал это со встроенным2:
int_x = integral2(fun, 0, inf, 0, a, 'abstol', 0, 'reltol', 1e-6);
В Python я пробовал scipy dblquad:
int_x = scipy.integrate.dblquad(fun, 0, numpy.inf, lambda x: 0, lambda x: a, epsabs=0, epsrel=1e-6)
и также попытались использовать вложенные одиночные квадрациклы. К сожалению, оба варианта scipy занимают ~ 80 раз дольше, чем MatLab.
Мой вопрос: есть ли другая реализация 2D-интегралов в Python, которая может быть быстрее (я пробовал "quadpy" без особой пользы)? В качестве альтернативы, можно ли компилировать функцию MatLab integer2 и вызывать ее из python, не требуя времени выполнения MatLab (и это даже кошерное)?
Заранее спасибо! штифтик
Обновить:
Оказывается, у меня нет "репутации", чтобы отправить изображение уравнения, поэтому, пожалуйста, несите с форматированием: fun (N, t) = P (N) N ^ 2 S (N, t), где P (N) является логнормальным распределением вероятностей и S (N, t) довольно свернуто, но является экспонентой в его простейшем виде и гипергеометрической функцией (усеченным рядом) в ее наиболее сложной форме. N интегрируется от 0 до бесконечности и t от 0 до pi.
Я создал quadpy один раз, потому что скудные квадратурные функции были слишком медленными для меня. Если вы можете принести ваш подынтегральное выражение в одну из соответствующих форм (например, 2D-плоскость с весовой функцией exp(-x)
или exp(-x^2)
), вы должны посмотреть.
Сначала профиль. Если профиль говорит вам, что он оценивает, если вам fun
, тогда ваш лучший numba.jit
- либо numba.jit
, либо переписать его в Cython.
fun
нужно оценивать, и сколько времени нужно, чтобы каждый раз оцениватьfun
. «Умный» интегратор может свести к минимуму количествоfun
звонков (что может быть важно в связи сinf
). But I suspect MATLAB is getting most of its speed from some sort of
, чтоfun
). But I suspect MATLAB is getting most of its speed from some sort of
jit` компиляцииfun
.numpy/scipy
не делает ничего подобного. Но вы ничего не сказали нам оfun
.