Предположим, что требуется интерполяция некоторых гладких данных, например, для
rng(6), x = (4*pi)*[0 1 rand(1,15)]; y = sin(x);
Можно использовать интерполятор кубического сплайна, полученный
cs = csapi(x,y);
и постройте график сплайна вместе с данными со следующим кодом:
fnplt(cs);
hold on
plot(x,y,'o')
legend('cubic spline','data')
hold off
В результате получается цифра, подобная следующей.
Интерполяция кубических сплайнов данных сглаживания

Это, точнее, кубический сплайн-интерполятор с не-а-узел концевыми условиями, что означает, что это уникальный кусочно-кубический многочлен с двумя непрерывными производными с разрывами на всех внутренних участках данных, кроме крайнего левого и крайнего правого. Это тот же интерполятор, что и в MATLAB ®spline команда, spline(x,y).
Синусоидальная функция является 2δ-периодической. Чтобы проверить, насколько хорошо ваш интерполятор работает с этой оценкой, вычислите, например, разницу в значении его первой производной в двух конечных точках,
diff(fnval(fnder(cs),[0 4*pi])) ans = -.0100
что не так хорошо. Если вы предпочитаете получить интерполятор, первая и вторая производные которого находятся в двух конечных точках, 0 и 4*pi, сопоставить, использовать вместо команды csape что позволяет определять множество различных типов конечных условий, включая периодические конечные условия. Итак, используйте вместо
pcs = csape(x,y,'periodic');
за что и получаешь
diff(fnval(fnder(pcs),[0 4*pi]))
Вывод: ans = 0 как разность конечных откосов. Даже разница в конечных вторых производных невелика:
diff(fnval(fnder(pcs,2),[0 4*pi]))
Вывод: ans = -4.6074e-015.
Также могут быть обработаны и другие конечные условия. Например,
cs = csape(x,[3,y,-4],[1 2]);
обеспечивает интерполяцию кубического сплайна с разрывами на
и с наклоном на крайнем левом участке данных, равным 3, и его второй производной на крайнем правом участке данных, равным -4.
Если требуется интерполяция на площадках, отличных от разрывов и/или сплайнов, отличных от кубических сплайнов, с помощью простых узлов, то используется spapi команда. В самом простом виде, вы бы сказали sp = spapi(k,x,y); в котором первый аргумент, k, задает порядок интерполяции сплайна; это число коэффициентов в каждой части многочлена, т.е. на 1 больше номинальной степени ее частей многочлена. Например, на следующем рисунке показан линейный, квадратичный и квадратичный сплайн, интерполированный с данными, полученными с помощью операторов
sp2 = spapi(2,x,y); fnplt(sp2,2), hold on
sp3 = spapi(3,x,y); fnplt(sp3,2,'k--'),
sp5 = spapi(5,x,y); fnplt(sp5,2,'r-.'), plot(x,y,'o')
legend('linear','quadratic','quartic','data'), hold off
Сплайн-интерполяторы различных порядков сглаженных данных

Даже кубический сплайновый интерполятор, полученный из spapi отличается от той, которая предоставляется csapi и spline. Чтобы подчеркнуть их разницу, вычислите и постройте график их вторых производных следующим образом:
fnplt(fnder(spapi(4,x,y),2)), hold on,
fnplt(fnder(csapi(x,y),2),2,'k--'),plot(x,zeros(size(x)),'o')
legend('from spapi','from csapi','data sites'), hold off
Это дает следующий график:
Вторая производная двух кубических сплайновых интерполяторов одинаковых гладких данных

Так как вторая производная кубического сплайна является пунктирной линией, с вершинами в разрывах сплайна можно ясно видеть, что csapi места разрывы на сайтах данных, в то время как spapi не делает.
Фактически, можно явно указать, где должен быть разрыв сплайнового интерполятора, с помощью команды sp = spapi(knots,x,y); в которой последовательность knots поставляет определенным образом используемые разрывы. Например, вспоминая, что вы выбрали y быть sin(x), команда
ch = spapi(augknt(x,4,2),[x x],[y cos(x)]);
обеспечивает кубический интерполятор Эрмита для синусоидальной функции, а именно кусочно-кубической функции, с разрывами на всех x(i)'s, что соответствует синусоидальной функции по значению и наклону на всех x(i)Это делает интерполятор непрерывным с непрерывной первой производной, но, в общем, он имеет прыжки через разрывы в своей второй производной. Как эта команда может узнать, какая часть массива значений данных [y cos(x)] предоставляет значения и какие уклоны? Обратите внимание, что массив сайта данных здесь указан как [x x], т.е. каждый узел данных появляется дважды. Также обратите внимание, что y(i) связано с первым вхождением x(i), и cos(x(i)) связано со вторым вхождением x(i). Значение данных, связанное с первым появлением узла данных, принимают за значение функции; значение данных, связанное со вторым внешним видом, принимается за наклон. Если бы был третий вид этого сайта данных, соответствующее значение данных принималось бы в качестве второго значения производной, которое должно совпадать на этом сайте. Описание команды см. в разделе Построение и работа со сплайнами B-формы augknt используется здесь для генерации соответствующей «узловой последовательности».
Что если данные шумят? Например, предположим, что заданные значения
noisy = y + .3*(rand(size(x))-.5);
Тогда вы можете предпочесть аппроксимацию. Например, можно попробовать кубический сглаживающий сплайн, полученный командой
scs = csaps(x,noisy);
и нанесено на график
fnplt(scs,2), hold on, plot(x,noisy,'o'),
legend('smoothing spline','noisy data'), hold off
Это приводит к такой цифре:
Кубический сглаживающий сплайн шумных данных

Если вам не нравится уровень сглаживания, сделанный csaps(x,y), вы можете изменить его, указав параметр сглаживания, p, в качестве необязательного третьего аргумента. Выберите это число в диапазоне от 0 до 1. Как p изменяется от 0 до 1, сглаживающий сплайн изменяется, соответственно, от одной крайности, аппроксимации прямой линии наименьших квадратов к данным, до другой крайности, «естественного» кубического сплайна, интерполированного к данным. С тех пор csaps возвращает параметр сглаживания, фактически используемый в качестве дополнительного второго вывода, теперь можно поэкспериментировать следующим образом:
[scs,p] = csaps(x,noisy); fnplt(scs,2), hold on
fnplt(csaps(x,noisy,p/2),2,'k--'),
fnplt(csaps(x,noisy,(1+p)/2),2,'r:'), plot(x,noisy,'o')
legend('smoothing spline','more smoothed','less smoothed',...
'noisy data'), hold off
В результате получается следующее изображение.
Шумные данные более или менее сглажены

Иногда можно просто получить самый гладкий кубический сплайн. sp который находится в пределах заданного допуска tol данных в том смысле, что norm(noisy - fnval(sp,x))^2 <= tol. Этот сплайн создается с помощью команды sp = spaps(x,noisy,tol) для определенного допуска tol.
Если вы предпочитаете аппроксиматор наименьших квадратов, вы можете получить его с помощью оператора sp = spap2(knots,k,x,y); в котором обе последовательности узлов knots и заказ k сплайна.
Популярный выбор для порядка 4, и это дает вам кубический сплайн. Если у вас нет четкого представления о том, как выбрать узлы, просто укажите количество полиномиальных частей, которые вы хотите использовать. Например,
sp = spap2(3,4,x,y);
дает кубический сплайн, состоящий из трех отрезков полинома. Если результирующая ошибка неравномерна, вы можете попытаться улучшить распределение узлов, используя newknt следующим образом:
sp = spap2(newknt(sp),4,x,y);