- 插值算法的概念
- 一维插值问题
- 一般插值多项式的原理
- 拉格朗日插值法
- 牛顿插值法
- 埃尔米特插值法
- 分段 三次埃尔米特插值和分段三次样条插值(常用,附代码)
一、插值算法的概念
数学建模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有的时候现有的数据是极少的,不足以支撑分析的进行,这时候就需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足需求,这就是插值的作用。
二、一维插值问题
已知有
n
+
1
n+1
n
+
1
个节点
(
x
i
,
y
i
)
(
i
=
0
,
1
,
…
,
n
)
\text{(}x_i,y_i\text{)}\left( i=0,1,…\text{,}n \right)
(
x
i
,
y
i
)
(
i
=
0
,
1
,
…
,
n
)
其中
x
i
x_i
x
i
互不相同,不妨假设
a
=
x
0
<
x
1
<
…
<
x
n
=
b
a=x_0<x_1<…<x_n=b
a
=
x
0
<
x
1
<
…
<
x
n
=
b
,求任一插值点
x
∗
(
≠
x
i
)
x^*(\ne x_i)
x
∗
(
=
x
i
)
处的插值
y
i
y_i
y
i
思路:构造函数
y
=
f
(
x
)
y=f\left( x \right)
y
=
f
(
x
)
,使得
f
(
x
)
f\left( x \right)
f
(
x
)
过所有结点,求
f
(
x
∗
)
f\left( x^* \right)
f
(
x
∗
)
即可得到
y
∗
y^*
y
∗
三、一般多项式的插值原理
定理:设有
n
+
1
n+1
n
+
1
个互不相同的结点
(
x
i
,
y
j
)
(
i
=
0
,
1
,
2
,
…
,
n
)
\left( x_i,y_j \right) \left( i=0,1,2,…\text{,}n \right)
(
x
i
,
y
j
)
(
i
=
0
,
1
,
2
,
…
,
n
)
,则存在唯一的多项式:
使得:
L
n
(
x
j
)
=
y
j
(
j
=
0
,
1
,
2
,
…
,
n
)
L_n\left( x_j \right) =y_{j\,\,}\,\, \left( j=0,1,2,…\text{,}n \right)
L
n
(
x
j
)
=
y
j
(
j
=
0
,
1
,
2
,
…
,
n
)
注意:
-
只要
n+
1
n+1
n
+
1
个结点互异,满足上述插值条件的多项式是唯一存在的。 - 如果不限制多项式的系数,插值多项式并不唯一。
四、拉格朗日插值法
在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫.路易斯.拉格朗日命名的一种多项式插值方法。在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好可以在各个观测的点取到观测到的值。
-
两个点:
(x
0
,
y
0
)
,
(
x
1
,
y
1
)
\left( x_0,y_0 \right) ,\left( x_1,y_1 \right)
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
-
三个点:
(x
0
,
y
0
)
,
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
\left( x_0,y_0 \right) ,\left( x_1,y_1 \right) ,\left( x_2,y_2 \right)
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
-
四个点:
(x
0
,
y
0
)
,
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
(
x
3
,
y
3
)
\left( x_0,y_0 \right) ,\left( x_1,y_1 \right) ,\left( x_2,y_2 \right) ,\left( x_3,y_3 \right)
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
(
x
3
,
y
3
)
拉格朗日插值多项式中特别的函数:
由上述公式可得拉格朗日插值多项式为:
拉格朗日插值的缺点:高次插值会产生龙格现象,即在两端处波动极大,产生明显的震荡。在不熟悉曲线的运动趋势的前提下,不要轻易使用高次插值。
五、牛顿插值法
差商的定义:称
f
[
x
0
,
x
k
]
=
f
(
x
k
)
−
f
(
x
0
)
x
k
−
x
0
f\left[ x_0,x_k \right] =\frac{f\left( x_k \right) -f\left( x_0 \right)}{x_k-x_0}
f
[
x
0
,
x
k
]
=
x
k
−
x
0
f
(
x
k
)
−
f
(
x
0
)
为函数
f
(
x
)
f\left( x \right)
f
(
x
)
关于点
x
0
,
x
1
x_0,x_1
x
0
,
x
1
的一阶差商,也可以成为均差。
二阶差商:
f
[
x
0
,
x
1
,
x
2
]
=
f
[
x
1
,
x
2
]
−
f
[
x
0
,
x
1
]
x
2
−
x
0
f\left[ x_0,x_1,x_2 \right] =\frac{f\left[ x_1,x_2 \right] -f\left[ x_0,x_1 \right]}{x_2-x_0}
f
[
x
0
,
x
1
,
x
2
]
=
x
2
−
x
0
f
[
x
1
,
x
2
]
−
f
[
x
0
,
x
1
]
具体牛顿插值的多项式如下:
牛顿插值与拉格朗日插值比较
- 与拉格朗日插值法相比,牛顿插值法的计算过程具有继承性(牛顿插值法每次插值只和前n项的值有关,这样每次只要在原来函数上添加新的项,就能够产生新的插值函数),但牛顿插值也存在龙格现象。
- 这两种插值方法仅仅要求插值多项式在插值结点处与被插函数有相同的函数值,而这种插值多项式却不能全面反映被插函数的特性。在许多的实际问题中,不仅要求插值函数与被插函数在所有结点处有相同的函数值,它也需要在一个或者全部结点上插值多项式与被插函数具有相同的低阶甚至是高阶的倒数值。对于这样的要求,这两种插值方法都不能满足。
六、埃尔米特插值
这种插值方法不但要求节点上的函数值相等,而且要求对应的导数值也相等,甚至要求高阶导数也相等,满足这种要求的插值多项式就是埃尔米特插值多项式。
具体原理:
设函数
f
(
x
)
f\left( x \right)
f
(
x
)
在区间[a,b]上有n+1个互异节点
a
=
x
0
<
x
1
<
…
<
x
n
=
b
a=x_0<x_1<…<x_n=b
a
=
x
0
<
x
1
<
…
<
x
n
=
b
,定义在[a,b]上函数
f
(
x
)
f\left( x \right)
f
(
x
)
在节点上满足:
可唯一确定一个次数不超过2n+1的多项式
H
2
n
+
1
(
x
)
=
H
(
x
)
H_{2n+1}\left( x \right) =H\left( x \right)
H
2
n
+
1
(
x
)
=
H
(
x
)
满足:
其余项为:
七、分段三次埃尔米特插值和分段三次样条插值
分段三次埃尔米特插值
:直接使用埃尔米特插值得到的多项式次数较高,也存在龙格现象,因此在实际应用中,往往使用分段三次埃尔米特插值多项式(PCHIP)
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青
代码运行结果如下:
分段三次样条插值
:设
y
=
f
(
x
)
y=f\left( x \right)
y
=
f
(
x
)
在点
x
0
,
x
1
,
x
2
,
…
,
x
n
x_0,x_1,x_2,…,x_n
x
0
,
x
1
,
x
2
,
…
,
x
n
的值为
y
0
,
y
1
,
y
2
,
…
,
y
n
y_0,y_1,y_2,…,y_n
y
0
,
y
1
,
y
2
,
…
,
y
n
,若函数
S
(
x
)
S\left( x \right)
S
(
x
)
满足下列条件
-
S(
x
i
)
=
f
(
x
i
)
=
y
i
,
i
=
0
,
1
,
2
,
…
,
n
S\left( x_i \right) =f\left( x_i \right) =y_i,i=0,1,2,…,n
S
(
x
i
)
=
f
(
x
i
)
=
y
i
,
i
=
0
,
1
,
2
,
…
,
n
-
在每一个子区间
[x
i
,
x
i
+
1
]
(
i
=
0
,
1
,
2
,
…
,
n
−
1
)
\left[ x_i,x_{i+1} \right] \left( i=0,1,2,…,n-1 \right)
[
x
i
,
x
i
+
1
]
(
i
=
0
,
1
,
2
,
…
,
n
−
1
)
上
S(
x
)
S\left( x \right)
S
(
x
)
是三次多项式 -
S(
x
)
S\left( x \right)
S
(
x
)
在[a,b]上二阶连续可微
则称
S
(
x
)
S\left( x \right)
S
(
x
)
为函数
f
(
x
)
f\left( x \right)
f
(
x
)
的三次样条插值函数。
三次样条插值函数实例:
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’用来指定标注显示的位置
分析生成结果:可以看出,三次样条生成的曲线更加光滑。在实际建模中,由于我们不知道数据的生成过程,因此两种插值都可以使用。
注意点
:
- 上面学习的这些插值算法可用于短期预测。
- 在实际建模过程中,尽量不要使用插值算法来预测,如果要进行预测,可以选择下面更新的拟合算法或者一些专门用来预测的算法,这些都可以在接下来的更新中学习到。
更多有关于插值法的经典获奖论文,关注公众号,回复,“插值算法”,即可免费领取!!!