Документация Engee

interp1

Страница в процессе разработки.

Одномерная интерполяция данных (таблица поиска).

Библиотека

EngeeDSP

Синтаксис

Вызов функции

  • vq = interp1(x,v,xq) — возвращает интерполированные значения одномерной функции в заданных точках запроса. По умолчанию функция interp1 использует линейную интерполяцию. Вектор x содержит точки выборки, а v — соответствующие значения . Вектор xq содержит координаты точек запроса.

    Если у вас есть несколько наборов данных, полученных из одних и тех же точек, вы можете передать v как массив. Каждый столбец массива v содержит свой набор одномерных значений выборки.

  • vq = interp1(x,v,xq,method) — определяет альтернативный метод интерполяции: "linear", "nearest", "next", "previous", "pchip", "cubic", "v5cubic", "makima" или "spline". Метод по умолчанию — "linear".

  • vq = interp1(x,v,xq,method,extrapolation) — определяет стратегию оценки точек, лежащих вне области определения x. Установите для аргумента extrapolation значение "extrap", чтобы использовать алгоритм method для экстраполяции. В качестве альтернативы можно указать скалярное значение, и в этом случае функция interp1 вернет это значение для всех точек вне области определения x.

  • vq = interp1(v,xq) — возвращает интерполированные значения и предполагает набор координат точек выборки по умолчанию. Точки по умолчанию представляют собой последовательность чисел от 1 до n, где n зависит от формы v:

    • если v — вектор, точки по умолчанию имеют вид 1:length(v);

    • если v — массив, точки по умолчанию имеют вид 1:size(v,1).

    Используйте этот синтаксис, если вас не интересуют абсолютные расстояния между точками.

  • vq = interp1(v,xq,method) — определяет любой из альтернативных методов интерполяции и использует точки выборки по умолчанию.

  • vq = interp1(v,xq,method,extrapolation) — определяет стратегию экстраполяции и использует точки выборки по умолчанию.

Аргументы

Входные аргументы

# x — точки выборки
вектор

Details

Точки выборки, заданные как вектор-строка или вектор-столбец вещественных чисел. Значения в x должны быть различны. Длина x должна соответствовать одному из следующих требований:

  • если v — вектор, то length(x) должна быть равна length(v);

  • если v — массив, то length(x) должна быть равна size(v,1).

Типы данных

Float32, Float64

# v — значения выборки
вектор | матрица | массив

Details

Значения выборки, заданные как вектор, матрица или массив вещественных или комплексных чисел. Если v — матрица или массив, то каждый столбец содержит отдельный набор одномерных значений.

Если v содержит комплексные числа, то функция interp1 интерполирует вещественную и мнимую части отдельно.

Типы данных

Float32, Float64

Поддержка комплексных чисел

Да

# xq — точки запроса
скаляр | вектор | матрица | массив

Details

Точки запроса, заданные как скаляр, вектор, матрица или массив вещественных чисел.

Типы данных

Float32, Float64

# method — метод интерполяции
"linear" (по умолчанию) | "nearest" | "next" | "previous" | "pchip" | "cubic" | "v5cubic" | "makima" | "spline"

Details

Метод интерполяции, заданный как один из вариантов в этой таблице.

Метод Описание Непрерывность Комментарии

"linear"

Линейная интерполяция. Интерполированное значение в точке запроса основано на линейной интерполяции значений в соседних точках сетки в каждом соответствующем измерении. Это метод интерполяции по умолчанию.

  • Требуется не менее 2 точек

  • Требует больше памяти и времени вычислений, чем интерполяция по методу ближайшего соседа

"nearest"

Интерполяция по методу ближайшего соседа. Интерполированное значение в точке запроса — это значение в ближайшей точке сетки выборки.

Прерывистый

  • Требуется не менее 2 точек

  • Небольшие требования к памяти

  • Самое быстрое время вычислений

"next"

Интерполяция до следующего соседа. Интерполированное значение в точке запроса — это значение в следующей точке сетки выборки.

Прерывистый

  • Требуется не менее 2 точек

  • Такие же требования к памяти и время вычислений, как у "nearest"

"previous"

Интерполяция по предыдущему соседу. Интерполированное значение в точке запроса — это значение в предыдущей точке сетки выборки.

Прерывистый

  • Требуется не менее 2 точек

  • Такие же требования к памяти и время вычислений, как у "nearest"

"pchip"

Кусочно-кубическая интерполяция с сохранением формы. Интерполированное значение в точке запроса основано на кусочно-кубической интерполяции значений в соседних точках сетки с сохранением формы.

  • Требуется не менее 4 точек

  • Требует больше памяти и времени вычислений, чем "linear"

"cubic"

