Численное интегрирование в Python с адаптивной квадратурой векторизованной функции - PullRequest
7 голосов
/ 31 июля 2011

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 08 ноября 2016

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

Установить quadpy с

pip3 install quadpy --user

и запустить

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.adaptive_integrate(
        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]
1 голос
/ 26 апреля 2016

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

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

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

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

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

1 голос
/ 06 декабря 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...