常用算法 插值算法

零、写在前面

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

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

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

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

一、作用

插值算法,预测模型。

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

二、算法

2.1介绍

设函数在上有定义,且定义域内存在n+1个点。

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

为插值节点,包含插值节点的称作插值区间,即。

求出的过程称之为插值法。

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-')

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-')

四、拓展: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')

posted @   coyy  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示