Matlab插值
1.一維插值函數
matlab中有現成的一維插值函數interp1
語法為
其中method指定插值的方法,默認為線性插值。其值可為
| nearest | 最近項插值 |
| linear | 線性插值 |
| spline | 立方樣條插值 |
| cubic | 立方插值 |
所有的插值方法要求x0是單調的。
2.三次樣條插值
在matlab中數據點稱為斷點。如果三次樣條插值沒有邊界條件,最常用的方法就是采用非扭結(not-a-knot)條件
matlab中三次樣條插值有如下函數
其中:x0,y0是已知數據點;x是插值點;y是插值點的函數值。
對于三次樣條插值,提倡使用函數csage。csage的返回值是pp形式,要求插值點的函數值必須調用函數fnval。
pp=esape(x0,y0);%式中:使用默認的邊界條件,即Lagrange邊界條件
pp=esape(x0,y0,conds,valconds);式中:conds指定插值的邊界條件,其值可為
| complete | 邊界為一階導數,一階導數的值在valconds參數中給出,若忽略valconds參數,則按照默認情況處理 |
| not-a-knot | 非扭結條件 |
| periodic | 周期條件 |
| second | 邊界為二階導數,二階導數的值在valconds參數中給出,若忽略valconds參數,二階導數的默認值為[0,0] |
| variational | 設置邊界的二階導數為[0,0] |
對于一些特殊的邊界條件,可以通過conds的一個1*2的矩陣來表示,conds元素的取值為0、1、2.
插值舉例
結果
結果分析:分段線性插值的光滑性較差(圖1),建議選用三次樣條插值。
matlab代碼
clc;clear; x0=[0 3 5 7 9 11 12 13 14 15]; y0=[0,1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6];x=0:0.1:15; y1=interp1(x0,y0,x);%一維插值,默認線性插值y2=interp1(x0,y0,x,'spline');%立方樣條插值pp1=csape(x0,y0);%三次樣條插值,默認使用Lagrange邊界條件 y3=fnval(pp1,x);pp2=csape(x0,y0,'second');%三次樣條插值,邊界為2階導數 y4=fnval(pp2,x); [x',y1',y2',y3',y4']%輸出結果%畫圖 subplot(1,3,1) plot(x0,y0,'+',x,y1); title("Piecewise linear");subplot(1,3,2) plot(x0,y0,'+',x,y2); title("Spline1");subplot(1,3,3) plot(x0,y0,'+',x,y3); title("Spline2");3.二維插值
若節點是二維,插值函數就是二元函數,即曲面。
1)插值節點為網格節點
已知m*n個節點:(xi,yj,zij)(x_i,y_j,z_{ij})(xi?,yj?,zij?)求點(x,y)處的插值z。
matlab中有一些計算二維插值的命令
其中:x0,y0分別為m維和n維向量,表示節點。z0為n*m矩陣,表示節點值;x,y為一維數組,表示插值點,x與y應是方向不同的向量,即一個是行向量,另一個是列向量;z為矩陣,它的行數為y的維數,列數為x的維數,表示得到的插值;
如果是三次樣條插值,可以使用
pp=csape({x0,y0},z0,conds,valconds); z=fnval(pp,{x,y});其中: x0,y0 分別為m 維和n維向量,z0 為m × n 維矩陣,z 為矩陣,它的行數為x的維
數,列數為y 的維數,表示得到的插值,具體使用方法同一維插值。
舉例:在一丘陵地帶測量高程,x 和y 方向每隔100米測一個點,得高程如2表,試插
值一曲面,確定合適的模型,并由此找出最高點和該點的高程。
運行結果
i =8j =9x =170y =180zmax =720.62522)插值節點為散亂節點
已知n個節點(xi,yi,zi)(x_i,y_i,z_i)(xi?,yi?,zi?),求點(x,y)處的插值z
Matlab 中提供了插值函數griddata
其中x,y,z 均為n 維向量,指明所給數據點的橫坐標、縱坐標和豎坐標。向量XI、YI 是給定的網格點的橫坐標和縱坐標,返回值ZI 為網格(XI,YI)處的函數值。XI與YI 應是方向不同的向量,即一個是行向量,另一個是列向量。
繪制海底曲面的形狀
海底水深數據
運行結果
xmm =77 195ymm =-81 147總結
- 上一篇: Matlab最短路学习
- 下一篇: 如何开一家照相馆 其实算是比较简单