MATLAB--插值

%多项式插值

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)

猜你喜欢

转载自blog.csdn.net/weixin_42107106/article/details/82938278