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

Posted 溯光_y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 各种插值方法的比较

备战数学建模18-数据插值和曲线拟合2

「Scipy」样条插值在数据可视化中的运用

如何在matlab中用样条函数平滑曲线

matlab怎么对曲线进行平滑啊?