MATLAB插值函數

注:該文從鏈接地址http://blog.sciencenet.cn/blog-457143-679275.html轉載。

 

MATLAB中的插值函數爲interp1,其調用格式爲:  yi= interp1(x,y,xi,'method')           

其中x,y爲插值點,yi爲在被插值點xi處的插值結果;x,y爲向量, 'method'表示採用的插值方法,MATLAB提供的插值方法有幾種: 'method'是最鄰近插值, 'linear'線性插值; 'spline'三次樣條插值; 'cubic'立方插值.缺省時表示線性插值

    注意:所有的插值方法都要求x是單調的,並且xi不能夠超過x的範圍。

例如:在一 天24小時內,從零點開始每間隔2小時測得的環境溫度數據分別爲

            12,9,9,10,18 ,24,28,27,25,20,18,15,13,

推測中午12點(即13點)時的溫度.

x=0:2:24;
       y=[12   9   9   10   18  24   28   27   25   20  18  15  13];

a=13;
      y1=interp1(x,y,a,'spline')

結果爲:  27.8725

若要得到一天24小時的溫度曲線,則:

xi=0:1/3600:24;

yi=interp1(x,y,xi, 'spline');

plot(x,y,'o' ,xi,yi)

命令1 interp1
功能 一維數據插值(表格查找)。該命令對數據點之間計算內插值。它找出一元函數f(x)在中間點的數值。其中函數f(x)由所給數據決定。
x:原始數據點
Y:原始數據點
xi:插值點
Yi:插值點
格式
(1)yi = interp1(x,Y,xi) 
返回插值向量yi,每一元素對應於參量xi,同時由向量x 與Y 的內插值決定。參量x 指定數據Y 的點。
若Y 爲一矩陣,則按Y 的每列計算。yi 是階數爲length(xi)*size(Y,2)的輸出矩陣。
(2)yi = interp1(Y,xi) 
假定x=1:N,其中N 爲向量Y 的長度,或者爲矩陣Y 的行數。
(3)yi = interp1(x,Y,xi,method) 
用指定的算法計算插值:
’nearest’:最近鄰點插值,直接完成計算;
’linear’:線性插值(缺省方式),直接完成計算;
’spline’:三次樣條函數插值。對於該方法,命令interp1 調用函數spline、ppval、mkpp、umkpp。這些命令生成一系列用於分段多項式操作的函數。命令spline 用它們執行三次樣條函數插值;
’pchip’:分段三次Hermite 插值。對於該方法,命令interp1 調用函數pchip,用於對向量x 與y 執行分段三次內插值。該方法保留單調性與數據的外形;
’cubic’:與’pchip’操作相同;
’v5cubic’:在MATLAB 5.0 中的三次插值。
對於超出x 範圍的xi 的分量,使用方法’nearest’、’linear’、’v5cubic’的插值算法,相應地將返回NaN。對其他的方法,interp1 將對超出的分量執行外插值算法。
(4)yi = interp1(x,Y,xi,method,'extrap') 
對於超出x 範圍的xi 中的分量將執行特殊的外插值法extrap。
(5)yi = interp1(x,Y,xi,method,extrapval) 
確定超出x 範圍的xi 中的分量的外插值extrapval,其值通常取NaN 或0。
例1 
  1.  

  2. >>x = 0:10; y = x.*sin(x);

  3. >>xx = 0:.25:10; yy = interp1(x,y,xx);

  4. >>plot(x,y,'kd',xx,yy)

複製代碼
例2 
  1.  

  2. >> year = 1900:10:2010;

  3. >> product = [75.995 91.972 105.711 123.203 131.669 150.697 179.323 203.212 226.505

  4. 249.633 256.344 267.893 ];

  5. >>p1995 = interp1(year,product,1995)

  6. >>x = 1900:1:2010;

  7. >>y = interp1(year,product,x,'pchip');

  8. >>plot(year,product,'o',x,y)

複製代碼
插值結果爲: 
  1.  

  2. p1995 =

  3. 252.9885

