matlab图片插值数据_matlab插值与曲线拟合

本文详细介绍了在MATLAB中如何进行一维和二维插值,包括最近邻点插值、三次样条插值和线性插值等方法,并通过实例展示了插值的具体应用。此外,还探讨了曲线拟合的概念,使用polyfit函数进行多项式拟合,并给出了不同阶数拟合的示例,强调了不是拟合阶数越高效果越好。
摘要由CSDN通过智能技术生成

在生产和科学实验中,自变量

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

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

(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 5 5.5

6

海拔高度数据为:

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

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 94 92 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.5

2]

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.7295 11.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.0114 0.1814

-1.8065 11.2360

Columns 8 through 11

-42.0861 88.5907 -92.8155 40.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数据实现三维插值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值