11/28/2006

11.9 外插法

如果要查的資料超高範圍會如何?以前項之身高體重為例:

XI=interp1(M_wt,height,80)
XI =
NaN

顯然沒有資料,因為它已超出範圍。此時若要有資料可以採用外插法,即在後面之參數加上'extrap',並且要表示外插法所使用之方法,例如'linear'是。
XI=interp1(M_wt,height,80,'linear','extrap')
XI =
191.2500

只是一個體重80kg的人,他的標準身高 191.2cm是否合理,那就不是外插法所能管得了的了。

內插法亦可應用於多維資料中。例如:
x = [1:10]'; y = [ x.^2, x.^3, x.^4 ];
xi = [ 1.5, 2.5; 5.5, 8.5], yi = interp1(x,y,xi)

xi =
1.5000    2.5000
5.5000    8.5000
yi(:,:,1) =
2.5000    6.5000
30.5000   72.5000
yi(:,:,2) =
4.5000   17.5000
170.5000  620.5000
yi(:,:,3) =
1.0e+003 *
0.0085    0.0485
0.9605    5.3285

由於輸入值為2x2之向量,所得之yi具有三個函數,故會產生大小為2x2x3之對應值。

INTERP2 指令


處理函數如z=f(x,y)這種二維的內插問題時,可以使用interp2指令。其呼叫型式如下:
ZI = INTERP2(X,Y,Z,XI,YI)

指令中,X,Y,Z為對應值,其中X,Y為自變數,Z為對應函數值。進行內插時,必須設定XI,YI值,其後結果ZI置於等號之左邊。在輸入參數後邊,亦可加入前述之'method'項,以獲得不同的內插效果。其預設項仍為'linear',即線性內插。下面的例子為先設定XY方向之方格,建立Z函數;然後以較細的內插點繪出對應點,將其Z座標提高15個單位,以與原函數比較。
[X,Y] = meshgrid(-3:.5:3);
Z = peaks(X,Y);
[XI,YI] = meshgrid(-3:.25:3);
ZI = interp2(X,Y,Z,XI,YI,'spline');
mesh(X,Y,Z), hold, mesh(XI,YI,ZI+15)
hold off
axis([-3 3 -3 3 -5 20])



在interp2指令之參數中,若Z前面之X、Y兩項省略,如:
ZI = INTERP2(Z,XI,YI)

則表示內部預設 X=1:N,Y=1:M,其中 [M,N]=SIZE(Z)。如此可以省掉一些裝飾的工夫。interp2也可以使用外插法,其設定方式與interp1相同。所有XY之對應必須單一的,其間隔可以不是均勻分割的。
[x,y]=meshgrid(-5:5,-5:.5:5);
z=x.^2+y.^2;
[xi,yi] = meshgrid(-3:.2:3,-3:.2:3);
zi = interp2(x,y,z,xi,yi);
mesh(xi,yi,zi+50);hold on;
mesh(x,y,z);hold off