Более быстрое вычисление двойного интеграла в python (как интеграл MatLab2) - PullRequest
0 голосов
/ 16 сентября 2018

Мне нужно выполнить 2D-интеграцию (одно измерение имеет бесконечную границу).В MatLab я сделал это с интегралом 2:

int_x = integral2(fun, 0, inf, 0, a, 'abstol', 0, 'reltol', 1e-6);

В Python я попробовал dblquad scipy:

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" без особой выгоды)?В качестве альтернативы, могу ли я скомпилировать функцию Matrix 2 и использовать ее из Python, не требуя времени выполнения MatLab (и это даже кошерное)?

Заранее спасибо!Брэд


Обновление:

Оказывается, у меня нет "репутации", чтобы опубликовать изображение уравнения, поэтому, пожалуйста, имейте в виду форматирование: fun (N, t) = P (N) N ^ 2 S (N, t), где P (N) - логнормальное распределение вероятностей, а S (N, t) - довольно замысловатое, но экспоненциальное в простейшем виде и гипергеометрическая функция (усеченная)серия) в его наиболее сложной форме.N интегрируется от 0 до бесконечности и t от 0 до пи.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Я создал quadpy один раз, потому что квадратные функции scipy были слишком медленными для меня. Если вы можете привести свое подынтегральное выражение в одну из соответствующих форм (например, плоскость 2D с весовой функцией exp(-x) или exp(-x^2)), вам следует взглянуть.

0 голосов
/ 21 сентября 2018

Сначала профиль. Если профиль говорит вам, что это оценки, если fun, тогда вам лучше всего либо numba.jit, либо переписать его на Cython.

...