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,'--')

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

Добавьте точки выборки рядом 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,'--')

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

Сравните результаты интерполяции на выборочных данных, которые соединяют плоские области. Создайте векторы x значения, значения функции в тех точках y, и точки запроса xq. Вычислите интерполяции в точках запроса с помощью splinepchip, и 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')

В этом случае, 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')

Когда базовая функция является колебательной, 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])

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

свернуть все

Точки выборки в виде вектора. Векторный 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 со строго увеличивающимися элементами, которые представляют начало и конец каждого of L интервалы

coefs

L- k матрица с каждой строкой coefs(i,:) содержа локальные коэффициенты порядка k полином на iинтервал th, [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|.

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

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

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

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

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

Ссылки

[1] Акима, Хироши. "Новый метод интерполяции и плавной кривой, соответствующей на основе локальных процедур". Журнал ACM (JACM), 17.4, 1970, стр 589–602.

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

Введенный в R2019b