三次样条插值与多项式插值

时间:2018-11-28 10:57:23

标签: matlab interpolation cubic-spline

我被要求研究使用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 :(得分:5)

想将此添加到我赞成的@hazeiio的answer中。您可以看到这很好地说明了他的观点。

插值方法极大地影响了数据点之间获得的值(请参见下图)。您会发现盲目调用插值方法而不检查是否可能出问题是很危险的。

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

参考:
Interpolation (wiki)

答案 1 :(得分:1)

插值可确保在您提供的点上,插值函数的值与原始函数的值相同。查看您的代码,这意味着f(35)将相同,并且每种插值方法均等于31。

但是,根据插值方法的不同,每个连续方法之间的曲线都会变化,因此可以得到不同的值。