数学建模常用Matlab/Lingo/c代码总结系列——插值拟合

时间:2022-09-16 06:45:30
相关知识

在生产和科学实验中,自变量 与因变量 间的函数关系 有时不能写出解析表达式,而只能得到函数在若干点的函数值或导数值,或者表达式过于复杂而需要较大的计算量。当要求知道其它点的函数值时,需要估计函数值在该点的值。

为了完成这样的任务,需要构造一个比较简单的函数 ,使函数在观测点的值等于已知的值,或使函数在该点的导数值等于已知的值,寻找这样的函数 有很多方法。根据测量数据的类型有以下两类处理观测数据的方法。

(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.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];

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=0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5

y=0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 55.5 6

海拔高度数据为:

z=89 90 87 85 92 91 96 93 90 8782

92 96 98 99 95 91 89 86 84 82 84

96 98 95 92 90 88 85 84 83 81 85

80 81 82 89 95 96 93 92 89 86 86

82 85 87 98 99 96 97 88 85 82 83

82 85 89 94 95 93 92 91 86 84 88

88 92 93 94 95 89 87 86 83 81 92

92 96 97 98 96 93 95 84 82 81 84

85 85 81 82 80 80 81 85 90 93 95

84 86 81 98 99 98 97 96 95 84 87

80 81 85 82 83 84 87 90 95 86 88

80 82 81 84 85 86 83 82 81 80 82

87 88 89 98 99 97 96 98 9492 87


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得出误差估计Y DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。则Y DELTA将至少包含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.5614  0.8287 1.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 .5 1 1.4 1.6 1.9 .6 .4 .8 1.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.7459 10.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.0021 0.0505 -0.5971 3.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 =

Columns 1 through 7

0.0000 -0.0000 0.0004 -0.01140.1814 -1.8065 11.2360

Columns 8 through 11

-42.0861 88.5907 -92.8155 40.267


可用不同阶的多项式来拟合数据,但也不是阶数越高拟合的越好。