Более быстрое вычисление двойного интеграла в python (как интеграл MatLab2)

1

Мне нужно выполнить 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.

  • 0
    С интегралами есть две большие переменные времени: сколько раз это 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 .
  • 0
    Интересно, спасибо @hpaulj. См. Выше некоторые дополнительные, но все же ограниченные, подробности о «веселье». Как вы думаете, лучше всего было бы считать джит-тинг «забавным» (не уверен, как это работает).
Показать ещё 5 комментариев
Теги:
scipy
numerical-integration

2 ответа

0

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню