Численное интегрирование в Python с адаптивной квадратурой векторизованной функции

Я ищу супер-пупер числовую квадратурную функцию. Он должен иметь следующие три свойства:

  • Адаптивный - он автоматически регулирует плотность точек выборки, чтобы соответствовать подынтегральному выражению. Это абсолютно необходимо, потому что моя интегральная функция очень неоднородна и требует больших затрат на вычисление.
  • Векторизованный - для повышения эффективности он вызывает подынтегральное выражение в списках точек выборки, а не по одной точке за раз.
  • Возможность обработки векторных функций - все компоненты векторнозначного подынтегрального выражения вычисляются одновременно без дополнительных затрат, поэтому нет смысла интегрировать все компоненты по отдельности.

Кроме того, должно быть:

  • 2D - интеграл, который я хочу вычислить, представляет собой двойной интеграл по плоской области, и я хочу иметь возможность указать общий (относительный) допуск для всего интеграла и соответствующим образом управлять бюджетом ошибок.

Кто-нибудь знает библиотеку с такой функцией? Даже два или три объекта из четырех было бы лучше, чем ничего.

Я использую Python и SciPy, поэтому, если он уже работает с Python, это бонус. (Но я также могу написать связующий код, чтобы он мог вызывать мою интегрируемую функцию, если это необходимо.)


person Keenan Pepper    schedule 30.07.2011    source источник
comment
Увы, ответов пока нет! Я пишу свой алгоритм численного интегрирования на C #. Он адаптивен и обрабатывает N-измерения, но не векторизован. Получение правильных конечных условий (толерантности) оказывается трудным.   -  person Paul Chernoch    schedule 02.10.2012
comment
@Keenan Pepper Может быть, процесс, описанный в этом вопросе, может дать вам кое-что понимание   -  person Saullo G. P. Castro    schedule 18.05.2013


Ответы (3)


Я только что реализовал векторизованную адаптивную квадратуру для 1D и 2D доменов в quadpy. Все, что вам нужно предоставить, - это триангуляция вашего домена и функции, которую вы хотите интегрировать. Он может быть векторным.

Установите quadpy с помощью

pip3 install quadpy

и беги

import numpy
import quadpy


triangles = numpy.array(
    [[[0.0, 0.0], [1.0, 0.0]], [[1.0, 0.0], [1.0, 1.0]], [[0.0, 1.0], [0.0, 1.0]]]
)

val, error_estimate = quadpy.triangle.integrate_adaptive(
    lambda x: [numpy.sin(x[0]), numpy.exp(x[0])], triangles, 1.0e-10
)

print(val)
print(error_estimate)

Это дает

[ 0.45969769  1.71828183]
[  7.10494337e-12   3.68776277e-11]
person Nico Schlömer    schedule 07.11.2016
comment
Я просто скопировал и вставил этот фрагмент кода, и он не работал с версией 0.13.2. Оказывается, adaptive_integrate должно быть integrate_adaptive. - person Pedro H. N. Vieira; 16.08.2019

Я использовал эту библиотеку, она делает все, что вы хотите, за исключением того, что она написана на C. Но у нее также есть интерфейс R, поэтому, возможно, вы можете вызвать R из Python (это возможно).

http://ab-initio.mit.edu/wiki/index.php/Cubature_(Multi-dimensional_integration)

Или вы можете вызвать библиотеку с помощью ctypes (это непросто, но выполнимо).

person mher    schedule 06.12.2013

Функция quadrature в _ 2_ удовлетворяет первым двум требованиям того, что вы ищете. Аналогичная функция romberg использует другой метод.

Остальные функции удовлетворяют только одному из требований:

  • Одноименная функция quad выполняет адаптивную квадратуру, но поддерживает только функция со скалярным аргументом. Вы можете передать ему функцию ctypes для повышения производительности, но обычные функции Python будут очень медленными.
  • Функция simps и связанные методы выборки могут передавать вектор (обычно с равномерным интервалом), но не адаптивными.

Третье требование, которое вы указали (одновременный интеграл векторнозначной функции), является немного эзотерическим и конфликтует с возможностью принимать векторизованную функцию в первую очередь (аргумент функции должен принимать матрицу!). вычисление двойного интеграла значительно усложнило бы спецификацию функции.

В большинстве случаев можно использовать функцию quadrature.

person Andrew Mao    schedule 26.04.2016