Следующие функции по узлам х и значениям в узлах у находят кусочно-полиномиальный интерполянт и возвращают его значения в точках хх:
· interp1(x,y,xx, 'nearest') использует ступенчатую интерполяцию.
· interp1 (x,y,xx) или interp1 (x,y,хх,'linear') строит кусочно-линейный интерполянт,
· spline(x,y,xx) или interp1 (x,y,xx, 'spline') находит кубический сплайн,
· pchip(x,y,xx) или interp1 (x,y,xx,'pchip') или interp1 (x,y,xx,'cubic') ищет эрмитов кубический интерполянт.
При равномерной сетке х можно использовать более быстрые методы “со звездочкой”: nearest*, linear*, spline*, pchip* - например:
interp1(x,y,xx,'spline*')
Кроме этого, функции pp=spline(x,y) pp=pchip(x,y) возвращают pp-представление для сплайн-интерполянта и эрмитова кубического интерполянта соответственно.
Пример. Построим интерполянты функции Рунге по 9 точкам и вычислим абсолютные ошибки интерполяции:
x=-1:0.25:1;
y=1./(1+25*x.^2);
xx=-1:.01:1;
yy=1./(1+25*xx.^2);
yn=interp1(x,y,xx,'nearest');
yl=interp1(x,y,xx,'linear');
yc=interp1(x,y,xx,'cubic');
ys=interp1(x,y,xx,'spline');
plot(x,y,'o', xx,yy, xx,yn, xx,yl, xx,yc, xx,ys)
Legend('data',...
'function',...
'nearest' ,...
'linear',...
'cubic',...
'spline', 2);
Max(abs(yn-yy))
Max(abs(yl-yy))
Max(abs(yc-yy))
Max(abs(ys-yy))
Мы видим, что минимальную ошибку (0.02) дал кубический интерполянт, на втором месте -- сплайн (0.06), далее— линейный интерполянт (0.064) и на последнем месте -- ступенчатый интерполянт (0.31).
В следующих разделах рассмотрим несколько подробнее эти способы интерполяции.
Эрмитов кубический интерполянт
Предположим, что в точках известны не только значения функции
, но и их производные d 1, d 2...., d n. Заменяя функцию g(х) на каждом из отрезков [xi xi+1] кубическим многочленом ci(x), таким, что
мы получим эрмитов кубический интерполянт
.
Очевидно, что эрмитов кубический интерполянт имеет непрерывную производную. Из дальнейшего будет следовать, что по значениям функции и ее первой производной в узлах, кубический интерполянт определяется единственным образом. Если g (x) имеет непрерывную четвертую производную, то погрешность интерполяции можно оценить как
где h-- максимальное расстояние между смежными узлами. Кроме того, можно показать, что
Для вывода расчетных формул рассмотрим отрезок [0,1] и условия
Легко проверить, что единственным многочленом степени не выше 3, удовлетворяющим этим условиям, является многочлен
,
где
Чтобы перейти к произвольному отрезку [ a, b ] достаточно рассмотреть р(а+(b-а)х).
Функция, которая находит рр-представление для кубического эрмитова интерполянта, может выглядеть следующим образом:
function p=cubic1(x,y,d);
n=length(x);
a=zeros(n-1,4);
for i=1:n-1
a(i,1)=2*y(i)-2*y(i+1)+d(i)+d(i+1);
a(i,2)=-3*y(i)+3*y(i+1)-2*d(i)-d(i+1);
a(i,3)=d(i);
a(i,4)=y(i);
a(i,1)=a(i,1)/(x(i+1)-x(i))^3;
a(i,2)=a(i,2)/(x(i+1)-x(i))^2;
a(i,3)=a(i,3)/(x(i+1)-x(i));
end;
p=mkpp(x,a);
Приведем пример использования этой функции:
x= [0 1 2 3 4 5];
y= [0 1 1 2 3 3];
d0= [0 0 0 0 0 0];
d1=[1 1 1 1 1 1];
p0=cubic1(x,y,d0);
p1=cubic1(x,y,d1);
xx=0:.05:5;
yy0=ppval(p0,xx);
yy1=ppval(p1,xx);
plot(x,y,'o',xx,yy0,xx,yy1);
Grid
Если значения производных в узлах не известны, то можно попробовать заменить их приближениями. Сложный алгоритм выбора d, реализован в стандартной функции pchip. Если х, у — абсциссы и ординаты узлов интерполяции, то команда yyp=pchip(x,y,хх) строит кубический интерполянт и возвращает его значения уур в точках хх. Построенный интерполянт обладает следующими особенностями:
· если на некотором отрезке данные монотонны, то монотонным будет сам интерполянт,
· если в некоторой точке данные имеют локальный экстремум, то локальный экстремум в той же точке будет и у интерполянта,
Проверим это
x =0:8;
y = [0 1 1 2 3 4 3 2 1];
xx=0:.05:8;
yyp=pchip(x,y,xx);
plot(x,y, 'o',xx,yyp);
Сплайны
Не всегда кубический эрмитов интерполянт может нас удовлетворить: в общем случае его вторая производная разрывна и, следовательно, график не достаточно гладок. Пусть, как и раньше, функция g (x) в точках
принимает значения
соответственно. На каждом из отрезков [xi xi+1]заменим g (x) кубической функцией ci(x),такой, что
. Кусочно-кубическая функция
называется кубическим сплайном (или, просто, сплайном), если она везде имеет непрерывную вторую производную. Для того, чтобы сплайн определялся единственным образом, зададим также значения первой производной в концах рассматриваемого интервала. Сплайн, определяемый условиями
называется естественным.
Если g(х) имеет непрерывную четвертую производную, то погрешность интерполяции можно оценить как
где h - максимальное расстояние между смежными узлами.
Функция yyp=spline(x,y,xx) по значениям у в узлах х строит естественный сплайн и возвращает его значения уур в точках хх. Эта функция выбирает такие значения первой производной в концевых точках, чтобы третья производная в узлах х 1 и хn -1 была непрерывна.
Несмотря на то, что графики сплайнов более гладкие нежели графики кубических интерполянтов, не всегда использование сплайнов дает удовлетворительные результаты.
Пример. Рассмотрим, например, случай, когда данные описывают некоторый естественный монотонный процесс:
x= [0 1 2 3 4 5];
y= [0 1 1 2 3 3];
xx=0:.05:5;
yyp=pchip(x,y,xx);
yys=spline(x,y,xx);
plot(x,y,'o',xx,yyp,xx,yys);
Сплайн оказался немонотонным, кубический интерполянт, который нашла функция pchip, - монотонным.