Кубическая свертка, используемая в Engee.

  • Требуется не менее 3 точек

  • Точки должны быть равномерно распределены

  • Для неравномерно распределенных данных этот метод использует интерполяцию "spline"

  • Требования к памяти и время вычислений аналогичны "pchip"

"v5cubic"

То же, что и "cubic".

"makima"

Модифицированная интерполяция Акимы по кубическим многочленам Эрмита. Интерполированное значение в точке запроса основано на кусочно-линейной функции многочленов степени не выше третьей. Формула Акимы модифицирована для предотвращения выбросов.

  • Требуется не менее 2 точек

  • Создает меньше волнистости, чем "spline", но не сглаживает так агрессивно, как "pchip"

  • Вычисления требуют больше ресурсов, чем "pchip", но обычно меньше, чем "spline"

  • Требования к памяти аналогичны "spline"

"spline"

Сплайн-интерполяция с использованием условий «not-a-knot». Интерполированное значение в точке запроса основано на кубической интерполяции значений в соседних точках сетки в каждом соответствующем измерении.

  • Требуется не менее 4 точек, при наличии 2 или 3 точек применяется линейная или квадратичная интерполяция соответственно

  • Требует больше памяти и времени вычислений, чем "pchip"

# extrapolation — стратегия экстраполяции
"extrap" | скаляр

Details

Стратегия экстраполяции, заданная как "extrap" или вещественное скалярное значение.

  • Укажите "extrap", если хотите, чтобы функция interp1 вычисляла точки вне области определения тем же методом, что и для интерполяции.

  • Укажите скалярное значение, если хотите, чтобы функция interp1 возвращала определенное константное значение для точек вне области определения.

Поведение по умолчанию зависит от входных аргументов:

  • Если указаны методы интерполяции "pchip", "spline" или "makima", то поведение по умолчанию — "extrap".

  • Все остальные методы интерполяции по умолчанию возвращают NaN для точек запроса вне области определения.

Типы данных

Char, String, Float32, Float64

Выходные аргументы

# vq — интерполированные значения
скаляр | вектор | матрица | массив

Details

Интерполированные значения, возвращаемые в виде скаляра, вектора, матрицы или массива. Размер vq зависит от формы v и xq.

Форма v Форма xq Размер vq Пример

Вектор

Вектор

size(xq)

Если size(v) = [1 100] и size(xq) = [1 500], то size(vq) = [1 500].

Вектор

Матрица или N-мерный массив

size(xq)

Если size(v) = [1 100] и size(xq) = [50 30], то size(vq) = [50 30].

Матрица или N-мерный массив

Вектор

[length(xq) size(v,2),…,size(v,n)]

Если size(v) = [100 3] и size(xq) = [1 500], то size(vq) = [500 3].

Матрица или N-мерный массив

Матрица или N-мерный массив

[size(xq,1),…,size(xq,n),… size(v,2),…,size(v,m)]

Если size(v) = [4 5 6] и size(xq) = [2 3 7], то size(vq) = [2 3 7 5 6].

Примеры

Интерполяция грубо дискретизированной синусоидальной функции

Details

Определим точки выборки x и соответствующие им значения выборки v.

x = 0:π/4:2π
v = sin.(x)

Определим точки запроса для более точной выборки в диапазоне x.

xq = 0:π/16:2π

Интерполируем функцию в точках запроса и построим график результата.

import EngeeDSP.Functions: interp1

vq1 = interp1(x, v, xq)

plot(xq, vq1, linestyle = :dot)
scatter!(x, v,
         markershape = :circle,
         xlims = (0, 2π),
         title = "(Default) Linear Interpolation")

interp1 1

Теперь оценим v в тех же точках, используя метод "spline".

vq2 = interp1(x, v, xq, "spline")

plot(xq, vq2, linestyle = :dot)
scatter!(x, v,
         markershape = :circle,
         xlims = (0, 2π),
         title = "Spline Interpolation")

interp1 2

Интерполяция без указания точек

Details

Определим набор значений функции.

v = [0, 1.41, 2, 1.41, 0, -1.41, -2, -1.41, 0]

Определим набор точек запроса, попадающих в интервал между точками по умолчанию, 1:9. В данном случае точки по умолчанию — 1:9, поскольку v содержит 9 значений.

xq = 1.5:8.5

Оценим v в точках xq.

import EngeeDSP.Functions: interp1

vq = interp1(v, xq)

Построим график результата.

plot(1:9, v,
     seriestype = :scatter,
     markershape = :circle,
     label = "v")
plot!(xq, vq,
      seriestype = :scatter,
      markershape = :diamond,
      label = "vq")

interp1 3

Интерполяция комплексных значений

Details

Определим набор точек выборки.

x = 1:10

Определим значения функции в точках выборки.

v = 5*x + x.^2*1im

