makima

Модифицированная кусочно-кубическая эрмитовая интерполяция Акимы

Описание

пример

yq = makima(x,y,xq) Выполняет модифицированную интерполяцию Акима с помощью значений y при точках выборки x для поиска интерполированных значений yq в точках запроса xq.

пример

pp = makima(x,y) возвращает структуру кусочного полинома для использования с ppval и сплайн утилиты unmkpp.

Примеры

свернуть все

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

x = [0 1 2.5 3.6 5 7 8.1 10];
y = cos(x);
xq = 0:.25:10;
yq = makima(x,y,xq);
plot(x,y,'o',xq,yq,'--')

Figure contains an axes. The axes contains 2 objects of type line.

С помощью колебательных функций алгоритм Akima уплощает кривую около локальной экстремы. Чтобы компенсировать это уплощение, можно добавить больше точек выборки около локальной экстремы.

Добавьте точек выборки рядом x=6.5 и x=9 и повторите интерполяцию.

x = [0 1 2.5 3.6 5 6.5 7 8.1 9 10];
y = cos(x);
xq = 0:.25:10;
yq = makima(x,y,xq);
plot(x,y,'o',xq,yq,'--')

Figure contains an axes. The axes contains 2 objects of type line.

Сравните результаты интерполяции, полученные spline, pchip, и makima для двух различных наборов данных. Все эти функции выполняют различные формы кусочно-кубической эрмитовой интерполяции. Каждая функция отличается тем, как она вычисляет склоны интерполяции, приводя к различным поведениям, когда базовые данные имеют плоские области или волнообразные.

Сравните результаты интерполяции по выборочным данным, которые соединяют плоские области. Создайте векторы x значения, значения функций в этих точках y, и точки запроса xq. Вычислите интерполяции в точках запроса с помощью spline, pchip, и makima. Постройте график значений интерполированной функции в точках запроса для сравнения.

x = -3:3; 
y = [-1 -1 -1 0 1 1 1]; 
xq1 = -3:.01:3;
p = pchip(x,y,xq1);
s = spline(x,y,xq1);
m = makima(x,y,xq1);
plot(x,y,'o',xq1,p,'-',xq1,s,'-.',xq1,m,'--')
legend('Sample Points','pchip','spline','makima','Location','SouthEast')

Figure contains an axes. The axes contains 4 objects of type line. These objects represent Sample Points, pchip, spline, makima.

В этом случае pchip и makima имеют аналогичное поведение в том, что они избегают перерегулирования и могут точно соединить плоские области.

Выполните второе сравнение с помощью функции колебательной выборки.

x = 0:15;
y = besselj(1,x);
xq2 = 0:0.01:15;
p = pchip(x,y,xq2);
s = spline(x,y,xq2);
m = makima(x,y,xq2);
plot(x,y,'o',xq2,p,'-',xq2,s,'-.',xq2,m,'--')
legend('Sample Points','pchip','spline','makima')

Figure contains an axes. The axes contains 4 objects of type line. These objects represent Sample Points, pchip, spline, makima.

Когда базовая функция является колебательной, spline и makima захватить движение между точками лучше, чем pchip, который агрессивно уплощен около локальной экстремы.

Создайте векторы для точек выборки x и значения в этих точках y. Использование makima для создания структуры кусочного полинома для данных.

x = -5:5;
y = [1 1 1 0 0 1 1 2 2 2 2];
pp = makima(x,y)
pp = struct with fields:
      form: 'pp'
    breaks: [-5 -4 -3 -2 -1 0 1 2 3 4 5]
     coefs: [10x4 double]
    pieces: 10
     order: 4
       dim: 1

Структура содержит информацию для 10 полиномов порядка 4, которые охватывают данные. pp.coefs(i,:) содержит коэффициенты для полинома, который действителен в области, заданной точками останова [breaks(i) breaks(i+1)].

Используйте структуру с ppval чтобы вычислить интерполяцию в нескольких точках запроса, а затем построить график результатов. В областях с тремя или более постоянными точками алгоритм Акимы соединяет точки с прямой линией.

xq = -5:0.2:5;
m = ppval(pp,xq);
plot(x,y,'o',xq,m,'-.')
ylim([-0.2 2.2])

