MATLAB--条件插值、二维插值、拟合

%% 样条边界条件插值
x=linspace(0,2*pi,15);
y=sin(x);
plot(x,y,'o')
hold on
% complete
p=csape(x,y,'complete',[2,2]);
x1=linspace(0,2*pi,150);
y1=ppval(p,x1);
plot(x1,y1,'b','linewidth',1.5)
% second
p=csape(x,y,'second',[2,3]);
x1=linspace(0,2*pi,150);
y1=ppval(p,x1);
plot(x1,y1,'b','linewidth',1.5)
% periodic
p=csape(x,y,'periodic',[2,2]);
x1=linspace(0,2*pi,150);
y1=ppval(p,x1);
plot(x1,y1,'b','linewidth',1.5)
% not-a-knot
p=csape(x,y,'not-a-knot');
x1=linspace(0,2*pi,150);
y1=ppval(p,x1);
plot(x1,y1,'b','linewidth',1.5)
%variational
p=csape(x,y,'variational');
x1=linspace(0,2*pi,150);
y1=ppval(p,x1);
plot(x1,y1,'b','linewidth',1.5)

%% interp2
x=linspace(-5,5,5)
y=linspace(-5,5,5)
[X,Y]=meshgrid(x,y);
Z=X.^2+Y.^2;
x1=linspace(-5,5,100)
y1=linspace(-5,5,100)
[XX,YY]=meshgrid(x1,y1);
% ZZ=interp2(X,Y,Z,XX,YY);
% mesh(X,Y,Z,'linestyle',':')
% hold on
% mesh(XX,YY,ZZ,'linestyle','-','edgecolor','r')    下图一
%默认的是线性插值
%% nearest

ZZ=interp2(X,Y,Z,XX,YY,'nearest');
mesh(X,Y,Z,'linestyle',':')
hold on
mesh(XX,YY,ZZ,'linestyle','-','edgecolor','r')   下图二


%% cubic
ZZ=interp2(X,Y,Z,XX,YY,'cubic');
mesh(X,Y,Z,'linestyle',':')
hold on
mesh(XX,YY,ZZ,'linestyle','-','edgecolor','r')      下图一
%% spline
ZZ=interp2(X,Y,Z,XX,YY,'spline');
mesh(X,Y,Z,'linestyle',':')
hold on
mesh(XX,YY,ZZ,'linestyle','-','edgecolor','r')   下图二


%% 
x1=linspace(-6,6,100)
y1=linspace(-6,6,100)
[XX,YY]=meshgrid(x1,y1);
ZZ=interp2(X,Y,Z,XX,YY,'spline');%可进行外推
mesh(X,Y,Z,'linestyle',':')
hold on
mesh(XX,YY,ZZ,'linestyle','-','edgecolor','r')

ZZ=mesh(Z,2);
mesh(ZZ)

%% griddata
x=[1 5 2 3 4 8 2 0 4 -1 -6 -5 5];
y=[2 3 5 4 7 5 -3 5 3 6 -6 5 -5];
z=x.^2+y.^2;
Z=gridddata(x,y,z,X,Y)%默认的是线性插值
mesh(X,Y,Z)

%nearest
Z=griddata(x,y,z,X,Y,'nearest')%默认的是线性插值
mesh(X,Y,Z)
%cubic
Z=griddata(x,y,z,X,Y,'cubic')%默认的是线性插值
mesh(X,Y,Z)
%v4
Z=griddata(x,y,z,X,Y,'v4')%默认的是线性插值
mesh(X,Y,Z)
%natural
Z=griddata(x,y,z,X,Y,'natural')%默认的是线性插值
mesh(X,Y,Z)

%% polyfit polyval
x=linspace(0,2*pi,10);
y=sin(x);
p=polyfit(x,y,8)
poly2str(p,'x')
x1=linspace(0,2*pi,100);
y1=polyval(p,x1)
plot(x,y,'o',x1,y1)

x=linspace(1000,2000,10);
y=1e5*[0.02 0.04 0.05 0.055 0.5 0.6 0.9 1.52 2.3 3.6];
plot(x,y,'o')
hold on
x1=linspace(1000,2000,100);
[P,~,mu]=polyfit(x,y,5)%x比较大进行缩放
y1=polyval(P,x1,[],mu)
plot(x1,y1)

%%最小二乘拟合 lsqcurvefit
xdata=linspace(0,2*pi,15);
y=5*sin(xdata)+2*xdata+xdata.^2;
y=y+2*rand(1,15)
plot(xdata,y,'o')
hold on

% fun=@(x,xdata) x(1)*sin(xdata)+x(2)*xdata+x(3)*xdata.^2;
% x=lsqcurvefit(fun,[0,0,0],xdata,y);%[0,0,0]表示三个未知数,若上面有一项的系数已知则为两个未知数
% xx=linspace(0,2*pi,150);
% yy=fun(x,xx)
% plot(xx,yy)
% lb=[-1 -1 -1];%系数的下限
% ub=[6 3 2];%系数的上限
% fun=@(x,xdata) x(1)*sin(xdata)+x(2)*xdata+x(3)*xdata.^2;
% x=lsqcurvefit(fun,[0,0,0],xdata,y,lb,ub);%[0,0,0]表示三个未知数,若上面有一项的系数已知则为两个未知数
% xx=linspace(0,2*pi,150);
% yy=fun(x,xx)
% plot(xx,yy)

% options=optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
% options=optimoptions('lsqcurvefit','Display','off');
fun=@(x,xdata) x(1)*sin(xdata)+x(2)*xdata+x(3)*xdata.^2;
[x,~,~,exitflag]=lsqcurvefit(fun,[0,0,0],xdata,y);%[0,0,0]表示三个未知数,若上面有一项的系数已知则为两个未知数,exitflag为一则拟合成功
xx=linspace(0,2*pi,150);
yy=fun(x,xx)
plot(xx,yy)

猜你喜欢

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