Interpolations
Пакет Interpolations.jl реализует различные интерполяционные схемы на языке Julia. При его разработке ставилось целью обеспечить простоту использования, широкую поддержку алгоритмов и исключительную производительность.
В настоящее время этот пакет поддерживает B-сплайны и нерегулярные сетки. API проектировался с расчетом на расширение поддерживаемых возможностей. Будем очень рады вашим запросам на вытягивание! Следует отметить, что API со временем может развиваться.
На Julia реализованы и множество других пакетов для интерполяции. Их список см. в разделе Другие пакеты для интерполяции.
Некоторые из этих пакетов поддерживают методы, которых нет в пакете Interpolations
, поэтому если вы не нашли в нем чего-то нужного, обратитесь к другим пакетам или отправьте запрос на вытягивание.
Пример использования
Создание сетки xs
и массива интерполируемых значений A
:
xs = 1:0.2:5
A = log.(xs)
Создание объекта линейной интерполяции без экстраполяции:
interp_linear = linear_interpolation(xs, A)
interp_linear(3) # ровно log(3)
interp_linear(3.1) # примерно log(3.1)
interp_linear(0.9) # вне сетки: ошибка
Создание объекта линейной интерполяции с экстраполяцией:
interp_linear_extrap = linear_interpolation(xs, A,extrapolation_bc=Line())
interp_linear_extrap(0.9) # вне сетки: линейная экстраполяция
Пример эффективного использования
Приведенный выше пример использования LinearInterpolation
представляет собой по сути краткую форму записи для сочетания методов interpolate
, scale
и extrapolate
. Вам же могут быть не нужны все возможности масштабирования и экстраполяции.
interp_linear = extrapolate(scale(interpolate(A, BSpline(Linear())), xs))
Если известно, что часть, отвечающая за экстраполяцию, не требуется, можно использовать следующую форму записи:
scaled_itp = scale(interpolate(A, BSpline(Linear())), xs)
Если достаточно целочисленных узлов и регулярных сеток, можно также исключить масштабирование, чтобы еще более повысить производительность.
itp = interpolate(A, BSpline(Linear()))
Исключение масштабирования или экстраполяции позволяет ускорить интерполяцию за счет удаления ненужных операций и ветвей. Таким образом можно также обеспечить применение расширенных возможностей процессора SIMD (одна инструкция, множество данных).
Регулярные сетки
Пакет Interpolations.jl оптимизирован для использования с регулярными сетками с равномерным распределением. Максимальная производительность достигается в случае, когда узлы находятся в диапазоне AbstractUnitRange
, например 2:5
или Base.OneTo(9)
. Если узлы не указаны, то по умолчанию они задаются в виде диапазона UnitRange
, начинающегося с 1
.
Масштабирование
Если узлы не имеют единичного распределения или начинаются с определенного значения, отличного от 1
, можно использовать функцию scale
. Хотя это повышает гибкость интерполяции, производительность немного снижается. Дополнительные сведения см. в разделе Масштабированные B-сплайны.
Нерегулярные сетки
Если узлы имеют неравномерное распределение, диапазоны между ними необходимо масштабировать, как в случае с типом интерполяции Gridded
. Дополнительные сведения см. в разделе Сеточная интерполяция.
Точки за пределами узлов
Для точек, которые находятся не между узлами, можно использовать экстраполяцию. При этом в код вводится ветвь, которая проверяет, находится ли запрошенная точка в пределах узлов или за их пределами. Эта ветвь может замедлять векторизованные вычисления SIMD, что приводит к снижению производительности. См. раздел Экстраполяция.