pchip
Кусочно-кубический интерполяционный многочлен Эрмита (Piecewise Cubic Hermite Interpolating Polynomial, PCHIP).
| Библиотека |
|
Аргументы
Входные аргументы
#
y —
значения функции в точках выборки
вектор | матрица | массив
Details
Значения функции в точках выборки, заданные как числовой вектор, матрица или массив. Аргументы x и y должны иметь одинаковую длину.
Если y — матрица или массив, то значения в последнем измерении, y[:,…,:,j] берутся в качестве значений для сопоставления с x. В этом случае последнее измерение y должно иметь ту же длину, что и x.
| Типы данных |
|
#
xq —
точки запроса
скаляр | вектор | матрица | массив
Details
Точки запроса, заданные как скаляр, вектор, матрица или массив. Точки, заданные в аргументе xq, представляют собой -координаты интерполированных значений функции yq, вычисляемых с помощью функции pchip.
| Типы данных |
|
Примеры
Интерполяция данных с помощью spline и pchip
Details
Сравним результаты интерполяции, полученные с помощью функций spline и pchip для двух разных наборов данных. Все эти функции реализуют различные формы кусочно-кубической интерполяции Эрмита. Каждая функция отличается способом вычисления наклонов интерполянта, что приводит к различному поведению в зависимости от того, есть ли в исходных данных плоские области или неровности.
Сравним результаты интерполяции на выборочных данных, соединяющих плоские области. Создадим векторы значений x, значений функций в этих точках y и точек запроса xq. Вычислим интерполяции в точках запроса, используя функции spline и pchip. Построим график интерполированных значений функций в точках запроса для сравнения.
import EngeeDSP.Functions: pchip, spline
x = -3:3
y = [-1, -1, -1, 0, 1, 1, 1]
xq1 = -3:0.01:3
p = pchip(x, y, xq1)
s = spline(x, y, xq1)
plot(x, y,
seriestype = :scatter,
markercolor = :white,
label = "Sample Points",
legend = :bottomright)
plot!(xq1, p, label = "pchip")
plot!(xq1, s, linestyle = :dashdot, label = "spline")
В данном случае функция pchip избегает выбросы и может точно соединять плоские области.
Выполним второе сравнение, используя функцию колебаний выборки.
import EngeeDSP.Functions: pchip, spline, besselj
x = 0:15
y = besselj.(1, x)
xq2 = 0:0.01:15
p = pchip(x, y, xq2)
s = spline(x, y, xq2)
plot(x, y,
seriestype = :scatter,
markercolor = :white,
label = "Sample Points")
plot!(xq2, p, label = "pchip")
plot!(xq2, s, linestyle = :dashdot, label = "spline")
Если базовая функция является колебательной, spline лучше улавливает движение между точками, чем pchip, которая сильно сглаживается вблизи локальных экстремумов.
Дополнительно
Сохраняющая форму кусочно-кубическая интерполяция
Details
Функция pchip интерполирует с использованием кусочно-кубического полинома с приведенными ниже свойствами.
-
На каждом подынтервале многочлен является кубическим интерполяционным многочленом Эрмита для заданных точек данных с заданными производными (наклонами) в точках интерполяции.
-
интерполирует , то есть , и первая производная непрерывна. Вторая производная , вероятно, не непрерывна, поэтому возможны скачки в точке .
-
Кубический интерполянт сохраняет форму. Наклоны в точке выбираются таким образом, чтобы сохранял форму данных и монотонность. Следовательно, на интервалах, где данные монотонны, также монотонен, и в точках, где данные имеют локальный экстремум, также монотонен.
| Если — матрица, удовлетворяет этим свойствам для каждой строки . |
Советы
Функция spline строит почти так же, как функция pchip строит . Однако spline выбирает наклоны в точке по-другому, а именно, чтобы сделать непрерывным. Это различие имеет несколько эффектов:
-
splineпозволяет получить более плавный результат, то есть непрерывен. -
splineдает более точный результат, если данные состоят из значений гладкой функции. -
pchipне имеет выбросов и меньших колебаний, если данные не гладкие. -
pchipменее затратна в настройке. -
Оценка обоих вариантов одинаково затратна.