拟合
运用matlab提供的工具箱,在APP的CurveFitting里面
插值
一维插值
函数介绍
在这里我们介绍interp1函数的用法:
yi=interp1(x,y,xi,‘method’)
x:已知的自变量的值,是一个向量;
y:与x对应的因变量的值;
xi:用户另外指定的插值点的横坐标
yi:指定的插值点的纵坐标
method:插值方法,这里以三次样条插值为例
举例
我们看一个例题:
解答:机翼断面轮廓是封闭曲线,我们对其上下线进行三次样条插值,matlab代码如下:
>> x0=[0,3,5,7,9,11,12,13,14,15];%已知的x的坐标构成的向量
>> y01=[0,1.8,2.2,2.7,3.0,3.1,2.9,2.5,2.0,1.6];%已知的y坐标上线
>> y02=[0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6];%已知的y坐标下线
>> x=0:0.1:15;%插值点x的坐标,每间隔0.1插一个值
>> ysp1=interp1(x0,y01,x,'spline');%spline表示三次样条插值方式
>> ysp2=interp1(x0,y02,x,'spline');
>> plot([x0,x0],[y01,y02],'o');%对于每个坐标点标一个圈
>> hold on;%等一下
>> plot(x,ysp1,'r',x,ysp2,'r');%画两条线
>> xlabel('X');%指明横坐标名称
>> ylabel('Y');%指明纵坐标名称
>> legend('插值节点','三次样条插值','location','northwest')%图例
然后再用上线减下线即可,matlab提供专门的函数
>> S=trapz(x,ysp1)-trapz(x,ysp2)
二维插值
网格插值
函数介绍
zi=interp2(x,y,z,xi,yi,‘method’)
z=meshgrid(x,y):用于生成二维表格
举例
看具体的例子吧
代码如下:
x = 100:100:500;
y = 100:100:400;
[X,Y] = meshgrid(x,y);%生成二维网格
Z = [450 478 624 697 636
420 478 630 712 698
400 412 598 674 680
310 334 552 626 662];
xd = 100:20:500;
yd = 100:20:400;
[Xd,Yd] = meshgrid(xd,yd);
figure;
Zd = interp2(X,Y,Z,Xd,Yd,'spline');%进行二维的三次样条插值
surf(Xd,Yd,Zd);%绘图
xlabel('X'); ylabel('Y'); zlabel('Z'); title('interp2')%指明三个坐标轴名称及标题
散点插值
函数介绍
griddata:
Zd = griddata(x,y,z,Xd,Yd);x,y和z是已知值,Xd,Yd是要插入的数据,Zd是得到的插值
xlsread:用于读取excel表格中的数据,返回的是一个矩阵
num=xlsread(filname):filname是文件名,用于读取该文件第一张表的数据
num=xlsread(filname,-1):和用户交互式读取
num=xlsread(filname,sheet):sheet表示读取第几张表
num=xlsread(filname,range):range表示单元格的范围
num=xlsread(filname,sheet,range):
x=linspace(x1,x2,n):x1是起始值,x2是结束值,n为元素的个数
举例
过程:
1 计算出插值点上的海拔高度和Cd元素浓度
2 绘制四维图,重金属浓度为第四维
代码如下:
xyz = xlsread('cumcm2011A.xls',1,'B4:D322');%读取sheet1的数据
Cd = xlsread('cumcm2011A.xls',2,'C4:C322');%读取sheet2的数据
x = xyz(:,1);%取出第一列的数据,即x
y = xyz(:,2);%取出第二列的数据,即y
z = xyz(:,3);%取出第三列的数据,即海拔
xd = linspace(min(x),max(x),60);
yd = linspace(min(y),max(y),60);
[Xd,Yd] = meshgrid(xd,yd);%生成网格矩阵
Zd = griddata(x,y,z,Xd,Yd);
Cd = griddata(x,y,Cd,Xd,Yd);
figure;
surf(Xd,Yd,Zd,Cd);
shading interp;
xlabel('X'); ylabel('Y'); zlabel('Z'); title('griddata');
colorbar;