数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现

数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和 分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足需求,这就是插值的作用。

 简要介绍两种插值算法但并不常用的算法:

1.拉格朗日插值

左侧时已知两个数据点,对某个点x,求其对应y的公式;右侧是已知三个点时

数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第1张图片

2.牛顿插值

牛顿插值当新增一个数据点时,其对应的公式在原来的基础上增加一项

数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第2张图片

两种方法评价:与拉格朗日插值法相比,牛顿插值法的计算过程具有继承性。 (牛顿插值法每次插值只和前n的值有关,这样每次只要在原来 的函数上添加新的项,就能够产生新的函数) 但是牛顿插值也存在龙格现象的 问题。

 两种插值算法带来问题——龙格现象

例题1:

数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第3张图片

 

得到如图所示图像:由图可知,我们已知的这些数据点的分布是服从f(x)=1/(1+x^2),是图中红色的曲线,通过n次插值后的图像是蓝色的。当n从2到10取值时,在已知点的区间[-5,5]内,图像越来越接近原始红色曲线,当在区间的两端,这种波动偏离程度越来越大。

数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第4张图片

 

分析:高次插值会产生龙格现象,即在两端处波动极大,产生明显的震荡。在不熟悉曲线

运动趋势的前提下,不要轻易使用高次插值。

针对前两种插值多项式带来的龙格现象问题,引入解决方法——分段线性插值

3.分段线性插值

数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第5张图片

分段思想:假设已知数据点x0、xj-1、xj+1...Xn,求某个介于(X0,Xj-1)的点x'对应的值,先将已知相邻点构成一个线段,在线段种取x'对应的y'值。

前面介绍的三种插值法仅仅保证了在插值点处与被插函数有相等的函数值,而这种插值多项式却不能全面反映被插值函数的性态。 然而在许多实际问题中,不仅要求插值函数与被插值函数在所有节点处有相同的函数值,它也需要在一个或全部节点上插值多项式与被插函数有相同的低阶甚至高阶的导数值。对于这些情况,拉格朗日插值和牛顿插值都不能满足。

接下来介绍数学建模中最常用的插值算法,这里仅介绍其思想以及matlab使用方法:

4.分段三次埃尔米特插值

埃尔米特(Hermite)插值

不但要求在节点上的函数值相等,而且还要求对应的导数值也相等,甚至要求高阶导数也相等,满足这种要求的插值多项式就是埃尔米特插值多项式。

数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第6张图片

Matlab有内置的函数(实现过程已经帮我们封装好了,会调用就行了):

p = pchip(x,y, new_x)

x是已知的样本点的横坐标;y是已知的样本点的纵坐标;new_x是要插入处对应的横坐标

% 分段三次埃尔米特插值
x = -pi:pi; y = sin(x); 
new_x = -pi:0.1:pi;
p = pchip(x,y,new_x);
figure(1); % 在同一个脚本文件里面,要想画多个图,需要给每个图编号,否则只会显示最后一个图哦~
plot(x, y, 'o', new_x, p, 'r-')

% plot函数用法:
% plot(x1,y1,x2,y2) 
% 线方式: - 实线 :点线 -. 虚点线 - - 波折线 
% 点方式: . 圆点  +加号  * 星号  x x形  o 小圆
% 颜色: y黄; r红; g绿; b蓝; w白; k黑; m紫; c青

数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第7张图片

这里已知数据点用圆圈表示,通过分段三次埃尔米特插值得到的数据点用红色的实现连接起来。有图可知插值法得到的图像与原始图像sin(x)已经很接近。

接下来介绍另一种数学建模中常见的算法——三次样条插值

5.三次样条插值

数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第8张图片数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第9张图片

Matlab有内置的函数:

p = spline (x,y, new_x)

x是已知的样本点的横坐标;y是已知的样本点的纵坐标;new_x是要插入处对应的横坐标

% 三次样条插值和分段三次埃尔米特插值的对比
x = -pi:pi; 
y = sin(x); 
new_x = -pi:0.1:pi;
p1 = pchip(x,y,new_x);   %分段三次埃尔米特插值
p2 = spline(x,y,new_x);  %三次样条插值
figure(2);
plot(x,y,'o',new_x,p1,'r-',new_x,p2,'b-')
legend('样本点','三次埃尔米特插值','三次样条插值','Location','SouthEast')   %标注显示在东南方向
% 说明:
% LEGEND(string1,string2,string3, …)
% 分别将字符串1、字符串2、字符串3……标注到图中,每个字符串对应的图标为画图时的图标。
% ‘Location’用来指定标注显示的位置

数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第10张图片

可以看出,三次样条生成的曲线更加光滑。在实际建模中,由于我们不知道数据的生成过程,因此这两种插值都可以使用。

插值法用于预测:

例题2:根据过去10年的中国人口数据,预测接下来三年的人口数据:代码:

% 人口预测
population=[133126,133770,134413,135069,135738,136427,137122,137866,138639, 139538];
year = 2009:2018;
p1 = pchip(year, population, 2019:2021)  %分段三次埃尔米特插值预测
p2 = spline(year, population, 2019:2021) %三次样条插值预测
figure(4);
plot(year, population,'o',2019:2021,p1,'r*-',2019:2021,p2,'bx-')
legend('样本点','三次埃尔米特插值预测','三次样条插值预测','Location','SouthEast')

数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第11张图片数学建模——插值算法(分段三次埃尔米特插值、三次样条插值)思想及Matlab实现_第12张图片

你可能感兴趣的:(数学建模)