天天看點

分段線性插值 PWL

分段線性插值故名思議就是說把給定樣本點的區間分成多個不同區間,記為[xi,xi+1],在每個區間上的一次線性方程為:

分段線性插值 PWL

關于其證明:

分段線性插值 PWL

分段線性插值在速度和誤差取得了很好的平衡,插值函數具有連續性,但是由于在已知點的斜率是不變的,是以插值結果不光滑。

第一次用matlab寫代碼,有點手生。

liner.m檔案:

function yy = liner(x,y,xx)

%x是已知資料點的x值

%y是已知資料點的y值

%是待插入點的橫坐标值

%假設輸入的樣本點的x值是依次增大的

syms t;

if(length(x)==length(y))

    n=length(x);

else

    disp('x和y維數不相等!');

    return;

end

for i=1:n-1

    %     disp(['區間為',num2str(x(i)),'-',num2str(x(i+1))]);

    yy(i)=((t-x(i+1))/(x(i)-x(i+1)))*y(i)+((t-x(i))/(x(i+1)-x(i)))*y(i+1);

end

if(nargin==3)

   nn=length(xx);

for i=1:nn

    for j=1:n-1

        if(xx(i)>x(j)&xx(i)<=x(j+1))

             yynum(i)=subs(yy(j),'t',xx(i));   %計算插值點的函數值.subs是替換函數,把x0用t替換

        end

    end

end    

yy=yynum;

else

    yy=collect(yy);          %将插值多項式展開

    yy=vpa(yy,6);            %将插值多項式的系數化成6位精度的小數

end

end

linerInsert.m檔案:

x=0:2*pi;

y=sin(x);

xx=0:0.2:6;

yy=liner(x,y,xx);

plot(x,y,'o:',xx,yy,'+r')

可以看到插值結果:

分段線性插值 PWL

————————————————

版權聲明:本文為CSDN部落客「風翼冰舟」的原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/zb1165048017/article/details/48293523

繼續閱讀