常用算法 插值算法

零、写在前面

本文主要讲述三次Hermite插值和三次样条插值。

对于一维插值算法没有详细介绍,只是说明了彼此之间的区别和特点,并作出选择。

随后拓展了n维插值算法,只作为了解。

最后,由于插值算法本身的特性,其也可以用来预测。

一、作用

插值算法,预测模型。

在建模过程中,需要一定量的数据作为分析的支撑,但有时数据较少,此时便需要使用一些数学手段,模拟产生一些可靠的新数据来满足需求。

二、算法

2.1介绍

设函数y=f(x)[a,b]上有定义,且定义域内存在n+1个点\left ( x_{0},y_{0} \right ),\left ( x_{1} ,y_{1}\right )...\left ( x_{n} ,y_{n}\right )

P(x)恰好穿过n+1个点,则称其为插值函数,不难发现,插值函数不唯一。

x_{0},x_{1}...x_{n}为插值节点,包含插值节点的称作插值区间,即[a,b]

求出P(x)的过程称之为插值法。

2.2详细讲述一维插值法

2.2.1runge现象(一切问题的本源)

runge现象,是指高次插值函数在边界部分会出现震荡现象,其原因是次数太高会放大误差。

2.2.2插值法的分类

拉格朗日插值,牛顿插值,分段插值,埃尔米特插值(Hermite),分段三次埃尔米特插值,三次样条插值。

2.2.3插值法的选择

其中建模过程中常用的是分段三次埃尔米特插值和三次样条插值。

Q:这时候就有人要问了,作者作者,为什么是这样啊?

A:首先,所有的高次插值函数都会发生runge现象,这样大规模的震荡是我们不希望看到的。

Q:哪些插值法会发生runge现象?

A:拉格朗日,牛顿,埃尔米特都会发生runge现象,因为他们本质是多项式插值函数,都是高次的,这三个插值法的表达式和原理我这里不展开讲,因为用不上。

Q:那么怎么避免发生runge现象?

A:runge现象发生在边界,边界越宽,震荡幅度越大,那么我们把边界变小,那就是分段插值了,与其说分段插值是插值法,更不如说是一种思想,就是把插值区间切成很多小段,大幅度缓解runge现象,然后在这些小段上放上合适的函数。所以分段插值是解决runge现象的一个好办法。

Q:为什么只有分段的埃尔米特插值(即分段三次埃尔米特插值),没有分段拉格朗日插值和分段牛顿插值?

A:事实上也有分段拉格朗日插值和分段牛顿插值,但是为什么不说,本质上是这俩插值是不够完美的。因为拉格朗日插值和牛顿插值是源于函数值的,就是零阶导数,这两个插值法只关注零阶导数,但对变化趋势,即一阶导数是欠缺考虑的。而埃尔米特插值法受到了零阶导数和一阶导数的约束,如此得到的插值函数是保留被插值函数的性态(可以肤浅的理解为一阶导数)的,更接近完美,当然不是完美本身。所以我们在建模过程中会使用分段三次埃尔米特插值。

Q:什么是三次样条插值?

A:是分段三次埃尔米特插值+在插值区间上二阶连续可微,其本质是三次多项式。由于多加了一个二阶连续可微的条件,所以三次样条插值是比分段三次埃尔米特插值更接近完美的存在。

S:总结

客观出现runge现象,为了缓解runge现象,我们提出使用分段插值,分段插值具体要和哪个插值法结合,为了保留被插值函数的性态,我们使用埃尔米特插值,因为它保留了被插值函数的一阶导数。

三、代码

3.1分段三次埃尔米特插值

%MATLAB内置函数
%分段三次Hermite插值多项式PCHIP

p = pchip(x,y,new_x)
%x已知样本点的横坐标  y已知样本点的纵坐标 new_x要插入处对应的横坐标

%eg:
x = -pi:pi;%不写步长默认1为步长,所以,-pi:pi=-pi:1:pi
y =  sin(x);
new_x = -pi:0.1:pi;  %0.1是步长
p = pchip(x,y,new_x);
plot(x,y,'o',new_x,p,'r-')

输出如下,是PCHIP由几个散点得出的插值函数:

圈圈是函数sin(x)的几个散点,红色曲线是PCHIP的拟合结果,肉眼可见的,插值函数非常接近被插值函数。

如果读者肉眼不可见的话,下图是插值函数和被插值函数的对比图:

3.2三次样条插值

%MATLAB内置函数
%三次样条插值spline
p = spline(x,y,new_x)
%x已知样本点的横坐标  y已知样本点的纵坐标 new_x要插入处对应的横坐标

%eg:
x = -pi:pi;%不写步长默认1为步长,所以,-pi:pi=-pi:1:pi
y =  sin(x);
new_x = -pi:0.1:pi;  %0.1是步长
p = spline(x,y,new_x);
plot(x,y,'o',new_x,p,'r-')

输出如下,肉眼可见的几乎完美啊。

下图,比较spline、pchip和被插值函数。

红色的是pchip、蓝色是spline、绿色是被插值函数。

四、拓展:n维插值算法(了解)

4.1代码

p =  interpn(x1,x2,...,xn,y,new_x1,new_x2,...,new_xn,'methond')
%x1,x2,...,xn是已知样本点的横坐标
%y是已知的样本点的纵坐标
%new_x1,new_x2,...,new_xn是要插入点的横坐标
%method是待选择的插值方法
%linear线性插值,默认选项
%cubic三次插值
%spline三次样条插值(最优选)
%nearest最邻近插值

五、用于预测(创新)

前面在“一、作用”处提到过插值算法是用来模拟产生一些可靠的新数据来满足需求的,其实也就是预测嘛。

事实上,三次样条插值算法比灰色预测在理论上更完美。

% 人口预测
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;
plot(year, population,'o',2019:2021,p1,'r*-',2019:2021,p2,'bx-')
legend('样本点','三次埃尔米特插值预测','三次样条插值预测','Location','SouthEast')

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值