NumericalIntegration
Это простой пакет, предоставляющий функциональность для численного интегрирования предварительно дискретизированных данных (то есть вы не можете выбирать произвольные узлы). Если у вас есть возможность определять интеграл в произвольных точках, используйте для этого более эффективные инструменты (например, прекрасный пакет FastGaussQuadrature.jl).
Обратите внимание, что хотя код тривиален, он не был тщательно протестирован и не ориентирован на числовую точность. Приветствуется публикация проблем, предложений и запросов на вытягивание.
Пример использования
# настройка некоторых данных
x = collect(-π/2 : π/1000 : π/2)
y = sin.(x)
# интеграция с помощью трапецеидального метода (Trapezoidal) по умолчанию
integrate(x, y)
# интеграция с помощью конкретного метода
integrate(x, y, SimpsonEven())
# вычисление совокупного интеграла
Y = cumul_integrate(x, y)
# вычисление совокупного интеграла для каждого столбца массива
z = [sin.(x) cos.(x) exp.(x/pi)]
Z = cumul_integrate(x, z)
# вычисление совокупного интеграла для каждой строки массива
zp = permutedims(z)
ZP = cumul_integrate(x, zp, dims=1)
# Многомерная интеграция
Y = [i*j for i=x,j=y]
integrate((x,y), Y)
На данный момент доступны следующие методы:
-
Trapezoidal (по умолчанию)
-
TrapezoidalEven
-
TrapezoidalFast
-
TrapezoidalEvenFast
-
SimpsonEven
-
SimpsonEvenFast
-
RombergEven
В настоящее время для кумулятивных интегралов и многомерных интегралов используются только трапецеидальные методы (Trapezoidal).
Все методы, содержащие в названии Even, предполагают равномерное распределение данных. Все методы, содержащие Fast, опускают базовые проверки корректности и делают акцент на производительности. Следовательно, быстрые методы будут завершаться сбоем или выдавать неверные результаты, если вы укажете неправильные данные (векторы разной длины и т. д.). Для работы метода RombergEven необходимо равномерное распределение точек в степени 2 + 1 (9, 17, 33, 65, 129, 257, 513, 1025…). Это полезно, если требуется контроль точности.