分段線性插值故名思議就是說把給定樣本點的區間分成多個不同區間,記為[xi,xi+1],在每個區間上的一次線性方程為:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zN0AzN1MTN5EDOwkDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
關于其證明:
分段線性插值在速度和誤差取得了很好的平衡,插值函數具有連續性,但是由于在已知點的斜率是不變的,是以插值結果不光滑。
第一次用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')
可以看到插值結果:
————————————————
版權聲明:本文為CSDN部落客「風翼冰舟」的原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/zb1165048017/article/details/48293523