Определим точки запроса для более точной выборки в диапазоне x.

xq = 1:0.25:10

Интерполируем v в точках запроса.

import EngeeDSP.Functions: interp1

vq = interp1(x, v, xq)

Вещественную часть результата изобразим красным цветом, а мнимую часть — синим.

plot(x, real(v),
     seriestype = :scatter,
     color = :red,
     markershape = :diamond)
plot!(xq, real(vq), color = :red)
plot!(x, imag(v),
     seriestype = :scatter,
     color = :blue,
     markershape = :diamond)
plot!(xq, imag(vq), color = :blue)

interp1 4

Экстраполяция двумя разными методами

Details

Определим точки выборки x и соответствующие им значения выборки v.

x = [1, 2, 3, 4, 5]
v = [12, 16, 31, 10, 6]

Укажем точки запроса xq, которые выходят за пределы области определения x.

xq = [0, 0.5, 1.5, 5.5, 6]

Оценим v в точке xq, используя метод "pchip".

import EngeeDSP.Functions: interp1

vq1 = interp1(x, v, xq, "pchip")
5-element Vector{Float64}:
 19.36842105263158
 13.631578947368421
 13.210526315789474
  7.48
 12.559999999999999

Далее оценим v в точке xq, используя метод "linear".

vq2 = interp1(x, v, xq, "linear")
5-element Vector{Float64}:
 NaN
 NaN
  14.0
 NaN
 NaN

Теперь используем метод "linear" с опцией "extrap".

vq3 = interp1(x, v, xq, "linear", "extrap")
5-element Vector{Float64}:
  8.0
 10.0
 14.0
  4.0
  2.0

"pchip" экстраполирует по умолчанию, а "linear" — нет.

Назначение постоянного значения для всех запросов вне области определения x

Details

Определим точки выборки x и соответствующие им значения выборки v.

x = [-3, -2, -1, 0, 1, 2, 3]
v = 3*x.^2

Укажем точки запроса xq, которые выходят за пределы области определения x.

xq = [-4, -2.5, -0.5, 0.5, 2.5, 4]

Теперь оценим v в точках xq, используя метод "pchip", и присвоим любому значению вне области определения x значение 27.

import EngeeDSP.Functions: interp1

vq = interp1(x, v, xq, "pchip", 27)
6-element Vector{Float64}:
 27.0
 18.65625
  0.9375
  0.9375
 18.65625
 27.0

Интерполяция нескольких наборов данных за один ход

Details

Определим точки выборки.

x = (-5:5)

Выберем три различные параболические функции в точках, определенных в x.

v1 = x.^2
v2 = 2*x.^2 .+ 2
v3 = 3*x.^2 .+ 4

Создайте матрицу v, столбцами которой являются векторы v1, v2 и v3.

v = [v1 v2 v3]

Определим набор точек запроса xq для более точной выборки в диапазоне x.

xq = -5:0.1:5

Оценим все три функции в точках xq и построим график результатов.

import EngeeDSP.Functions: interp1

vq = interp1(x, v, xq, "pchip")

plot(x, v, seriestype = :scatter, markershape = :circle)
plot!(xq, vq, xticks = (-5:5))

interp1 5

Кружочки на графике обозначают v, а сплошные линии обозначают vq.

Дополнительно

Акима и сплайн-интерполяция

Details

Алгоритм Акимы для одномерной интерполяции, описанный в [1] и [2], выполняет кубическую интерполяцию для получения кусочных многочленов с непрерывными производными первого порядка ( ). Алгоритм сохраняет наклон и избегает волнистости на плоских участках. Плоский участок возникает, когда имеется три или более последовательных коллинеарных точек, которые алгоритм соединяет прямой линией. Чтобы гарантировать, что область между двумя точками данных является плоской, вставьте между ними дополнительную точку данных.

При пересечении двух плоских областей с разными наклонами модификация исходного алгоритма Акимы придает больший вес стороне, наклон которой ближе к нулю. Эта модификация отдает приоритет стороне, расположенной ближе к горизонтали, что более интуитивно понятно и позволяет избежать перерегулирования. (Исходный алгоритм Акимы придает равные веса точкам с обеих сторон, тем самым равномерно распределяя волнистость.)

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

По сравнению со сплайн-алгоритмом, алгоритм Акимы создает меньше волнообразных колебаний и лучше подходит для обработки быстрых изменений между плоскими областями.

Литература

  1. Akima, Hiroshi. «A new method of interpolation and smooth curve fitting based on local procedures.» Journal of the ACM (JACM), 17.4, 1970, pp. 589–602

  2. Akima, Hiroshi. «A method of bivariate interpolation and smooth surface fitting based on local procedures.» Communications of the ACM, 17.1, 1974, pp. 18–20.