插值法


目的:用於缺失數據處理

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM