1. 程式人生 > >MATLAB--條件插值、二維插值、擬合

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

% [email protected](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];%係數的上限 % [email protected](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'); [email protected](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)