MATLAB插值问题
一、一元函數插值
已知函數y=f(x)在區間[a,b]上的n+1個不同點的函數值為,若存在一個簡單函數F(x), 使,稱F(x)為f(x)在區間[a,b]上的插值函數,稱(xi, yi)為插值節點。若F(x)為多項式,稱為多項式插值(或代數插值) ;常用的代數插值方法有:拉格朗日插值,牛頓插值。
n次代數插值:已知f(x)在n+1個點x0,x1,…,xn處的函數值為 y0,y1,…,yn , 求一個n次多項式函數Pn(x),使其滿足: Pn(xi)=yi, (i=0,1,…,n). 若Pn(x)按下述方式構造,稱為拉格朗日插值
其中Li(x) 為n次多項式:
稱為拉格朗日插值基函數.
特別地:?
(1)已知兩個節點時,得線性插值多項式:
(2)已知三個節點時,得拋物插值多項式:
(3)已知n+1個節點時,可得n次拉格朗日插值多項式。
關于代數插值:
可以看出,當節點較多時,多項式的次數增高,插值函數出現振蕩,精度變低。因此,為了保證精度,在節點較多時,一般采用分段插值,但這樣在分段點光滑性較差。Matlab采用的多項式插值都是分段插值法。從圖形還可以看出,對解析函數,插值精度高;對有奇點的函數,插值精度低。多項式插值對靠近插值區間中點的部分插值精度高,遠離中點部分精度低。
規則網點的插值
y=interp1(x0,y0,x,'method'),y是對應x插值后獲得的因變量,x0和y0為初始數據的自變量和因變量
Method 的選項有 ‘nearest’, ‘next’, ‘previous’, ‘linear’,‘spline’,‘pchip’, 和 'cubic'. 缺省的機器設置為'linear'.
插值效果:
參考程序:
xdata=0:pi/6:2*pi; ydata=sin(xdata); x=0:pi/20:2*pi; subplot(2,2,1) y=interp1(xdata,ydata,x,'nearest'); plot(xdata,ydata,'p',x,y,'k-') title('nearest') subplot(2,2,2) y=interp1(xdata,ydata,x,'linear'); plot(xdata,ydata,'p',x,y,'k-') title('linear') subplot(2,2,3) y=interp1(xdata,ydata,x,'cubic'); plot(xdata,ydata,'p',x,y,'k-') title('cubic') subplot(2,2,4) y=interp1(xdata,ydata,x,'spline'); plot(xdata,ydata,'p',x,y,'k-') title('spline')?插值誤差:
參考程序:
xdata=0:pi/6:2*pi; ydata=sin(xdata); x=0:pi/20:2*pi; yy=sin(x); subplot(2,2,1) y=interp1(xdata,ydata,x,'nearest'); plot(x,y-yy,'k-') title('nearest') subplot(2,2,2) y=interp1(xdata,ydata,x,'linear'); plot(x,y-yy,'k-') title('linear') subplot(2,2,3) y=interp1(xdata,ydata,x,'curve'); plot(x,y-yy,'k-') title('curve') subplot(2,2,4) y=interp1(xdata,ydata,x,'spline'); plot(x,y-yy,'k-') title('spline')?小tips:插值中使用較多的是分段線性插值和三次樣條插值。
三次樣條插值是解決一維插值問題最常用的方法, Matlab中實現三次樣條插值的方法有:
例1:通過實驗測得某函數的一組數據如下,試作出其插值函數的圖形。
解法一:
x=[0,3,5,7,9,11,12,13,14,15]; y=[0,1.2,1.65,2.1,2.15,2.0,1.85,1.65,1.55,1.25]; xi=0:0.1:15; yi=interp1(x,y,xi, 'spline'); yi1=interp1(x,y,xi, 'linear'); yi2=interp1(x,y,xi, 'cubic'); plot(x,y,'*',xi,yi,'r-',xi,yi1,'b-',xi,yi2,'g-') legend('節點','三次樣條插值','線性插值','立方插值')解法二:
x=[0,3,5,7,9,11,12,13,14,15]; y=[0,1.2,1.65,2.1,2.15,2.0,1.85,1.65,1.55,1.25]; xx=0: 0.1: 15; S=csape(x, y); %Sa=spline(x, y) ; P=S.coefs; %Pa=Sa.coefs; yy=ppval(S,xx); plot(x,y,'o',xx,yy,'r');關于pp形式:
pp就是分段多項式,百語句形如:
breaks = -5:-1;
coefs = -22:-11;
pp = ppmak(breaks,coefs)
其中:breaks就是各度段的端點值,-5,-4,-3,-2,-1,有問4個區間
coefs就是每段多項式的系數,答共有12個值,12/4=3,則有回4個多項式,每個多項式的最高次答數是3
二、 二元函數插值?
網格節點數據插值
函數:interp2
格式:z=interp2(x0, y0, z0, x, y, ’method’)
x0,y0,z0:插值節點坐標,要求x0, y0單調;
x, y是被插值點的橫坐標與縱坐標( x, y不能超過x0,y0的范圍),z是被插值點的函數值。 ?
Method:(1)nearest 最鄰近插值,(2)linear ?雙線性插值,(3)cubic雙三次插值,默認為雙線性插值。
例2:要在一山區修建公路,首先測得一些點的高程(見附件,表中數據為坐標點的高程,單位:米,y軸正向為北)繪制該地地貌圖。
| 4800 | 1350 | 1370 | 1390 | 1400 | 1410 | 960 | 940 | 880 | 800 | 690 | 570 | 430 | 290 | 210 | 150 |
| 4400 | 1370 | 1390 | 1410 | 1430 | 1440 | 1140 | 1110 | 1050 | 950 | 820 | 690 | 540 | 380 | 300 | 210 |
| 4000 | 1380 | 1410 | 1430 | 1450 | 1470 | 1320 | 1280 | 1200 | 1080 | 940 | 780 | 620 | 450 | 370 | 350 |
| 3600 | 1420 | 1430 | 1450 | 1480 | 1500 | 1550 | 1510 | 1430 | 1300 | 1200 | 980 | 850 | 750 | 550 | 500 |
| 3200 | 1430 | 1450 | 1460 | 1500 | 1550 | 1600 | 1550 | 1600 | 1600 | 1600 | 1550 | 1500 | 1500 | 1550 | 1500 |
| 2800 | 950 | 1190 | 1370 | 1500 | 1200 | 1100 | 1550 | 1600 | 1550 | 1380 | 1070 | 900 | 1050 | 1150 | 1200 |
| 2400 | 910 | 1090 | 1270 | 1500 | 1200 | 1100 | 1350 | 1450 | 1200 | 1150 | 1010 | 880 | 1000 | 1050 | 1100 |
| 2000 | 880 | 1060 | 1230 | 1390 | 1500 | 1500 | 1400 | 900 | 1100 | 1060 | 950 | 870 | 900 | 930 | 950 |
| 1600 | 830 | 980 | 1180 | 1320 | 1450 | 1420 | 1400 | 1300 | 700 | 900 | 850 | 840 | 380 | 780 | 750 |
| 1200 | 740 | 880 | 1080 | 1130 | 1250 | 1280 | 1230 | 1040 | 900 | 500 | 700 | 780 | 750 | 650 | 550 |
| 800 | 650 | 760 | 880 | 970 | 1020 | 1050 | 1200 | 830 | 800 | 700 | 300 | 500 | 550 | 480 | 350 |
| 400 | 510 | 620 | 730 | 800 | 850 | 870 | 850 | 780 | 720 | 650 | 500 | 200 | 300 | 350 | 320 |
| 0 | 370 | 470 | 550 | 600 | 670 | 690 | 670 | 620 | 580 | 450 | 400 | 300 | 100 | 150 | 250 |
| y/x | 0 | 400 | 800 | 1200 | 1600 | 2000 | 2400 | 2800 | 3200 | 3600 | 4000 | 4400 | 4800 | 5200 | 5600 |
解:
A = xlsread('新建 XLSX 工作表.xlsx'); [xx,yy]=size(A); Z=A([1:xx-1],[2:yy]); x=0:400:5600; y=4800:-400:0; [X,Y]=meshgrid(x,y); surf(X,Y,Z); %離散圖 figure(2); xi=linspace(0, 5600, 80); yi=linspace(0, 4800, 80); [Xi,Yi]=meshgrid(xi, yi); %%------------------------------- Zi=interp2(X,Y,Z,Xi,Yi,'linear'); %二元插值 linear surf(Xi,Yi,Zi); %%------------------------------- figure(3) Zi=interp2(X,Y,Z,Xi,Yi,'spline'); %二元插值 spline surf(Xi,Yi,Zi); %%------------------------------- figure(4) t=0:100:1600; [c,h]= contourf(Xi,Yi,Zi,t); %等高線 clabel(c, h) colormap cool colorbar散點數據插值函數
已知n個插值節點(xi, yi, zi), (i=1,2,…,n), 求在點(x,y)處的插值z, matlab提供函數griddata。
格式:cz=griddata(x,y,z,cx,cy,’method’)
其中x,y,z 均為n 維向量,指明所給數據點(插值節點)的橫坐標、縱坐標和豎坐標。cx, cy是給定被插值點的橫坐標和縱坐標,cz為相應點的豎坐標。
若cx,cy是向量,則給定以它們所確定網格點的橫坐標和縱坐標,這時要求cx,cy一個為行向量一個為列向量。 編程時也可先用meshgrid將cx,cy定義成網格矩陣。
例3:在某海域測得一些點(x,y)處的水深z(英尺)如下表,船的吃水深度為5英尺,在矩形區域(75,200)×(-50,150)里那些地方船要避免進入。
| x | 129 | 140 | 103.5 | 88 | 185.5 | 195 | 105 | 157.5 | 107.5 | 77 | 81 | 162 | 162 | 117.5 |
| y | 7.5 | 141.5 | 23 | 147 | 22.5 | 137.5 | 85.5 | -6.5 | -81 | 3 | 56.5 | -66.5 | 84 | -33.5 |
| z | 4 | 8 | 6 | 8 | 6 | 8 | 8 | 9 | 9 | 8 | 8 | 9 | 4 | 9 |
解:
x=[129,140,103.5,88,185.5,195,105,157.5,107.5,77,81,162,162,117.5]; y=[7.5,141.5,23,147,22.5,137.5,85.5,-6.5,-81,3,56.5,-66.5,84,-33.5]; z=-[4,8,6,8,6,8,8,9,9,8,8,9,4,9]; [x1,y1]=meshgrid(75:5:200,150:-5:-50); z1=griddata(x,y,z,x1,y1,'v4'); surf(x1,y1,z1) figure(2) [c,h]=contourf(x1,y1,z1); clabel(c,h)三、 三元函數插值
函數:interp3
格式:v?= interp3(x0, y0, z0, v0 , x, y, z ,’method’)
x0,y0,z0,v0為插值數據,x,y,z為被插值的范圍,v代表val
雖然三元圖像不能直觀的畫圖觀察,但是可以通過切割觀察剖面,配合slice函數觀察切片情況
格式:slice(X,Y,Z,V,sx,sy,sz)
X,Y,Z,V為數據,sx,sy,sz可決定切片形式和位置
總結
以上是生活随笔為你收集整理的MATLAB插值问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客 - 动物森友会(二分+最大流)
- 下一篇: CodeForces - 1343D C