数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足需求,这就是插值的作用。
插值的定义
设函数
y
=
f
(
x
)
y=f(x)
y=f(x)在区间[a,b]上有定义,且已知在点
a
≤
x
0
≤
x
1
≤
⋯
≤
x
n
≤
b
a \leq x_0 \leq x_1 \leq \cdots \leq x_n\leq b
a≤x0≤x1≤⋯≤xn≤b
上的值分别为:
y
0
,
y
1
,
⋯
,
y
n
,
y_0,y_1,\cdots,y_n,
y0,y1,⋯,yn,
若存在一个简单的函数
p
(
x
)
p(x)
p(x),使
P
(
x
i
)
=
y
i
,
(
i
=
0
,
1
,
2
⋯
,
n
)
P(x_i)=y_i,(i=0,1,2 \cdots ,n)
P(xi)=yi,(i=0,1,2⋯,n)
则称
P
(
x
)
P(x)
P(x)为
f
(
x
)
f(x)
f(x)的插值函数,点
x
0
,
x
1
,
⋯
,
x
n
x_0,x_1,\cdots,x_n
x0,x1,⋯,xn称为插值节点,闹含插值节点的区间
[
a
,
b
]
[a,b]
[a,b]称为插值区间,求插值函数
P
(
x
)
P(x)
P(x)的方法称为插值法。
插值的分类
- 若
P
(
x
)
P(x)
P(x)是次数不超过
n
n
n的代数多项式,即
P ( x ) = a 0 + a 1 x + ⋯ + a n x n P(x)=a_0+a_1x+ \cdots +a_nx^n P(x)=a0+a1x+⋯+anxn - 若 P ( x ) 为 分 段 多 项 式 , 就 成 为 分 段 插 值 。 P(x)为分段多项式,就成为分段插值。 P(x)为分段多项式,就成为分段插值。
- 若 P ( x ) 为 三 角 多 项 式 , 就 成 为 三 角 插 值 P(x)为三角多项式,就成为三角插值 P(x)为三角多项式,就成为三角插值
一般插值多项式的原理
定理 设有
n
+
1
n+1
n+1个互不相同的节点
(
x
I
,
y
i
)
(
i
=
0
,
1
,
2
,
.
.
.
n
)
(x_I,y_i) (i=0,1,2,...n)
(xI,yi)(i=0,1,2,...n)
则存在唯一的多项式:
L
n
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
.
.
+
a
n
x
n
L_n(x)=a_0+a_1x+a_2x^2+..+a_nx^n
Ln(x)=a0+a1x+a2x2+..+anxn
使得
L
n
(
x
j
)
=
y
j
(
j
=
0
,
1
,
2
,
.
.
.
n
)
L_n(x_j)=y_j (j=0,1,2,...n)
Ln(xj)=yj(j=0,1,2,...n)
构造方程组
拉格朗日插值法
在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测点渠道观测到的值
两个点:
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
(x_0,y_0),(x_1,y_1)
(x0,y0),(x1,y1)
f
(
x
)
=
x
−
x
1
x
0
−
x
1
y
0
+
x
−
x
0
x
1
−
x
0
y
1
f(x)=\frac{x-x_1}{x_0-x_1}y_0+\frac{x-x_0}{x_1-x_0}y1
f(x)=x0−x1x−x1y0+x1−x0x−x0y1
同理三个点:
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
(
x
1
,
y
2
)
(x_0,y_0),(x_1,y_1)(x_1,y_2)
(x0,y0),(x1,y1)(x1,y2)
f
(
x
)
=
(
x
−
x
1
)
(
x
−
x
2
)
(
x
0
−
x
1
)
(
x
0
−
x
2
)
y
0
+
(
x
−
x
0
)
(
x
−
x
2
)
(
x
1
−
x
0
)
(
x
1
−
x
2
)
y
1
+
(
x
−
x
0
)
(
x
−
x
1
)
(
x
2
−
x
0
)
(
x
2
−
x
1
)
y
2
f(x)=\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}y_0+\frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}y_1+\frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}y_2
f(x)=(x0−x1)(x0−x2)(x−x1)(x−x2)y0+(x1−x0)(x1−x2)(x−x0)(x−x2)y1+(x2−x0)(x2−x1)(x−x0)(x−x1)y2
龙格现象
高次插值会产生龙格现象 ,即在两端处波动极大,产生明显的震荡。在不熟悉曲线运动趋势的前提下,不要轻易使用高次插值。
分段线性插值
因为插值多项式次数越高摄入误差可能显著增大,且插值多项式次数高精度未必显著提高
因此采用分段低次插值是一种办法
分段二次插值
牛顿插值法
与拉格朗日插值法相比,牛顿插值法具有继承性。(牛顿插值法每次插值只有和前n项的值有关,这样每次只要在原来的函数上添加新的项,就能过产生新的函数)
但是牛顿插值法也存在龙格现象的问题
两种插值法的另一个却点
上面讲的两种插值仅仅要求插值多项式在插值节点处与被插函数有相等的函数值,而这种插值多项式却**不能全面反映被插值函数的性态。**然而在许多实际问题中,不仅要求插值函数与被插值函数在所有节点处有相同的函数值,它也需要在一个或全部节点上插值多项式与被插函数有相同的低阶甚至高阶的导数值。
对于这些情况,拉格朗日插值和牛顿插值都不能满足。
Hermite插值法
不但要求在节点上的函数值相等,而且还要求对应的导数值也相等,甚至要求高阶导数也相等,满足这种要求的插值多项式就是Hermite 插值多项式
原理
分段三次Hermite插值
直接使用Hermite插值得到的多项式次数较高,也存在着龙格现象,因此在实际使用中,往往分段三次Hermite插值多项式(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);
三次样条插值
原理不用太深究,会用就好。。。。。
同样的matlab中有内置的函数
p=spline(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);
plot(x,y,'o',new_x,p1,'r-',new_x,p2,'b-')
插值对比图
可以看出,三次样条生成的曲线更加光滑。在实际建模中由于我们不知道数据的生成过程,因此这两种插值都可以使用。