複製代碼
命令2 interp2
功能 二維數據內插值(表格查找)
格式 
(1)ZI = interp2(X,Y,Z,XI,YI) 
返回矩陣ZI,其元素包含對應於參量XI 與YI(可以是向量、或同型矩陣) 的元素, 即Zi(i,j) ←[Xi(i,j),yi(i,j)]。用戶可以輸入行向量和列向量Xi 與Yi,此時,輸出向量Zi 與矩陣meshgrid(xi,yi)是同型的。同時取決於由輸入矩陣X、Y 與Z 確定的二維函數Z=f(X,Y)。參量X 與Y 必須是單調的,且相同的劃分格式,就像由命令meshgrid 生成的一樣。若Xi與Yi 中有在X 與Y範圍之外的點,則相應地返回nan(Not a Number)。
(2)ZI = interp2(Z,XI,YI) 
缺省地,X=1:n、Y=1:m,其中[m,n]=size(Z)。再按第一種情形進行計算。
(3)ZI = interp2(Z,n) 
作n 次遞歸計算,在Z 的每兩個元素之間插入它們的二維插值,這樣,Z 的階數將不斷增加。interp2(Z)等價於interp2(z,1)。
(4)ZI = interp2(X,Y,Z,XI,YI,method) 
用指定的算法method 計算二維插值:
’linear’:雙線性插值算法(缺省算法);
’nearest’:最臨近插值;
’spline’:三次樣條插值;
’cubic’:雙三次插值。

例3: 
  1.  

  2. >>[X,Y] = meshgrid(-3:.25:3);

  3. >>Z = peaks(X,Y);

  4. >>[XI,YI] = meshgrid(-3:.125:3);

  5. >>ZZ = interp2(X,Y,Z,XI,YI);

  6. >>surfl(X,Y,Z);hold on;

  7. >>surfl(XI,YI,ZZ+15)

  8. >>axis([-3 3 -3 3 -5 20]);shading flat

  9. >>hold off

複製代碼
例4: 
  1.  

  2. >>years = 1950:10:1990;

  3. >>service = 10:10:30;

  4. >>wage = [150.697 199.592 187.625

  5. 179.323 195.072 250.287

  6. 203.212 179.092 322.767

  7. 226.505 153.706 426.730

  8. 249.633 120.281 598.243];

  9. >>w = interp2(service,years,wage,15,1975)

複製代碼
插值結果爲: 
  1.  

  2. w =

  3. 190.6288

複製代碼
命令3 interp3
功能 三維數據插值(查表)
格式 
(1)VI = interp3(X,Y,Z,V,XI,YI,ZI) 
找出由參量X,Y,Z決定的三元函數V=V(X,Y,Z)在點(XI,YI,ZI)的值。參量XI,YI,ZI 是同型陣列或向量。若向量參量XI,YI,ZI 是不同長度,不同方向(行或列)的向量,這時輸出參量VI 與Y1,Y2,Y3 爲同型矩陣。其中Y1,Y2,Y3 爲用命令meshgrid(XI,YI,ZI)生成的同型陣列。若插值點(XI,YI,ZI)中有位於點(X,Y,Z)之外的點,則相應地返回特殊變量值NaN。
(2)VI = interp3(V,XI,YI,ZI) 
缺省地, X=1:N ,Y=1:M, Z=1:P ,其中,[M,N,P]=size(V),再按上面的情形計算。
(3)VI = interp3(V,n) 
作n 次遞歸計算,在V 的每兩個元素之間插入它們的三維插值。這樣,V 的階數將不斷增加。interp3(V)等價於interp3(V,1)。
(4)VI = interp3(......,method) %用指定的算法method 作插值計算:
‘linear’:線性插值(缺省算法);
‘cubic’:三次插值;
‘spline’:三次樣條插值;
‘nearest’:最鄰近插值。
說明 在所有的算法中,都要求X,Y,Z 是單調且有相同的格點形式。當X,Y,Z 是等距且單調時,用算法’*linear’,’*cubic’,’*nearest’,可得到快速插值。

例5 
  1.  

  2. >>[x,y,z,v] = flow(20);

  3. >>[xx,yy,zz] = meshgrid(.1:.25:10, -3:.25:3, -3:.25:3);

  4. >>vv = interp3(x,y,z,v,xx,yy,zz);

  5. >>slice(xx,yy,zz,vv,[6 9.5],[1 2],[-2 .2]); shading interp;colormap cool

