exponenta event banner

makima

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

Описание

пример

yq = makima(x,y,xq) выполняет интерполяцию Modified Akima с использованием значений 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.

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

Добавьте точки выборки около 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около-k матрица с каждой строкой coefs(i,:) содержащий локальные коэффициенты порядка k многочлен на iтый интервал, [breaks(i),breaks(i+1)]

pieces

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

order

Порядок многочленов

dim

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

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

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

Подробнее

свернуть все

Модифицированная интерполяция Акимы

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

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

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

В первоначальной формуле Акимы весами являются:

w1 = | δi + 1 δi |, w2 = | δi − 1 − δi − 2 |.

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

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

В модифицированном алгоритме Акимы используются следующие веса:

w1 = | δi + 1 δi | + | δi + 1 + δi | 2, w2 = | δi − 1 − δi − 2 | + | δi − 1 + δi − 2 | 2.

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

Ссылки

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

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

Представлен в R2019b