Matlab曲面拟合和插值

    技术2022-05-20  46

    插值和拟合都是数据优化的一种方法,当实验数据不够多时经常需要用到这种方法来画图。在matlab中都有特定的函数来完成这些功能。这两种方法的确别在于:当测量值是准确的,没有误差时,一般用插值;当测量值与真实值有误差时,一般用数据拟合。插值:对于一维曲线的插值,一般用到的函数yi=interp1(X,Y,xi,method) ,其中method包括nearstlinearsplinecubic。对于二维曲面的插值,一般用到的函数zi=interp2(X,Y,Z,xi,yi,method),其中method也和上面一样,常用的是cubic。拟合:对于一维曲线的拟合,一般用到的函数p=polyfit(x,y,n)yi=polyval(p,xi),这个是最常用的最小二乘法的拟合方法。对于二维曲面的拟合,有很多方法可以实现,但是我这里自己用的是Spline Toolbox里面的函数功能。具体使用方法可以看后面的例子。 对于一维曲线的插值和拟合相对比较简单,这里就不多说了,对于二维曲面的插值和拟合还是比较有意思的。总结归纳一下给出实例和讲解。 %第一给例子clc;clear;clf;%原始数据的定义x=[1:1:12];y=[1:1:5];%z是一个5乘12的矩阵。z=[0.2 0.24 0.25 0.26 0.25 0.25 0.25 0.26 0.26 0.29 0.25 0.29;0.27 0.31 0.3 0.3 0.26 0.28 0.29 0.26 0.26 0.26 0.26 0.29;0.41 0.41 0.37 0.37 0.38 0.35 0.34 0.35 0.35 0.34 0.35 0.35;0.41 0.42 0.42 0.41 0.4 0.39 0.39 0.38 0.36 0.36 0.36 0.36;0.3 0.36 0.4 0.43 0.45 0.45 0.51 0.42 0.4 0.37 0.37 0.37];%直接用原始数据画图如下:%surf三维表面图surf(x,y,z);title('Original data Plot');xlabel('X'), ylabel('Y'), zlabel('Z'),%对X,Y,Z轴范围的控制axis([0 15 0 6 0.2 0.55]);%第二给例子clc;clear;clf;%原始数据的定义x=[1:1:12];y=[1:1:5];%z是一个512的矩阵。z=[0.2 0.24 0.25 0.26 0.25 0.25 0.25 0.26 0.26 0.29 0.25 0.29;0.27 0.31 0.3 0.3 0.26 0.28 0.29 0.26 0.26 0.26 0.26 0.29;0.41 0.41 0.37 0.37 0.38 0.35 0.34 0.35 0.35 0.34 0.35 0.35;0.41 0.42 0.42 0.41 0.4 0.39 0.39 0.38 0.36 0.36 0.36 0.36;0.3 0.36 0.4 0.43 0.45 0.45 0.51 0.42 0.4 0.37 0.37 0.37];%先考虑插值,需要用到的函数interp2x1=1:0.2:12;y1=1:0.2:5;[x2,y2]=meshgrid(x1,y1);t11=interp2(x,y,z,x2,y2,'cubic');surf(x1,y1,t11);title('After Fit data Plot');xlabel('X'), ylabel('Y'), zlabel('Z'),%X,Y,Z轴范围的控制axis([0 15 0 6 0.2 0.55]);%第三个例子x = rand(100,1)*16 - 8;y = rand(100,1)*16 - 8;r = sqrt(x.^2 + y.^2) + eps;z = sin(r)./r; xlin = linspace(min(x),max(x),33);ylin = linspace(min(y),max(y),33);[X,Y] = meshgrid(xlin,ylin); Z = griddata(x,y,z,X,Y,'cubic'); mesh(X,Y,Z) %interpolatedaxis tight; hold onplot3(x,y,z,'.','MarkerSize',15) %nonuniform

     


    最新回复(0)