複製代碼
命令4 interpft
功能 用快速Fourier 算法作一維插值
格式 
(1)y = interpft(x,n) 
返回包含周期函數x 在重採樣的n 個等距的點的插值y。若length(x)=m,且x 有采樣間隔dx,則新的y 的採樣間隔dy=dx*m/n。注意的是必須n≥m。若x 爲一矩陣,則按x 的列進行計算。返回的矩陣y 有與x 相同的列數,但有n 行。
(2)y = interpft(x,n,dim) 
沿着指定的方向dim 進行計算

命令5 griddata
功能 數據格點
格式 
(1)ZI = griddata(x,y,z,XI,YI) 
用二元函數z=f(x,y)的曲面擬合有不規則的數據向量x,y,z。griddata 將返回曲面z 在點(XI,YI)處的插值。曲面總是經過這些數據點(x,y,z)的。輸入參量(XI,YI)通常是規則的格點(像用命令meshgrid 生成的一樣)。XI 可以是一行向量,這時XI 指定一有常數列向量的矩陣。類似地,YI 可以是一列向量,它指定一有常數行向量的矩陣。
(2)[XI,YI,ZI] = griddata(x,y,z,xi,yi) 
返回的矩陣ZI 含義同上,同時,返回的矩陣XI,YI 是由行向量xi 與列向量yi 用命令meshgrid 生成的。
(3)[XI,YI,ZI] = griddata(.......,method) 
用指定的算法method 計算:
‘linear’:基於三角形的線性插值(缺省算法);
‘cubic’: 基於三角形的三次插值;
‘nearest’:最鄰近插值法;
‘v4’:MATLAB 4 中的griddata 算法。

命令6 spline
功能 三次樣條數據插值
格式 
(1)yy = spline(x,y,xx) 
對於給定的離散的測量數據x,y(稱爲斷點),要尋找一個三項多項式y = p(x) ,以逼近每對數據(x,y)點間的曲線。過兩點(xi, yi) 和(xi+1, yi+1) 只能確定一條直線,而通過一點的三次多項式曲線有無窮多條。爲使通過中間斷點的三次多項式曲線具有唯一性,要增加兩個條件(因爲三次多項式有4 個係數):
a.三次多項式在點(xi, yi) 處有: p¢i(xi) = p¢i(xi) ;
b.三次多項式在點(xi+1, yi+1) 處有: p¢i(xi+1) = pi¢(xi+1) ;
c.p(x)在點(xi, yi) 處的斜率是連續的(爲了使三次多項式具有良好的解析性,加上的條件);
d.p(x)在點(xi, yi) 處的曲率是連續的;
對於第一個和最後一個多項式,人爲地規定如下條件:
①. p¢1¢(x) = p¢2¢(x)
②. p¢n¢(x) = p¢n¢-1(x)
上述兩個條件稱爲非結點(not-a-knot)條件。綜合上述內容,可知對數據擬合的三次樣條函數p(x)是一個分段的三次多項式:
ï ïî
ï ïí
ì
£ £
£ £
£ £
=
n n n+1
2 2 3
1 1 2
p (x) x x x
p (x) x x x
p (x) x x x
p(x)
L L L L
其中每段pi(x) 都是三次多項式。
該命令用三次樣條插值計算出由向量x 與y 確定的一元函數y=f(x)在點xx 處的值。若參量y 是一矩陣,則以y 的每一列和x 配對,再分別計算由它們確定的函數在點xx 處的值。則yy 是一階數爲length(xx)*size(y,2)的矩陣。
(2)pp = spline(x,y) 
返回由向量x 與y 確定的分段樣條多項式的係數矩陣pp,它可用於命令ppval、unmkpp 的計算。

例6
對離散地分佈在y=exp(x)sin(x)函數曲線上的數據點進行樣條插值計算: 
  1.  

  2. >>x = [0 2 4 5 8 12 12.8 17.2 19.9 20]; y = exp(x).*sin(x);

  3. >>xx = 0:.25:20;

  4. >>yy = spline(x,y,xx);

  5. >>plot(x,y,'o',xx,yy)