Figure contains an axes. The axes contains 2 objects of type line.

Входные параметры

свернуть все

Точки выборки, заданные как вектор. Векторная x задает точки, в которых находятся данные y дается. Элементы x должен быть уникальным.

Типы данных: single | double

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

Если y является матрицей или массивом, затем значениями в последней размерности, y(:,...,:,j), приняты как значения, которые совпадают с x. В этом случае последняя размерность y должна быть такой же длины, как и x.

Типы данных: single | double

Точки запроса, заданные как скаляр, вектор, матрица или массив. Точки, указанные в xq являются x -координатами для интерполированных значений функции yq вычисляется makima.

Типы данных: single | double

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

свернуть все

Интерполированные значения в точках запроса, возвращенные в виде скаляра, вектора, матрицы или массива. Размер yq относится к размерам y и xq:

  • Если y является вектором, тогда yq имеет тот же размер, что и xq.

  • Если y - массив размера Ny = size(y), затем применяются следующие условия:

    • Если xq является скаляром или вектором, тогда size(yq) возвращает [Ny(1:end-1) length(xq)].

    • Если xq является массивом, тогда size(yq) возвращает [Ny(1:end-1) size(xq)].

Кусочный полином, возвращается как структура. Используйте эту структуру с ppval функция для вычисления интерполяции полиномов в одной или нескольких точках запроса. Структура имеет эти поля.

ОбластьОписание
form

'pp' для кусочного полинома

breaks

Вектор длины L+1 со строго увеличивающимися элементами, которые представляют начало и конец каждого из L интервалы

coefs

L-by- k матрица с каждой строкой coefs(i,:) содержит локальные коэффициенты порядка k полином на ith интервал , [breaks(i),breaks(i+1)]

pieces

Количество штук, L

order

Порядок полиномов

dim

Размерность цели

Потому что полиномиальные коэффициенты в coefs являются локальными коэффициентами для каждого интервала, необходимо вычесть нижнюю конечную точку соответствующего узлового интервала, чтобы использовать коэффициенты в обычном полиномиальном уравнении. Другими словами, для коэффициентов [a,b,c,d] по интервалу [x1,x2], соответствующий полином является

f(x)=a(xx1)3+b(xx1)2+c(xx1)+d.

Подробнее о

свернуть все

Измененная интерполяция Акима

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

Если δi=vi+1vixi+1xi - наклон по интервалу [xixi+1), затем значение производной di в точке выборки xi - взвешенное среднее значение ближайших склонов:

di=w1w1+w2δi1+w2w1+w2δi.

В исходной формуле Акимы веса:

w1=|δi+1δi|,w2=|δi1δi2|.

Исходный алгоритм Akima дает равный вес точкам с обеих сторон, равномерно разделяя волнообразие.

Когда две плоские области с различными склонами встречаются, изменение, сделанное в исходном алгоритме Akima, дает больше веса стороне, где уклон ближе к нулю. Эта модификация отдает приоритет стороне, которая ближе к горизонтали, что более интуитивно понятно и избегает перерегулирования. В частности, всякий раз, когда существует три или более последовательных коллинеарных точек, алгоритм соединяет их с помощью прямой линии и, таким образом, избегает перерегулирования.

Веса, используемые в модифицированном алгоритме Akima:

w1=|δi+1δi|+|δi+1+δi|2,w2=|δi1δi2|+|δi1+δi2|2.

По сравнению с spline алгоритм Akima производит меньше волн и лучше подходит для борьбы с быстрыми изменениями между плоскими областями. По сравнению с pchip алгоритм Akima не так агрессивно уплощен и поэтому все еще способен иметь дело с колебательными данными.

Ссылки

[1] Акима, Хироси. «Новый метод интерполяции и сглаживания аппроксимирования кривыми на основе локальных процедур». Журнал ACM (JACM), 17.4, 1970, стр. 589-602.

[2] Акима, Хироси. Метод двухмерной интерполяции и сглаживания поверхностных подборов кривой, основанный на локальных процедурах. Сообщения АКМ, 17.1, 1974, стр. 18-20.

Введенный в R2019b