Кубическая сплайн-интерполяция против полиномиальной интерполяции - PullRequest
0 голосов
/ 28 ноября 2018

Меня просят исследовать различные типы интерполяции с использованием 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) независимо от того, какой тип интерполяции я использую?

Ответы [ 2 ]

0 голосов
/ 28 ноября 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')

Interpolation Visualization


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

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])

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

0 голосов
/ 28 ноября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...