1. 程式人生 > >一維插值(interp1)和二維插值(interp2)

一維插值(interp1)和二維插值(interp2)

一、一維插值

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)