Matlab中插值函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab中插值函数相关的知识,希望对你有一定的参考价值。

参考技术A MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,'method')

其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量, 'method'表示采用的插值方法,MATLAB提供的插值方法有几种: 'method'是最邻近插值, 'linear'线性插值; 'spline'三次样条插值; 'cubic'立方插值.缺省时表示线性插值。

注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。

例:在一 天24小时内,从零点开始每间隔2小时测得的环境温度数据分别为

12,9,9,10,18 ,24,28,27,25,20,18,15,13
问题:推测中午12点(即13点)时的温度.

功能 一维数据插值(表格查找)。该命令对数据点之间计算内插值。它找出一元函数f(x)在中间点的数值。其中函数f(x)由所给数据决定。
x:原始数据点
Y:原始数据点
xi:插值点
Yi:插值点

(1)yi = interp1(x,y,xi,method)

用指定的算法计算插值:
’nearest’:最近邻点插值,直接完成计算;
’linear’:线性插值(缺省方式),直接完成计算;
’spline’:三次样条函数插值。
’cubic’:该方法保留单调性与数据的外形;

功能 二维数据内插值
(1)ZI = interp2(X,Y,Z,XI,YI,method)
返回矩阵ZI,其元素包含对应于参量XI 与YI(可以是向量、或同型矩阵) 的元素, 即Zi(i,j) ←[Xi(i,j),yi(i,j)]。用户可以输入行向量和列向量Xi 与Yi,此时,输出向量Zi 与矩阵meshgrid(xi,yi)是同型的。
(2)ZI = interp2(Z,XI,YI)
缺省地,X=1:n、Y=1:m,其中[m,n]=size(Z)。再按第一种情形进行计算。

用指定的算法method 计算二维插值:
’linear’:双线性插值算法(缺省算法);
’nearest’:最临近插值;
’spline’:三次样条插值;
’cubic’:双三次插值。

(4)VI = interp3(X,Y,Z,V,XI,YI,ZI,method)
找出由参量X,Y,Z决定的三元函数V=V(X,Y,Z)在点(XI,YI,ZI)的值。
%用指定的算法method 作插值计算:
‘linear’:线性插值(缺省算法);
‘cubic’:三次插值;
‘spline’:三次样条插值;
‘nearest’:最邻近插值。

功能 数据格点
(1)ZI = griddata(x,y,z,XI,YI,method)
用二元函数z=f(x,y)的曲面拟合有不规则的数据向量x,y,z。griddata 将返回曲面z 在点(XI,YI)处的插值。曲面总是经过这些数据点(x,y,z)的输入参量(XI,YI)通常是规则的格点(像用命令meshgrid 生成的一样)。

用指定的算法method 计算:
‘linear’:基于三角形的线性插值(缺省算法);
‘cubic’: 基于三角形的三次插值;
‘nearest’:最邻近插值法;
‘v4’:MATLAB 4 中的griddata 算法。

功能 三次样条数据插值
格式
(1)yy = spline(x,y,xx)

功能 生成用于画三维图形的矩阵数据
格式 [X,Y] = meshgrid(x,y) 将由向量x,y(可以是不同方向的)指定的区域[min(x),max(x) , min(y) , max(y)] 用直线x=x(i),y=y(j) ( i=1,2,…,length(x) ,j=1,2,…,length(y))进行划分。这样,得到了length(x)*length(y)个点,
这些点的横坐标用矩阵X 表示,X 的每个行向量与向量x 相同;这些点的纵坐标用矩阵Y 表示,Y 的每个列向量与向量y 相同。其中X,Y可用于计算二元函数z=f(x,y)与三维图形中xy 平面矩形定义域的划分或曲面作图。

[X,Y] = meshgrid(x) %等价于[X,Y]=meshgrid(x,x)。
[X,Y,Z] = meshgrid(x,y,z) %生成三维阵列X,Y,Z,用于计算三元函数v=f(x,y,z)或三维容积图。

MATLAB中的一维插值与函数拟合

本文主要记录Matlab中常用的一维插值与函数拟合的使用方法


前言

最近在学习数学建模,这部分关于怎么使用Matlab,刚好记录下来,做电赛的时候这些常用的插值、拟合工具也是需要学习的,刚开始学,写的不好,欢迎大家批评指正。


以下是本篇文章正文内容

一、一维插值

用MATLAB软件求解插值问题
在MATLAB中提供了一个一维插值函数interp1, 它的调用格式为
cy=interp1(x , y , cx , ‘method’)
其中x、y是所给数据的横纵坐标,要求x的分量按升序或降序排列,cx是待求的插值点的横坐标,返回值cy是待求的插值点的纵坐标,method是插值方法, 该函数提供了四种可选的插值方法:

  1. nearest——最邻近点插值。 点和这两已知点间位置的远近来进行插值,取较近已知 它根据已知两点间的插值 插值点处的函数值作为未知插值点处的函数值。
  2. linear——线性插值。它将相邻的数据点用直线相连, 按所生成的直线进行插值。
  3. spline——三次样条插值。它利用已知数据求出样条 函数后,按样条函数进行插值。
  4. cubic——三次插值。它利用已知数据求出三次多项式 函数后,按三次多项式函数进行插值。(在我的Matlab2019b中名为pchip)
    缺省时插值方法为分段线性插值。