複製代碼
命令7 interpn
功能 n 維數據插值(查表)
格式 
(1)VI = interpn(X1,X2,,,Xn,V,Y1,Y2,⋯,Yn) %返回由參量X1,X2,…,Xn,V 確定的n 元函數V=V(X1,X2,…,Xn)在點(Y1,Y2,…,Yn)處的插值。參量Y1,Y2,…,Yn 是同型的矩陣或向量。若Y1,Y2,…,Yn 是向量,則可以
是不同長度,不同方向(行或列)的向量。它們將通過命令ndgrid生成同型的矩陣, 再作計算。若點(Y1,Y2,…,Yn) 中有位於點(X1,X2,…,Xn)之外的點,則相應地返回特殊變量NaN。
VI = interpn(V,Y1,Y2,⋯,Yn) %缺省地,X1=1:size(V,1),X2=1:size(V,2),… ,
Xn=1:size(V,n),再按上面的情形計算。
VI = interpn(V,ntimes) %作ntimes 次遞歸計算,在V 的每兩個元素之間插入它們的n 維插值。這樣,V 的階數將不斷增加。interpn(V)
等價於interpn(V, 1)。
VI = interpn(⋯,method) %用指定的算法method 計算:
‘linear’:線性插值(缺省算法);
‘cubic’:三次插值;
‘spline’:三次樣條插值法;
‘nearest’:最鄰近插值算法。

命令8 meshgrid
功能 生成用於畫三維圖形的矩陣數據。
格式 [X,Y] = meshgrid(x,y) 將由向量x,y(可以是不同方向的)指定的區域[min(x),max(x) , min(y) , max(y)] 用直線x=x(i),y=y(j) ( i=1,2,…,length(x) ,j=1,2,…,length(y))進行劃分。這樣,得到了length(x)*length(y)個點,
這些點的橫座標用矩陣X 表示,X 的每個行向量與向量x 相同;這些點的縱座標用矩陣Y 表示,Y 的每個列向量與向量y 相同。其中X,Y可用於計算二元函數z=f(x,y)與三維圖形中xy 平面矩形定義域的劃分或
曲面作圖。
[X,Y] = meshgrid(x) %等價於[X,Y]=meshgrid(x,x)。
[X,Y,Z] = meshgrid(x,y,z) %生成三維陣列X,Y,Z,用於計算三元函數v=f(x,y,z)或三維容積圖。

例7 
  1. [X,Y] = meshgrid(1:3,10:14)

複製代碼
計算結果爲: 
  1. X =

  2. 1 2 3

  3. 1 2 3

  4. 1 2 3

  5. 1 2 3

  6. 1 2 3

  7. Y =

  8. 10 10 10

  9. 11 11 11

  10. 12 12 12

  11. 13 13 13

  12. 14 14 14

複製代碼
命令9 ndgrid功能 生成用於多維函數計算或多維插值用的陣列
格式 [X1,X2,…,Xn] = ndgrid(x1,x2,…,xn) %把通過向量x1,x2,x3…,xn 指定的區域轉換爲數組x1,x2,x3,…,xn 。這樣, 得到了 length(x1)*length(x2)*…*length(xn)個點,這些點的第一維座標用矩陣X1 表
示,X1 的每個第一維向量與向量x1 相同;這些點的第二維座標用矩陣X2 表示,X2 的每個第二維向量與向量x2 相同;如此等等。
其中X1,X2,…,Xn 可用於計算多元函數y=f(x1,x2,…,xn)以及多維插值命令用到的陣列。
[X1,X2,…,Xn] = ndgrid(x) %等價於[X1,X2,…,Xn] = ndgrid(x,x,…,x)

命令10 table1
功能 一維查表
格式 Y = table1(TAB,X0) %返回用表格矩陣TAB 中的行線性插值元素,對X0(TAB的第一列查找X0)進行線性插值得到的結果Y。矩陣TAB 是第一列包含
關鍵值,而其他列包含數據的矩陣。X0 中的每一元素將相應地返回一線性插值行向量。矩陣TAB 的第一列必須是單調的。

例8 
  1.  

  2. >>tab = [(1:4)' hilb(4)]

  3. >>y = table1(tab,[1 2.3 3.6 4])

複製代碼
查表結果爲: 
  1.  

  2. >>tab = [(1:4)' hilb(4)]

  3. >>y = table1(tab,[1 2.3 3.6 4])

發佈了78 篇原創文章 · 獲贊 17 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章