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

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

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

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

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

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

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

7 голосов | спросил Keenan Pepper 31 J000000Sunday11 2011, 01:57:17

3 ответа


0

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

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

pip 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.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]
ответил Nico Schlömer 8 22016vEurope/Moscow11bEurope/MoscowTue, 08 Nov 2016 00:05:58 +0300 2016, 00:05:58
0

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

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

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

ответил mher 6 FriEurope/Moscow2013-12-06T21:42:23+04:00Europe/Moscow12bEurope/MoscowFri, 06 Dec 2013 21:42:23 +0400 2013, 21:42:23
0

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

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

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

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

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

ответил Andrew Mao 26 AMpTue, 26 Apr 2016 05:17:05 +030017Tuesday 2016, 05:17:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132