matlablingo程序代码6插值拟合.docx
《matlablingo程序代码6插值拟合.docx》由会员分享,可在线阅读,更多相关《matlablingo程序代码6插值拟合.docx(9页珍藏版)》请在冰豆网上搜索。
![matlablingo程序代码6插值拟合.docx](https://file1.bdocx.com/fileroot1/2023-8/16/07a73c12-1407-4fcd-8c3a-1c1f48dc0f83/07a73c12-1407-4fcd-8c3a-1c1f48dc0f831.gif)
matlablingo程序代码6插值拟合
MATLAB插值、拟合与编程
相关知识
在生产和科学实验中,自变量与因变量间的函数关系有时不能写出解析表达式,而只能得到函数在若干点的函数值或导数值,或者表达式过于复杂而需要较大的计算量。
当要求知道其它点的函数值时,需要估计函数值在该点的值。
为了完成这样的任务,需要构造一个比较简单的函数,使函数在观测点的值等于已知的值,或使函数在该点的导数值等于已知的值,寻找这样的函数有很多方法。
根据测量数据的类型有以下两类处理观测数据的方法。
(1)测量值是准确的,没有误差,一般用插值。
(2)测量值与真实值有误差,一般用曲线拟合。
在MATLAB中,无论是插值还是拟合,都有相应的函数来处理。
一、插值
1、一维插值:
已知离散点上的数据集,即已知在点集X=上的函数值Y=,构造一个解析函数(其图形为一曲线)通过这些点,并能够求出这些点之间的值,这一过程称为一维插值。
MATLAB命令:
yi=interp1(X,Y,xi,method)
该命令用指定的算法找出一个一元函数,然后以给出处的值。
xi可以是一个标量,也可以是一个向量,是向量时,必须单调,method可以下列方法之一:
‘nearest’:
最近邻点插值,直接完成计算;
‘spline’:
三次样条函数插值;
‘linear’:
线性插值(缺省方式),直接完成计算;
‘cubic’:
三次函数插值;
对于[min{xi},max{xi}]外的值,MATLAB使用外推的方法计算数值。
例1:
已知某产品从1900年到2010年每隔10年的产量为:
75.995,91.972,105.711,123.203,131.699,150.697,179.323,203.212,226.505,249.633,256.344,267.893,计算出1995年的产量,用三次样条插值的方法,画出每隔一年的插值曲线图形,同时将原始的数据画在同一图上。
解:
程序如下
year=1900:
10:
2010;
product=[75.995,91.972,105.711,123.203,131.699,150.697,179.323,203.212,226.505,249.633,256.344,267.893]
p1995=interp1(year,product,1995)
x=1900:
2010;
y=interp1(year,product,x,'cubic');
plot(year,product,'o',x,y);
计算结果为:
p1995=252.9885。
2、二维插值
已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲面)通过这些点,并能够求出这些已知点以外的点的函数值,这一过程称为二维插值。
MATLAB函数:
Zi=interp2(X,Y,Z,Xi,Yi,method)
该命令用指定的算法找出一个二元函数,然后以给出处的值。
返回数据矩阵,Xi,Yi是向量,且必须单调,和meshgrid(Xi,Yi)是同类型的。
method可以下列方法之一:
‘nearest’:
最近邻点插值,直接完成计算;
‘spline’:
三次样条函数插值;
‘linear’:
线性插值(缺省方式),直接完成计算;
‘cubic’:
三次函数插值;
例2:
已知1950年到1990年间每隔10年,服务年限从10年到30年每隔10年的劳动报酬表如下:
表:
某企业工作人员的月平均工资(元)
服务年限
年份
10
20
30
1950
150.697
169.592
187.652
1960
179.323
195.072
250.287
1970
203.212
239.092
322.767
1980
226.505
273.706
426.730
1990
249.633
370.281
598.243
试计算1975年时,15年工龄的工作人员平均工资。
解:
程序如下:
years=1950:
10:
1990;
service=10:
10:
30;
wage=[150.697169.592187.652
179.323195.072250.287
203.212239.092322.767
226.505273.706426.730
249.633370.281598.243];
mesh(service,years,wage)%绘原始数据图
w=interp2(service,years,wage,15,1975);%求点(15,1975)处的值
计算结果为:
235.6288
例3:
设有数据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
求通过这些点的插值曲面。
解:
程序为:
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);
结果如右图。
作业:
已知某处山区地形选点测量坐标数据为:
x=00.511.522.533.544.55
y=00.511.522.533.544.555.56
海拔高度数据为:
z=8990878592919693908782
9296989995918986848284
9698959290888584838185
8081828995969392898686
8285879899969788858283
8285899495939291868488
8892939495898786838192
9296979896939584828184
8585818280808185909395
8486819899989796958487
8081858283848790958688
8082818485868382818082
8788899899979698949287
1、 画出原始数据图;
2、 画出加密后的地貌图,并在图中标出原始数据
二、拟合
曲线拟合
已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接近给定的值,这一过程称为曲线拟合。
最常用的曲线拟合方法是最小二乘法,该方法是寻找函数使得最小。
MATLAB函数:
p=polyfit(x,y,n)
[p,s]=polyfit(x,y,n)
说明:
x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p。
x必须是单调的。
矩阵s用于生成预测值的误差估计。
(见下一函数polyval)
多项式曲线求值函数:
polyval()
调用格式:
y=polyval(p,x)
[y,DELTA]=polyval(p,x,s)
说明:
y=polyval(p,x)为返回对应自变量x在给定系数P的多项式的值。
[y,DELTA]=polyval(p,x,s)使用polyfit函数的选项输出s得出误差估计YDELTA。
它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。
则YDELTA将至少包含50%的预测值。
例5:
求如下给定数据的拟合曲线,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')
计算结果为:
p=0.56140.82871.1560
此结果表示拟合函数为:
,用此函数拟合数据的效果如图所示。
例2:
由离散数据
x
0
.1
.2
.3
.4
.5
.6
.7
.8
.9
1
y
.3
.5
1
1.4
1.6
1.9
.6
.4
.8
1.5
2
拟合出多项式。
程序:
x=0:
.1:
1;
y=[.3.511.41.61.9.6.4.81.52]
n=3;
p=polyfit(x,y,n)
xi=linspace(0,1,100);
z=polyval(p,xi);%多项式求值
plot(x,y,’o’,xi,z,’k:
’,x,y,’b’)
legend(‘原始数据’,’3阶曲线’)
结果:
p=
16.7832-25.745910.9802-0.0035
多项式为:
16.7832x3-25.7459x2+10.9802x-0.0035
曲线拟合图形:
也可由函数给出数据。
例3:
x=1:
20,y=x+3*sin(x)
程序:
x=1:
20;
y=x+3*sin(x);
p=polyfit(x,y,6)
xi=linspace(1,20,100);
z=polyval(p,xi);%¶àÏîʽÇóÖµº¯Êý
plot(x,y,'o',xi,z,'k:
',x,y,'b')
结果:
p=
0.0000-0.00210.0505-0.59713.6472-9.729511.3304
再用10阶多项式拟合
程序:
x=1:
20;
y=x+3*sin(x);
p=polyfit(x,y,10)
xi=linspace(1,20,100);
z=polyval(p,xi);
plot(x,y,'o',xi,z,'k:
',x,y,'b')
结果:
p=
Columns1through7
0.0000-0.00000.0004-0.01140.1814-1.806511.2360
Columns8through11
-42.086188.5907-92.815540.267
可用不同阶的多项式来拟合数据,但也不是阶数越高拟合的越好。
作业:
1.已知x=[0.1,0.8,1.3,1.9,2.5,3.1],y=[1.2,1.6,2.7,2.0,1.3,0.5],利用其中的部分数据,分别用线性函数插值,3次函数插值,求x=2.0处的值。
2.已知二元函数在点集上的值为,其中,左上角位置表示,右下角位置表示,求该数据集的插值曲面。
3.已知x=[1.2,1.8,2.1,2.4,2.6,3.0,3.3],y=[4.85,5.2,5.6,6.2,6.5,7.0,7.5],求对x,y分别进行4,5,6阶多项式拟合的系数,并画出相应的图形。
4.学习函数interp3(X,Y,Z,V,X1,Y1,Z1,method),对MATLAB提供的flow数据实现三维插值