一、一维插值
1.定义
插值:已知f(x)的N个数据点,f(x)不知道。根据N个数据点估计任意点的函数值f(x)。
2. interp1函数
调用格式: yi = interp1(x,y,xi,method) 其中x,y为已知的数据点,通常xi为比x更加密集的数据点,xi可以为标量、向量及数组。yi是数据点xi上的估计值;method是字符串变量,表示不同的插值方法,有下面四种可选:
method = 'nearest',最近邻插值法,插值点函数估计值为与该插值点最近的数据点函数值。例如xi(l)与x(n)最近,则xi(l)处的函数值估计yi(l)为y(n).
method = 'linear',线性插值法,根据相邻近数据点的线性函数估计落在该区域内插值数据点的函数值。例如,xi(l)在[x(n-1),x(n)],则xi(l)处的函数值估计yi(l)由(x(n-1), y(n-1))、(x(n), y(n))确定的线性函数得到。线性插值是interp1的默认选项。
method = 'spline',三次样条插值,这种方法在相邻数据点间建立三次多项式函数,根据该多项式函数确定插值数据点的函数值。例如,xi(l)属于[x(n-1),x(n)],则xi(l)处的函数值估计yi(l)由(x(n-1), y(n-1))、(x(n), y(n))确定的三次多项式得到。
method = ‘pchip’或'cubic',这两种方向是相同的,利用pchip函数分段的进行三次Hermite插值。例如,xi(l)属于[x(n-1),x(n)],则xi(l)处的函数值估计yi(l)由(x(n-1), y(n-1))、(x(n), y(n))确定的三次Hermite函数得到。
上面文字解释可能不清晰,下面让我来看看实例吧!
例子:f(x) = x^2 + 1 (x属于[0, 1]),现在f(x)未知,但是已知f(x)的6个采样点如下:(0,1), (0.2,1.04), (0.4, 1.16), (0.6,1.36), (0.8,1.64), (1,2)
x = 0:0.2:1;
y = x.^3 + 1;
plot(x,y) % 真是曲线
hold on
xi = 0:0.05:1;
yi = interp1(x,y,xi,'linear');
plot(xi,yi,'r*') %为插值数据点
hold on
yi1 = interp1(x,y,xi,'nearest');
plot(xi,yi1,'g-') %为插值数据点 可以看到邻近插值与真值差距很大
hold on
yi = interp1(x,y,xi,'spline');
stem(xi,yi) %为插值数据点 样条效果也很好
注意:x,y的长度要相同。
二、二维插值
ZI = interp2(X,Y,Z,XI,YI,method)
二维插值跟以为插值大致相同,只是多了Z参数而已,method参照上面是一样的。
例子;
x= -3:1:3;
y = x;
[X,Y] = meshgrid(x,y);
Z = peaks(X,Y);
mesh(X,Y,Z)
figure;
xi = linspace(-3,3,100);
yi = xi;
[XI,YI] = meshgrid(xi,yi);
ZI = interp2(X,Y,Z,XI,YI,'cubic');
mesh(XI,YI,ZI)