下面用该函数来求解下列插值问题。
对于下面给定的4组数据,求在x=110处 y的值。

xy
10010
12111
14412
16913

很明显,我们可以看出这组数据符合函数y=sqrt(x);
我们用科学计算器得到一个解cy*=10.4880。
接下来我们使用Matlab进行插值计算:
输入命令:

x=[100 121 144 169]; 
y=[10 11 12 13]; 
cx=110; 
cy1=interp1(x,y,cx,'nearest');
cy2=interp1(x,y,cx,'linear');
cy3=interp1(x,y,cx,'pchip');
cy4=interp1(x,y,cx,'spline');

运行结果依次为 cy1 = 10、cy2 =10.4762、cy3 = 10.4869、cy4 = 10.4877 通过比较cy* = 10.4880,显然三次样条插值的结果最好。

二、函数拟合

2.1 多项式拟合

将数据点按多项式的形式进行拟合,使用最小二乘法可以确定多项式的系数,多项式拟合有指令语句和图形窗口两种方法。

2.1.1多项式拟合指令

polyfit(X,Y,N):多项式拟合,返回降幂排列的多项式系数。
polyval(P,xi):计算多项式的值。
其中,X,Y是数据点的值;N是拟合的最高次幂;P是返回的多项式系数;xi是要求点的横坐标。
例如对下面的数据进行多项式拟合。

x123456789
y9763-125720

拟合的命令如下:

x = [1 2 3 4 5 6 7 8 9];
y = [9 7 6 3 -1 2 5 7 20];
P = polyfit(x,y,3);
xi = 0:0.2:10;
yi = polyval(P,xi);
plot(xi,yi,x,y,'r*');

得到的拟合曲线与原始数据的对照如图

2.1.2 图形窗口的多项式拟合

在图形窗口可以用菜单方式对数据进行简单、快速、搞笑的拟合。与2.1.1数据相同,先画出数据点:

x = [1 2 3 4 5 6 7 8 9];
y = [9 7 6 3 -1 2 5 7 20];
plot(x,y,'r*');

然后在图形窗口单击Tools(工具)->Basic Fitting(基本拟合),打开对话框,并按下图进行操作,其中分别用线性、二阶、三阶对数据进行了多项式拟合,下面的柱状图显示残差,可以看出,进行三阶多项式拟合的效果是最好的,与前述结果一样。

2.2 指定函数拟合

在Matlab中也可以用用户自定义的函数进行拟合。通过下面的例子可以了解用指定函数进行数据拟合的基本方法。

x00.41.222.83.64.45.267.289.210.411.612.413.614.415
y10.850.29-0.27-0.53-0.4-0.120.170.280.15-0.03-0.15-0.0710.0590.080.032-0.015-0.02

在Matlab中先用命令画出上述的散点图:

x = [0 0.4 1.2 2 2.8 3.6 4.4 5.2 6 7.2 8 9.2 10.4 11.6 12.4 13.6 14.4 15];
y = [1 0.85 0.29 -0.27 -0.53 -0.4 -0.12 0.17 0.28 0.15 -0.03 -0.15 -0.071 0.059 0.08 0.032 -0.015 -0.02];
plot(x,y,'r*');


知道其对应的函数形式为 f ( t ) = a c o s ( k t ) e w t f(t) = acos(kt)e^{wt} f(t)=acos(kt)ewt,则可用Matlab进行拟合,程序如下:

syms t
x = [0;0.4;1.2;2;2.8;3.6;4.4;5.2;6;7.2;8;9.2;10.4;11.6;12.4;13.6;14.4;15];
y = [1;0.85;0.29;-0.27;-0.53;-0.4;-0.12;0.17;0.28;0.15;-0.03;-0.15;-0.071;0.059;0.08;0.032;-0.015;-0.02];
f = fittype('a*cos(k*t)*exp(w*t)','independent','t','coefficients',{'a','k','w'});
cfun = fit(x,y,f);
xi = 0:0.1:20;
yi = cfun(xi);
plot(x,y,'r*',xi,yi,'b-');

运行结果如图:

参考资料

《MATLAB在数学建模中的应用》卓金武《北京航空航天大学出版社》 , 2011.4


有用的话点个赞吧!

以上是关于Matlab中插值函数的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中的一维插值与函数拟合

MATLAB中的一维插值与函数拟合

如何用MATLAB 编写interpl插值函数

多项式函数插值:全域多项式插值单项式基插值拉格朗日插值牛顿插值 [MATLAB]

matlab 各种插值方法的比较

Matlab使用带结构参数的函数进行插值