1. 程式人生 > 其它 >插值法

插值法

目的:用於缺失資料處理

定義:在離散資料的基礎上補插連續函式,使得這條連續曲線通過全部給定的離散資料點。(而擬合只求函式影象神似而不求穿過已知點

   輸入的是一堆點,也就是一堆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的第一行加上週數