数据插值,拟合,方程求解的MATLAB实现


一.简介

在生产和科学实验中,自变量x与因变量y间的函数关系y=f(x)有时不能写成解析表达式的形式,而只能得到函数在若干点的函数值或导数值。有时表达式过于复杂而需要较大的计算量,从而只能计算函数在若干点的函数值或者导数值,当要求知道其它点的函数值时,需要估计函数在该点的值。
为了完成这样的任务,需要改造一个比较简单的函数y=φ(x),使该函数在观测点的值等于已知的值,或使函数在观测点的导数值等于或者接近已知的值,寻找这样的函数y=φ(x)有很多方法,根据测量数据的类型有以下处理观测数据的方法
(1): 测量数据的数据量较小并且数据值是准确的,或者基本没有误差的,这时一般用插值的方法来解决问题。
(2): 测量数据的数据量较大或者测量值与真实有误差,这时一般用拟合的方法来解决问题。


二.数据插值

1.实验数据的一维插值

已知离散点上的数据集 |(x1,y1),(x2,y2), … ,(xn,yn)|,即已知在点集 X=|x1,x2,…,xn| 上的函数值 Y=|y1,y2,…,yn|构造一个解析函数(其图形为一曲线)通过这些点,并能够求出这些点之间的值,这一过程称为一维插值。完成这一过程可以有多种方法,现在利用MATLAB提供的函数interp1,这个函数的调用格式为:
yi=interp1(X,Y,xi,method)
该命令用指定的算法找出一个一元函数y=f(x),然后以f(x)给出x处的值,xi可以是一个标量,也可以是一个标量,也可以是一个向量,是向量时,必须单调,即按下标从小到大的顺序各分量呈单调排列 .method 可以取下列方法之一:
‘nearest’:最近邻点插值,直接完成计算;
‘spline’:三次样条函数插值;
‘linear’:线性插值(缺省方式);
‘cubic’:三次函数插值。
对于[min{xi},max{xi}]外的值,MATLAB使用外推的方法计算数值。


例
:已知某产品从1900年到2020年每隔11年的产量为:75.995,91.972,105.711,123.203,131.699,150.697,150.697,179.323,203.212,226.505,249.633,计算出1995年的产量,用来三次样条插值的方法,画出每隔1年的插值曲线图形,同时将原始的数据画在同一图上。
解:程序如下

year=1900:11:2010;
product=[75.995,91.972,105.711,123.203,131.699,150.697,150.697,179.323,203.212,226.505,249.633]
p1995=interp1(year,product,1995,'spline')
x=1900:2010;
y=interp1(year,product,x,'spline');
plot(year,product,'o',x,y);

计算结果为:p1995=217.7756
如果用线性插值,则程序的后四行改为:

p1995=interp1(year,product,1995,'linear')
x=1900:2010;
y=interp1(year,product,x,'linear');
plot(year,product,'o',x,y);

计算结果为:p1995=218.0348
这两种计算方法得到的数据有微小的差异,这种差异从两个图形上也能够看到,主要表现在节点(那些绘制成圆点的点)的附近。前者是光滑的,后者有角点出现。
在这里插入图片描述
在这里插入图片描述


2.实验数据的二维插值

已知离散点上的数据集 |(x1,y1,z1),(x2,y2,z2),…,(xn,yn,zn)| ,即已知在点集 |(x1,y1),(x2,y2),…,(xn,yn)| 上的函数值 |z1,z2,…,zn| , 构造一个解析函数(其图形为一曲面)通过这些点,并能够求出这些已知点以外的点的函数值 ,这一过程成为二维插值
MATLAB命令:
Zi=interp2(X,Y,Z,Xi,Yi,method)
该命令用指定的算法找出一个二元函数z=f(x,y),然后以f(x,y)给出(x,y)处的值,返回数据矩阵Zi,Xi,Yi是向量,且必须单调,Zi和meshgrid(Xi,Yi)是同类型的,method可以采用下列方法之一:
‘nearest’:最近邻点插值,直接完成计算;
‘spline’:三次样条函数插值;
‘linear’:线性插值(缺省方式);
‘cubic’:三次函数插值。


:已知1950到1990年间每隔10年,服务年限从10到30年每隔10年的劳动报酬如表所示

年份\服务年限102030
1950150.697169.592187.652
1960179.323195.072250.287
1970203.212239.092322.767
1980226.505273.706426.730
1990249.633370.281598.243

试计算1975年时,15年工龄的工作人员平均工资。
解:程序如下:

year=1950:10:1990
service=10:10:30
wage=[150.697 169.592 187.652
	  179.323 195.072 250.287
	  203.212 239.092 322.767
	  226.505 273.706 426.730
	  249.633 370.281 598.243]
