interp1
|
Страница в процессе разработки. |
Одномерная интерполяция данных (таблица поиска).
| Библиотека |
|
Синтаксис
Вызов функции
-
vq = interp1(x,v,xq,method,extrapolation)— определяет стратегию оценки точек, лежащих вне области определенияx. Установите для аргументаextrapolationзначение"extrap", чтобы использовать алгоритмmethodдля экстраполяции. В качестве альтернативы можно указать скалярное значение, и в этом случае функцияinterp1вернет это значение для всех точек вне области определенияx.
-
vq = interp1(v,xq)— возвращает интерполированные значения и предполагает набор координат точек выборки по умолчанию. Точки по умолчанию представляют собой последовательность чисел от1доn, гдеnзависит от формыv:Используйте этот синтаксис, если вас не интересуют абсолютные расстояния между точками.
-
vq = interp1(v,xq,method,extrapolation)— определяет стратегию экстраполяции и использует точки выборки по умолчанию.
Аргументы
Входные аргументы
#
x —
точки выборки
вектор
Details
Точки выборки, заданные как вектор-строка или вектор-столбец вещественных чисел. Значения в x должны быть различны. Длина x должна соответствовать одному из следующих требований:
| Типы данных |
|
#
v —
значения выборки
вектор | матрица | массив
Details
Значения выборки, заданные как вектор, матрица или массив вещественных или комплексных чисел. Если v — матрица или массив, то каждый столбец содержит отдельный набор одномерных значений.
Если v содержит комплексные числа, то функция interp1 интерполирует вещественную и мнимую части отдельно.
| Типы данных |
|
| Поддержка комплексных чисел |
Да |
#
xq —
точки запроса
скаляр | вектор | матрица | массив
Details
Точки запроса, заданные как скаляр, вектор, матрица или массив вещественных чисел.
| Типы данных |
|
#
method —
метод интерполяции
"linear" (по умолчанию) | "nearest" | "next" | "previous" | "pchip" | "cubic" | "v5cubic" | "makima" | "spline"
Details
Метод интерполяции, заданный как один из вариантов в этой таблице.
| Метод | Описание | Непрерывность | Комментарии |
|---|---|---|---|
|
Линейная интерполяция. Интерполированное значение в точке запроса основано на линейной интерполяции значений в соседних точках сетки в каждом соответствующем измерении. Это метод интерполяции по умолчанию. |
|
|
|
Интерполяция по методу ближайшего соседа. Интерполированное значение в точке запроса — это значение в ближайшей точке сетки выборки. |
Прерывистый |
|
|
Интерполяция до следующего соседа. Интерполированное значение в точке запроса — это значение в следующей точке сетки выборки. |
Прерывистый |
|
|
Интерполяция по предыдущему соседу. Интерполированное значение в точке запроса — это значение в предыдущей точке сетки выборки. |
Прерывистый |
|
|
Кусочно-кубическая интерполяция с сохранением формы. Интерполированное значение в точке запроса основано на кусочно-кубической интерполяции значений в соседних точках сетки с сохранением формы. |
|
|
|
Кубическая свертка, используемая в Engee. |
|
|
|
То же, что и |
|
|
|
Модифицированная интерполяция Акимы по кубическим многочленам Эрмита. Интерполированное значение в точке запроса основано на кусочно-линейной функции многочленов степени не выше третьей. Формула Акимы модифицирована для предотвращения выбросов. |
|
|
|
Сплайн-интерполяция с использованием условий «not-a-knot». Интерполированное значение в точке запроса основано на кубической интерполяции значений в соседних точках сетки в каждом соответствующем измерении. |
|
|
#
extrapolation —
стратегия экстраполяции
"extrap" | скаляр
Details
Стратегия экстраполяции, заданная как "extrap" или вещественное скалярное значение.
-
Укажите
"extrap", если хотите, чтобы функцияinterp1вычисляла точки вне области определения тем же методом, что и для интерполяции. -
Укажите скалярное значение, если хотите, чтобы функция
interp1возвращала определенное константное значение для точек вне области определения.
Поведение по умолчанию зависит от входных аргументов:
-
Если указаны методы интерполяции
"pchip","spline"или"makima", то поведение по умолчанию —"extrap". -
Все остальные методы интерполяции по умолчанию возвращают
NaNдля точек запроса вне области определения.
| Типы данных |
|
Выходные аргументы
#
vq —
интерполированные значения
скаляр | вектор | матрица | массив
Details
Интерполированные значения, возвращаемые в виде скаляра, вектора, матрицы или массива. Размер vq зависит от формы v и xq.
Форма v |
Форма xq |
Размер vq |
Пример |
|---|---|---|---|
Вектор |
Вектор |
|
Если |
Вектор |
Матрица или N-мерный массив |
|
Если |
Матрица или N-мерный массив |
Вектор |
|
Если |
Матрица или N-мерный массив |
Матрица или N-мерный массив |
|
Если |
Примеры
Интерполяция грубо дискретизированной синусоидальной функции
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")
Теперь оценим v в тех же точках, используя метод "spline".
vq2 = interp1(x, v, xq, "spline")
plot(xq, vq2, linestyle = :dot)
scatter!(x, v,
markershape = :circle,
xlims = (0, 2π),
title = "Spline Interpolation")
Интерполяция без указания точек
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")
Интерполяция комплексных значений
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)
Экстраполяция двумя разными методами
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))
Кружочки на графике обозначают v, а сплошные линии обозначают vq.
Дополнительно
Акима и сплайн-интерполяция
Details
Алгоритм Акимы для одномерной интерполяции, описанный в [1] и [2], выполняет кубическую интерполяцию для получения кусочных многочленов с непрерывными производными первого порядка ( ). Алгоритм сохраняет наклон и избегает волнистости на плоских участках. Плоский участок возникает, когда имеется три или более последовательных коллинеарных точек, которые алгоритм соединяет прямой линией. Чтобы гарантировать, что область между двумя точками данных является плоской, вставьте между ними дополнительную точку данных.
При пересечении двух плоских областей с разными наклонами модификация исходного алгоритма Акимы придает больший вес стороне, наклон которой ближе к нулю. Эта модификация отдает приоритет стороне, расположенной ближе к горизонтали, что более интуитивно понятно и позволяет избежать перерегулирования. (Исходный алгоритм Акимы придает равные веса точкам с обеих сторон, тем самым равномерно распределяя волнистость.)
Сплайн-алгоритм, с другой стороны, выполняет кубическую интерполяцию для получения кусочных многочленов с непрерывными производными второго порядка ( ). Результат сопоставим с обычной полиномиальной интерполяцией, но менее подвержен сильным колебаниям между точками данных для высоких степеней. Тем не менее этот метод может быть подвержен выбросам и колебаниям между точками данных.
По сравнению со сплайн-алгоритмом, алгоритм Акимы создает меньше волнообразных колебаний и лучше подходит для обработки быстрых изменений между плоскими областями.
Литература
-
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
-
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.