Кубическая сплайн-интерполяция против полиномиальной интерполяции

Меня просят исследовать различные типы интерполяции с помощью Matlab для следующих точек:

x = [32 34 35 36 37 38]
y = [26 28 31 30 29 25]

и найдите значения для f(33), f(33.5) и f(35).

При нанесении на график x и y я вижу, что f(33) должно быть около 27, что я также получаю при использовании interp1(x,y,33).

Я не уверен, что это правильный способ использования функции интерполяции кубическим сплайном, но я использовал spline(x,y,33) и получил ans = 24.3906.

Разве я не должен получить то же значение для f(33) независимо от того, какой тип интерполяции я использую?


person P.ython    schedule 28.11.2018    source источник
comment
Если вы используете другой метод интерполяции, это нормально, что вы потенциально можете получить другой результат, нет?   -  person obchardon    schedule 28.11.2018


Ответы (2)


Интерполяция гарантирует, что значения интерполированной функции совпадают со значениями исходной функции в указанных вами точках. Если посмотреть на ваш код, это означает, что f(35) будет таким же и будет равно 31 для каждого метода интерполяции.

Однако, в зависимости от метода интерполяции, кривая между каждым из последовательных методов будет варьироваться, следовательно, вы получите разные ожидаемые значения.

person hazeiio    schedule 28.11.2018

Хотел добавить это в ответ @ hazeiio, за который я проголосовал. Как видите, это хорошо иллюстрирует суть дела.

Метод интерполяции сильно влияет на значения, полученные между точками данных (см. Изображение ниже). Вы увидите, что слепо вызывать метод интерполяции, не проверяя, что может пойти не так, может быть опасно.

% MATLAB R2017a
x = [32 34 35 36 37 38];
y = [26 28 31 30 29 25];  

xTgts = [33 33.5 35 37.25 37.5 37.75];

% Interpolation between data points depends on method
Linear = interp1(x,y,xTgts)
Spline = interp1(x,y,xTgts,'spline')    % Equivalent to spline(x,y,xTgts) yet faster somehow
Cubic = interp1(x,y,xTgts,'pchip')

Как уже отмечалось, все они будут точно соответствовать данным (см. Изображение ниже).

% Interpolation of data points will match
Linear = interp1(x,y,x)
Spline = interp1(x,y,x,'spline')    
Cubic = interp1(x,y,x,'pchip')

Визуализация интерполяции


Код для иллюстрации

step = 0.01;
xTest = (32:step:38)';

figure, hold on, box on
p(1) = plot(x,y,'ks','DisplayName','Data')
p(2) = plot(xTest,interp1(x,y,xTest),'b-','DisplayName','Linear')
p(3) = plot(xTest,interp1(x,y,xTest,'spline'),'r-','DisplayName','Spline')
p(4) = plot(xTest,interp1(x,y,xTest,'pchip'),'g-','DisplayName','Cubic')
legend('show')

% Options
xlabel('X')
ylabel('Y')
title('Interpolation Example')
for k = 1:4, p(k).LineWidth = 2; end
axis equal
xlim([31 39])
ylim([24 32])

Ссылка:
Интерполяция (вики)
Методы интерполяции

Опасности интерполяции
Интерполяция более высокого порядка - плохая идея

person SecretAgentMan    schedule 28.11.2018
comment
Отлично! Это именно то, чего не хватает другому ответу: объяснение того, почему интерполированное значение так сильно отличается. Вы знаете, какие граничные условия используются spline? Судя по вашему графику, похоже, что градиент в левой и правой точках устанавливается на одно и то же значение. - person Cris Luengo; 28.11.2018
comment
@CrisLuengo, отличный вопрос по spline. Я не знаю, и мне пришлось бы углубиться в документацию или посмотреть выходные аргументы, чтобы увидеть. Постараюсь сделать, если найду время. - person SecretAgentMan; 28.11.2018
comment
Не-а, ради меня не копайся в документации, я попросил, потому что мне лень самому разбираться. :п - person Cris Luengo; 28.11.2018
comment
@CrisLuengo Кубическая сплайн-интерполяция использует полином третьей степени с граничными условиями для первой и второй производной для каждой заданной точки. Он составляет до 4n+2 уравнений, поэтому для первой и последней точек устанавливаются дополнительные граничные условия, так что вторая производная в них равна 0. - person hazeiio; 29.11.2018
comment
@hazeiio: Хорошо, ты заставляешь меня поискать это, потому что твое утверждение не соответствует тому, что я вижу в сюжете. Оказывается, что MATLAB использует конечное условие «не узел», что, согласно Википедии, означает, что последние два уравнения определяют 3-ю производную на последних узлах как равную. То есть он не определяет никаких свойств для производных в конечных точках, вместо этого он добавляет производную к двум точкам дальше. - person Cris Luengo; 29.11.2018
comment
Я также полагал, что вы можете указать условия конечной точки в виде производной двух конечных точек, добавив два значения к параметру y. - person Cris Luengo; 29.11.2018
comment
@CrisLuengo Вы действительно правы. По какой-то причине я всегда думал, что MATLAB использует естественный сплайн, а не узловой. - person hazeiio; 29.11.2018