w=interp2(service,year,wage,15,1975)

计算结果为:235.6288
例:设有数据x=1,2,3,4,5,6,y=1,2,3,4,在由x,y构成的网格上的数据为:
12,10,11,11,13,15
16,22,28,35,27,20
18,21,26,32,28,25
20,25,30,33,32,20
求将网格细化为间隔为0.1的数据,并画出图形
解:程序为:

x=1:6
y=1:4
t=[12,10,11,11,13,15
	16,22,28,35,27,20
	18,21,26,32,28,25
	20,25,30,33,32,20]
subplot(1,2,1)
mesh(x,y,t)
x1=1:0.1:6;
y1=1:0.1:4;
[x2,y2]=meshgrid(x1,y1);
t1=interp2(x,y,t,x2,y2,'cubic');
subplot(1,2,2)
mesh(x1,y1,t1);

程序运行结果如下:
在这里插入图片描述
左图是给定的网格处的数据,右图是插值后的数据。


三.数据拟合

1.实验数据的拟合

已知的离散点上的数据集{(x1,y1),(x2,y2),…,(xn,yn)},即已知在点集{x1,x2,…,xn}上的函数值{y1,y2,…,yn}构造一个解析函数f(x)(其图形为一曲线),使f(x)在原离散点xi上的值尽可能接近给定的yi的值,这一构造函数f(x)的过程称为曲线拟合最常用的曲线拟合方法是最小二乘法,该方法时寻找函数f(x)使得M最小
在这里插入图片描述
在MATLAB中,有下面几个命令与拟合相关,它们的含义和调用方法:

p=polyfit(x,Y,n)
c=lsqeurvefit(fun,c0,x,y)

说明:polyfit求出已知数据x,Y的n阶拟合多项式f(x)的系数p,x,Y都是,x的分量必须是单调的。
lsqeurvefit(fun,c0,x,y)用作各种类型曲线的拟合,用最小二乘法寻找符合经验公式的最优曲线,可用于非线性函数的数据拟合


:求如下给定数据的拟合曲线。
x=[0.5,1.0,1.5,2.0,2.5,3.0]
y=[1.75,2.45,3.81,4.80,7.00,8.60]
解:MATLAB程序如下:

x=[0.5,1.0,1.5,2.0,2.5,3.0];
y=[1.75,2.45,3.81,4.80,7.00,8.60];
p=polyfit(x,y,2)
x1=0.5:0.05:3.0;
y1=polyval(p,x1);
plot(x,y,'*r',x1,y1,'-b')

计算结果为:
在这里插入图片描述
此结果表示拟合函数为:
f(x)=0.5614x2+0.8287x+1.1560
:给定下列数据:

X0.10.20.150-0.20.3
Y0.950.840.861.061.500.72

考虑这些数据用函数y=aebx的非线性拟合。
解:先将参数a,b合写为向量c,编写如下程序:

fun=inline('c(1)*exp(c(2)*x)','c','x');
x=[0.1,0.2,0.15,0,-0.2,0.3]
y=[0.95,0.84,0.86,1.06,1.50,0.72]
c=lsqcurvefit(fun,[0,0],x,y)
norm(feval(fun,c,x)-y)^2

其中[0,0]是初始值,最后一句是计算残差的平方和,也就是拟合函数在给定点的值和原始数据的差的平方和,运行结果为:
在这里插入图片描述
说明残差很小。
关于norm,其定义是:
在这里插入图片描述


四.方程和方程组

1.方程和方程组的求解

在MATLAB中,有函数 solve(),null(),fsolve() 等来解决线性方程(组)和非线性方程(组)的求解问题,其具体格式如下:

X=solve('eqn1','eqn2',...,'eqnN','varl1','varl2',...,'varlN')
X=fsovle(fun,x0,options)

函数solve用来解符号方程,方程组,以及超越方程,如三角函数方程等非线性方程,参数‘eqnN’为方程组中的第N个方程,‘varN’则是第N个变量。
函数null(A) 则用来解线性方程组AX=O的基础解系,实际是求系数矩阵A的零空间,在null函数中可加入参数‘r’,表示有理基,通过求系数矩阵的秩和增广矩阵的秩,可以判定方程组是否有解,以及是否需要求出基础解系。
另外,可以用x = fzero(fun,x0) 尝试求出 fun(x) = 0 的点 x。此解是 fun(x) 变号的位置 - fzero 无法求函数(例如 x^2)的根。


例:求解方程x2-x-6=0的MATLAB程序为:

X=solve(x^2-x-6==0,x)

运行结果为:
在这里插入图片描述


  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值