插值法
阿新 • • 發佈:2021-10-11
目的:用於缺失資料處理
定義:在離散資料的基礎上補插連續函式,使得這條連續曲線通過全部給定的離散資料點。(而擬合只求函式影象神似而不求穿過已知點)
輸入的是一堆點,也就是一堆x和一堆y,想要得到一個函式,能完美通過這一堆x和這一堆y
分類:分段插值、多項式插值、三角插值
- 若f(x)是次數不超過n的代數多項式,就是多項式插值
- 若f(x)是分段多項式,就是分段插值
- 若f(x)為三角多項式,就是三角插值
高次插值會產生龍格現象,即在兩端波動極大,產生明顯的震盪
故,插值多項式次數高,精度未必顯著提高,
所以需要採用分段插值來解決。
分段插值:
將全部資料分割成若干部分,每個小部分用插值得到不同的函式,最後用很多不同的函式表達原來的序列
三次樣條插值就是將原始序列分割成若干段,構造多個三次函式(x的三次方形式構造),使得分段的銜接處具有二階導數連續的性質(也就是光滑銜接)
三次樣條插值與三次埃爾米特插值
% 三次樣條插值和分段三次埃爾米特插值的對比 x = -pi:pi; y = sin(x); new_x = -pi:0.1:pi; p1 = pchip(x,y,new_x); %分段三次埃爾米特插值 p2 = spline(x,y,new_x); %三次樣條插值
%x是已知的樣本點的橫座標;y是已知的樣本點的縱座標;new_x是要插入處對應的橫座標 figure(2); plot(x,y,'o',new_x,p1,'r-',new_x,p2,'b-') legend('樣本點','三次埃爾米特插值','三次樣條插值','Location','SouthEast') %標註顯示在東南方向
例題:
原始資料:需要插值得到偶數週輪蟲、溶氧等的值。
%插值預測中間周的水體評價指標 load Z.mat x=Z(1,:); %Z的第一行是星期Z: 1 3 5 7 9 11 13 15 [n,m]=size(Z);%n為Z的行數,m為Z的列數 % 注意Matlab的陣列中不能儲存字串,如果要生成字串陣列,就需要使用元胞陣列,其用大括號{}定義和引用 ylab={'週數','輪蟲','溶氧','COD','水溫','PH值','鹽度','透明度','總鹼度','氯離子','透明度','生物量'}; % 等會要畫的圖形的標籤 disp(['共有' num2str(n-1) '個指標要進行插值。']) disp('正在對一號池三次埃爾米特插值,請等待')%一號池共有十一組要插值的資料,算上星期所在的第一行,共十二行 P=zeros(11,15);%對要儲存資料的矩陣P賦予初值 for i=2:n%從第二行開始都是要進行插值的指標 y=Z(i,:);%將每一行依次賦值給y new_x=1:15;%要進行插值的x p1=pchip(x,y,new_x);%呼叫三次埃爾米特插值函式 subplot(4,3,i-1);%將所有圖依次變現在4*3的一幅大圖上 plot(x,y,'ro',new_x,p1,'g-');%畫出每次迴圈處理後的影象 axis([0 15,-inf,inf]) %設定座標軸的範圍,這裡設定橫座標軸0-15,縱座標不變化 % xlabel('星期')%x軸標題 ylabel(ylab{i})%y軸標題 這裡是直接引用元胞陣列中的字串哦 P(i-1,:)=p1;%將每次插值之後的結果儲存在P矩陣中 end legend('原始資料','三次埃爾米特插值資料','Location','SouthEast')%加上標註,注意要手動在圖中拖動標註到圖片右下角哦 P = [1:15; P] %把P的第一行加上週數