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, что приводит к снижению производительности. См. раздел Экстраполяция.