数学建模 插值和拟合

在实际问题中,我们往往只能获取有限的离散样本数据,而无法得到连续、完备的信息。

插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似的要求不同,二者在数学方法上是完全不同的。而面对一个实际问题,究竟应该用插值还是拟合,有时容易确定,有时则并不明显。

一、数据插值

在平面上给定一组离散点列,要求一条曲线,把这些点按次序连接起来,称为插值。

引例 - 零件加工问题

在飞机制造中,机翼的加工是一项关键技术。由于机翼尺寸很大,通常在图纸中只能标出一些关键点的数据。给出了某型飞机机翼的下缘轮廓线数据(代码中的x,y值),求每改变 0.1 时 y 的值。

% Matlab代码:
x = [0,3,5,7,9,11,12,13,14,15];
y = [0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6];
x1 = 0:0.1:15;  %插值点
y1 = interp1(x,y,x1,'spline');  %计算插值点在y方向上的值存入y1
plot(x1,y1)

插值函数如图红线所示:
在这里插入图片描述

1.1 数据插值的计算机制

从数学上来说,数据插值是一种函数逼近的方法。
我们认为样本点是从未知函数 y=f(x) 上采样而来,但 f(x) 未知我们无法计算新的点的函数值,所以构造函数 φ(x) 去逼近未知函数f(x),用构造函数 φ(x) 去估计新值。

1.2 数据插值的实现方法(Matlab)

一维插值函数 interp1()
调用格式:Y1 = interp1(X,Y,X1,method)
函数作用:根据X、Y的值,计算函数在X1处的值。

其中X、Y是两个等长的已知向量,分别表示采样点和采样值。X1是一个向量或标量,表示要插值的点。

method用于指定插值方法,常用的取值有以下四种:
(1) linear
线性插值,默认方法。将与插值点靠近的两个数据点用直线连接,然后在直线上选取对应插值点的数据。

(2) nearest
最近点插值。选择最近样本点的值作为插值数据。如果是中间点,则取后一个数据点的值。

(3) pchip
分段3次埃尔米特插值。采用分段三次多项式,除满足插值条件,还需满足在若干节点处相邻段插值函数的一阶导数相等,使得曲线光滑的同时,还具有保形性。

(4) spline
3次样条插值。每个分段内构造一个三次多项式,使其插值函数除满足插值条件外,还要求在各节点处具有连续的一阶和二阶导数。

许多工程技术中提出的计算问题对插值函数的光滑性有较高要求,不仅要连续,而且要有连续的曲率,这就导致了样条插值的产生。样条(Spline)本来是工程设计中使用的一种绘图工具,是富有弹性的细木条或细金属条。绘图员利用它把一些已知点连接成一条光滑曲线(称为样条曲线),并使连接点处有连续的曲率。三次样条插值就是由此抽象出来的。

零件加工问题用四种插值方法的效果如下:
在这里插入图片描述
另外需要注意,多项式次数并非越高越好。次数越高,越容易产生震荡而偏离原函数,这种现象称为龙格(Runge)现象。

四种方法的比较:
线性插值和最近点插值方法比较简单。其中线性插值方法的计算量与样本点n无关。n 越大,误差越小。
3次埃尔米特插值和3次样条插值都能保证曲线的光滑性。相比较而言,3次埃尔米特插值具有保形性;而3次样条插值要求其二阶导数也连续,所以插值函数的性态更好。

二维插值函数 interp2()
调用格式:调用格式:Z1=interp2(X,Y,Z,X1,Y1,method)
函数作用:根据 X、Y、Z 的值,计算函数在 (X1,Y1) 处的值。

其中,X、Y是两个向量,表示两个参数的采样点,Z是采样点对应的函数值。X1、Y1是两个标量或向量,表示要插值的点。

二、曲线拟合

例子-人口预测问题

人口增长是当今世界上都关注的问题,对人口增长趋势进行预测是各国普遍的做法。已知某国1790年到2010年间历次人口普查数据如下表所示,请预测该国2016年的人口数(2016年的实际数量为 323.1)

解决思路:找一个函数,去逼近这些数据,然后再根据找到的函数,计算预测点的值。

x = 1790:10:2010;
y = [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6, ...
    50.2, 63.0, 76.0, 92.0, 105.7, 122.8, 131.7,...
    150.7, 179.3, 203.2, 226.5, 248.7, 281.4, 308.7];
plot(x,y,'*')
p = polyfit(x,y,3)
polyval(p,2016) %预测2016年的数据结果为 327.0964,相对误差为1.24%
plot(x,y,'*',x,polyval(p,x))

拟合函数如图红线所示:
在这里插入图片描述

2.1 曲线拟合的原理

与数据插值类似,曲线拟合也是一种函数逼近的方法。
构造函数 g(x) 去逼近未知函数 f(x),使得误差
δi = g(xi) - f(xi) ( i=1,2,3,…,n)
在某种意义下达到最小。

