%多项式插值
x=[1 2 3 4 5 6];
y=[2 5 6 9 14 26];
a=duoxiangshi(x,y)
function D=duoxiangshi(X,Y)
A=vander(X)
Y=Y'
B=[A,Y]
C=rref(B)
D=C(:,end)
fprintf('\n 这是一个%d阶的多项式,从高阶到低阶排列!\n',length(Y)-1);
plot(X,Y,'o');
hold on
x=X(1):0.01:X(end);
y=polyval(D,x)
plot(x,y)
end
%拉格朗日插值
x1=[2 3 5 7 8 9];
y1=[5 9 12 16 23 35];
y=lagrange(x1,y1)
function L=lagrange(X,Y)
if length(X)~=length(Y)
error('维数不相同');
end
m=length(X)
for i=1:m
L1(i)=Y(i)*ji(X,i);
end
L=sym2poly(expand(sum(L1)));
x=X(1):0.1:X(end);
y=polyval(L,x)
plot(x,y)
hold on
plot(X,Y,'o')
function D=ji(X,n)
syms x
% switch n
% case 1
% B=x-X(2:end)
% C=X(1)-X(2:end)
% case length(X)
% B=x-X(1:n-1);
% C=X(n)-X(1:n-1);
% otherwise
% B=x-X([1:n-1,n+1:end]);
% C=X(n)-X([1:n-1,n+1:end]);
% end
%写法二
Xn=X(n);
X(n)=[];
B=x-X;
C=Xn-X;
D=prod(B)/prod(C);
%牛顿插值
x=[2 3 5 6 9];
y=[4 8 12 15 23];
y1=newton(x,y)
function C=cha(X,Y)
%C存储差商结果
%X是横坐标
m=length(X);
d=diff(Y)./diff(X);
C(1)=d(1);
for i=2:m-1
X1=X(i+1:end);
n=length(X1)
X2=X(1:n)
d=diff(d)./(X1-X2);
C(i)=d(1);
end
function N=newton(X,Y)
m=length(X);
c=cha(X,Y);
syms x
for i=1:m-1
D1=x-X(1:i);
D(i)=prod(D1);
end
N=sym2poly(expand(sum(D.*c)+Y(1)));
x=X(1):0.1:X(end)
y=polyval(N,x)
plot(x,y)
hold on
plot(X,Y,'o')
%埃尔米特插值
x=[1 2 3 4];
y=[2 11 32 71];
yy=[4 15 27 51];
y1=hermite(x,y,x,yy)
function H=hermite(X,Y,XO,YY)
%HERMITE 插值
%X为数据点X坐标
%Y为数据点Y坐标
%XO为导数点X坐标
%YY为导数值
syms x
N=newton(X,Y);
N1=diff(N)
m=length(XO);
w=prod(x-X);
A=zeros(1,m);
for i=1:m
W=diff(w);
A(i)=(YY(i)-subs(N1,x,XO(i)))/subs(W,x,XO(i));
end
A=newton(XO,A);
H=expand(N+A*w);
HH=diff(H);
H1=sym2poly(HH)
subplot(2,1,1)
x=X(1):0.1:X(end)
y=polyval(H1,x)
plot(x,y)
hold on
plot(X,Y,'o')
title('函数值')
HH1=sym2poly(HH)
subplot(2,1,2)
x1=XO(1):0.1:XO(end)
y1=polyval(HH1,x1)
plot(x1,y1)
hold on
plot(XO,YY,'o')
title('导数值')
function N=newton(X,Y)
m=length(X);
c=cha(X,Y);
syms x
for i=1:m-1
D1=x-X(1:i);
D(i)=prod(D1);
end
N=expand(sum(D.*c)+Y(1));
%分段线性插值
x=-5:0.2:5;
y=1./(1+x.^2);
y1=newton(x,y);
x=[1 2 3 4 5 6 7];
y=[2 4 5 7 8 11 15];
x0=x(1):0.1:x(end)+1;
y1=fen_linear(x,y,x0)
function Y=fen_linear(X,Y,XO)
m=length(X);
if max(XO)>max(X)||min(XO)<min(X)
warning('数据超出范围');
end
XO(XO>max(X)|XO<min(X))=[];
YO=zeros(size(XO));
syms x
id=1;
for i=1:m-1
xi=XO(XO>=X(i)&XO<X(i+1));
if isempty(xi),continue;end
Ihx=Y(i)*(x-X(i+1))/(X(i)-X(i+1))+Y(i+1)*(x-X(i))/(X(i+1)-X(i));
Ih=sym2poly(expand(Ihx));
YO(id:id+length(xi)-1)=polyval(Ih,xi)
id=length(xi)+id;
end
plot(X,Y,'-o')
hold on
plot(XO,YO,'*')
%plot(X,Y,'-o',XO,YO,'*')
legend('原始点','插值点','Location','northwest')
tem=[2 2 0 2 2 2 2 3 5 7 9 10 11 12 12 11 10 9 7 7 6 6 5 5];
time=1:24;
plot(time,tem,'o')
hold on
%第一种用法
xq=1:0.5:24;
vq=interp1(time,tem,xq);
plot(xq,vq)
close
%第二种用法
% liner 连续
% nearest
% next
% previous
% phicp 保形分段三次插值
% cubic
% spline
% 线性
subplot(2,3,1)
xq=1:0.5:24;
vq=interp1(time,tem,xq,'linear');
plot(xq,vq,'*')
title('linear')
%临近点
subplot(2,3,2)
xq=1:0.5:24;
vq=interp1(time,tem,xq,'nearest');
plot(xq,vq,'*')
title('nearest')
% next
subplot(2,3,3)
xq=1:0.5:24;
vq=interp1(time,tem,xq,'next');
plot(xq,vq,'*')
title('next')
% previous
subplot(2,3,4)
xq=1:0.5:24;
vq=interp1(time,tem,xq,'previous');
plot(xq,vq,'*')
title('previous')
% pchip
subplot(2,3,5)
xq=1:0.5:24;
vq=interp1(time,tem,xq,'pchip');
plot(xq,vq,'*')
title('pchip')
% spline
subplot(2,3,6)
xq=1:0.5:24;
vq=interp1(time,tem,xq,'spline');
plot(xq,vq,'*')
title('spline')
%第三种
close
x=0:0.5:2*pi;
y=sin(x);
p=interp1(x,y,'spline','pp')%p是一个结构体,p.coefs
yy=ppval(p,linspace(0,2*pi,101))
plot(x,y,'o',linspace(0,2*pi,101),yy)
%第四种
close
x=0:0.5:2*pi;
y=sin(x);
xi=-2:0.2:7;
p=interp1(x,y,xi,'spline')%超出部分自动外推
p=interp1(x,y,xi,'linear','extrap')%extrap进行外推
plot(x,y,'o',xi,p)
%next
p=interp1(x,y,xi,'next','extrap')
p=interp1(x,y,xi,'linear',9)%超出范围的定为9
%% 样条插值 spline
%第一种
x=0:0.5:2*pi;
y=sin(x)
xx=0:0.1:2*pi
yy=spline(x,y,xx)
plot(x,y,'o',xx,yy,'-')
close
%第二种
x=0:0.5:2*pi;
y=[sin(x);cos(x)]
xx=0:0.1:2*pi
yy=spline(x,y,xx)
plot(x,y,'o',xx,yy,'-')
%第三种 取出插值多项式的系数
x=0:0.5:2*pi;
y=sin(x);
p=spline(x,y)
xx=0:0.1:2*pi
yy=ppval(p,xx)
plot(x,y,'o',xx,yy)
%% pchip
%第一种
x=0:0.5:2*pi;
y=sin(x)
xx=0:0.1:2*pi
yy=pchip(x,y,xx)
plot(x,y,'o',xx,yy,'-')
%第二种 取出插值多项式的系数
x=0:0.5:2*pi;
y=sin(x);
p=pchip(x,y)
xx=0:0.1:2*pi
yy=ppval(p,xx)
plot(x,y,'o',xx,yy)