两个问题:
(1)用什么类型的函数做逼近函数? 多项式函数
(2)误差最小到底怎么计算? 最小二乘法

最小二乘法(又称最小平方法)

一种数学优化技术,它通过最小化误差的平方和来寻找数据的最佳函数匹配。
设 p(x) 是一个多项式函数
且 ∑( p(xi) - yi )2 的值最小,则p(x)为原函数 y=f(x) 的逼近函数。

2.2 曲线拟合的实现方法(Matlab)

多项式拟合函数 polyfit()
函数功能:求得最小二乘拟合多项式系数。
调用格式:
(1) P=polyfit(X,Y,m)
(2) [P,S]=polyfit(X,Y,m)
(3) [P,S,mu]=polyfit(X,Y,m)
根据样本数据X和Y,产生一个m次多项式P及其在采样点误差数据S,mu是一个二元向量,mu(1)是 mean(X),而mu(2)是std(X)。

人口预测问题——分析2:分段拟合

上述人口预测问题中我们预测结果的相对误差为1.24%,那么是否有办法降低误差?
据研究,一个国家的人口增长具有如下特点:
(1)发展越平稳,人口增长越有规律。
(2)当经济发展到一定水平时,人口增长率反而下降。
换言之,在不同的经济发展水平,人口有不同的增长规律。
所以在人口增长数据的拟合上,应该将二战后至今这一时期的数据与以前的数据分开处理。

%分析2:分段拟合
x = 1950:10:2010;
y = [150.7, 179.3, 203.2, 226.5, 248.7, 281.4, 308.7];
p = polyfit(x,y,2) %改用二次多项式
plot(x,y,'*',x,polyval(p,x))
polyval(p,2016) %预测2016年的数据结果为 325.1696,误差降低

Note:
要对问题的背景进行详细的分析。
采样点并非越多越好,适当的时候,可以减少采样点,分段进行拟合。

例子-算法的参数优化问题

在群体智能优化算法的设计中,搜索行为具有一定的随机性,以免于陷入局部最优。但是,随机性参数的设置却是一个普遍性的难题。如果随机性过高,算法的多样性增加、但是难以收敛:若随机性太低,算法收敛速度快,但多样性降低,极有可能陷入局部最优。已知某算法随机性参数与多样性、收敛性的关系分别如 代码中的 x, y1, y2 所示,其中收敛性与多样性数据都已经转换为与算法性能相关的统一度量。现在算法的设计者既不愿意降低收敛性,又不愿意牺牲多样性,想要在两者之间取得一个平衡点。请问怎么确定随机性参数?其数据分布如图所示

x = 0.03:0.03:0.3
y1 = [0.01, 0.01, 0.02, 0.03, 0.06, 0.07, 0.13, 0.17, 0.25, 0.37]   %多样性
y2 = [0.85, 0.76, 0.68, 0.62, 0.56, 0.52, 0.49, 0.46, 0.43, 0.39]   %收敛性
plot(x,y1,'*',x,y2,'o')

在这里插入图片描述
问题分析:
随机性参数的增长导致多样性增加,收敛性降低。
两者同等重要,则取平衡点。
平衡点最佳位置是多样性和收敛性相等的地方。

解决方案:
第一步,分别对多样性和收敛性进行拟合,得到拟合曲线。
第二步,找到两曲线的交点。

p1 = polyfit(x,y1,2);   % 对多样性数据拟合函数多项式系数存入p1
p2 = polyfit(x,y2,2);   
p = p1 - p2;    % 找交点即求 p1 = p2 的根
xi = roots(p);  % 解得 xi = -1.14150.3162
xj = 0:0.03:0.36;
yj1 = polyval(p1,xj);
yj2 = polyval(p2,xj);
yi = polyval(p1,xi(2))  % 估值交点
plot(x,y1,'*',x,y2,'o',xj,yj1,xj,yj2,xi(2),yi,'rp');

在这里插入图片描述

三、插值与拟合的比较

相同点:

1、都属于函数逼近方法
2、都能进行数据估算

不同点:

1、实现方法不同
数据插值要求逼近函数经过样本点
曲线拟合不要求逼近函数经过样本点,只要求总体误差最小

2、结果形式不同
数据插值往往分段进行逼近,没有统一的逼近函数
曲线拟合用一个函数进行整体逼近,有确定的函数表达式

3、侧重点不同
数据插值一般用于样本区间内的插值计算
曲线拟合不仅可以估算区间内其他点的函数值,还可以预测时序数据的发展趋势,以及从统计数据中总结一般性经验

4、应用场合不同
如果样本数据为精确数据,适合采用数据插值方法
如果样本数据为统计数据或存在误差,适合用曲线拟合的方法

猜你喜欢

转载自blog.csdn.net/chengdong996/article/details/108194588