分段插值法
用多项式作为插值函数来逼近某一函数 f ( x ) f(x) f(x)是最简单易行的一种插值方法,但是插值多项式的次数是随着插值节点的数目而增加的,且次数高的插值多项式往往插值效果并不理想,会出现所谓的Runge现象,即在插值函数 p n ( x ) p_n(x) pn(x)的两端会发生激烈地震荡(不稳定)。为此,在实际应用中常采用分段插值方法。
所谓分段插值法就是将被插值函数逐段多项式化,构造一个分段多项式作为插值函数。
分段插值:首先,将插值区间划分为若干小段,在每一小段上使用低阶插值;然后,将各小段上的插值多项式拼接在一起作为整个区间上的插值函数。如果使用的低阶插值为线性插值(两点插值),则将拼接成一条折线,用它来逼近函数 f ( x ) f(x) f(x)。
应用低阶插值的关键在于恰当地选择插值节点。由插值余项公式(9)可知,所选节点 x i x_i xi离插值点x越近则误差越小。
- 分段线性插值
将插值区间
[
a
,
b
]
[a,b]
[a,b]分成
a
=
x
0
,
x
1
,
x
2
,
⋯
,
x
n
=
b
a=x_0,x_1,x_2,\cdots,x_n=b
a=x0,x1,x2,⋯,xn=b
n个小段,在每一个小段
[
x
i
−
1
,
x
i
]
(
i
=
1
,
2
,
⋯
,
n
)
[x_{i-1},x_i](i=1,2,\cdots,n)
[xi−1,xi](i=1,2,⋯,n)上,其分段线性插值的公式为:
s
(
x
)
=
y
i
+
y
i
−
y
i
−
1
x
i
−
x
i
−
1
(
x
−
x
i
)
s(x)=y_i+\frac{y_i-y_{i-1}}{x_i-x_{i-1}}(x-x_i)
s(x)=yi+xi−xi−1yi−yi−1(x−xi)
根据
i
=
{
1
x
≤
x
0
k
x
k
−
1
<
x
≤
x
k
时
,
(
1
≤
k
≤
n
)
n
x
>
x
n
i = \begin{cases} 1 \quad x\leq x_0 \\ k \quad x_{k-1}<x\leq x_k时,(1\leq k\leq n) \\ n \quad x>x_n \end{cases}
i=⎩⎪⎨⎪⎧1x≤x0kxk−1<x≤xk时,(1≤k≤n)nx>xn
选择插值节点,即当插值节点为
x
0
,
x
1
,
x
2
,
⋯
,
x
k
−
1
,
x
k
,
⋯
,
x
n
x_0,x_1,x_2,\cdots,x_{k-1},x_k,\cdots,x_n
x0,x1,x2,⋯,xk−1,xk,⋯,xn时,依次从左至右取出各节点。如果插值点x不超过节点
x
1
x_1
x1(即在
[
x
0
,
x
1
]
[x_0,x_1]
[x0,x1]之间),则取节点
x
0
x_0
x0和
x
1
x_1
x1进行线性插值,否则,再检查x是否超过
x
2
,
⋯
x_2,\cdots
x2,⋯,依次逐步检查。一旦发现x不超过某个节点
x
n
x_n
xn,则取它与前面一个节点
x
n
−
1
x_{n-1}
xn−1进行线性插值。如果x已超过
x
n
−
1
x_{n-1}
xn−1,则不论是否超过
x
n
x_n
xn,插值节点均取
x
n
x_n
xn和
x
n
−
1
x_{n-1}
xn−1(也就是一律当成是在
[
x
n
−
1
,
x
n
]
[x_{n-1},x_n]
[xn−1,xn])范围内取插值点。
在小段
[
x
n
−
1
,
x
n
]
[x_{n-1},x_n]
[xn−1,xn]上,分段线性插值的误差是:
∣
R
(
x
)
∣
=
∣
f
(
x
)
−
s
(
x
)
∣
≤
∣
f
(
2
)
(
ξ
)
∣
8
(
x
n
−
x
n
−
1
)
2
,
ξ
∈
[
x
n
−
1
,
x
n
]
|R(x)|=|f(x)-s(x)|\leq \frac{|f^{(2)}(\xi)|}{8}(x_n-x_{n-1})^2, \quad \xi \in [x_{n-1},x_n]
∣R(x)∣=∣f(x)−s(x)∣≤8∣f(2)(ξ)∣(xn−xn−1)2,ξ∈[xn−1,xn]
可见,当
f
(
2
)
f^{(2)}
f(2)有界时,小段
[
x
n
−
1
,
x
n
]
[x_{n-1},x_n]
[xn−1,xn]越小,分段线性插值的误差就越小。用分段线性插值方法提高插值精度是有效的。
- 分段抛物插值
为了提高插值精度,可以在每一小段取3个节点
x
i
−
1
,
x
i
x_{i-1},x_i
xi−1,xi和
x
i
+
1
x_{i+1}
xi+1进行二次插值,从而构成分段抛物插值。其插值公式如下:
y
=
(
x
−
x
i
)
(
x
−
x
i
+
1
)
(
x
i
−
1
−
x
i
)
(
x
i
−
1
−
x
i
+
1
)
⋅
y
x
−
1
+
(
x
−
x
i
−
1
)
(
x
−
x
i
+
1
)
(
x
i
−
x
i
−
1
)
(
x
i
−
x
i
+
1
)
⋅
y
i
+
(
x
−
x
i
−
1
)
(
x
−
x
i
)
(
x
i
+
1
−
x
i
−
1
)
(
x
i
+
1
−
x
i
)
⋅
y
i
y=\frac{(x-x_i)(x-x_{i+1})}{(x_{i-1}-x_i)(x_{i-1}-x_{i+1})}·y_{x-1}+\frac{(x-x_{i-1})(x-x_{i+1})}{(x_i-x_{i-1})(x_i-x_{i+1})}·y_i+\frac{(x-x_{i-1})(x-x_{i})}{(x_{i+1}-x_{i-1})(x_{i+1}-x_i)}·y_i
y=(xi−1−xi)(xi−1−xi+1)(x−xi)(x−xi+1)⋅yx−1+(xi−xi−1)(xi−xi+1)(x−xi−1)(x−xi+1)⋅yi+(xi+1−xi−1)(xi+1−xi)(x−xi−1)(x−xi)⋅yi
根据
i
=
{
1
x
<
x
1
k
−
1
x
k
−
1
<
x
<
x
k
且
∣
x
−
x
k
−
1
∣
≤
∣
x
−
x
k
∣
,
k
=
2
,
3
,
⋯
,
n
−
1
k
x
k
−
1
<
x
<
x
k
且
∣
x
−
x
k
−
1
∣
>
∣
x
−
x
k
∣
,
k
=
2
,
3
,
⋯
,
n
−
1
n
−
1
x
>
x
n
−
1
i=\begin{cases} 1 \quad x<x_1 \\ k-1 \quad x_{k-1}<x<x_k 且 |x-x_{k-1}|\leq |x-x_k|, k=2,3,\cdots,n-1 \\ k \quad x_{k-1}<x<x_k 且|x-x_{k-1}|>|x-x_k|,k=2,3,\cdots,n-1 \\ n-1 \quad x>x_{n-1} \end{cases}
i=⎩⎪⎪⎪⎨⎪⎪⎪⎧1x<x1k−1xk−1<x<xk且∣x−xk−1∣≤∣x−xk∣,k=2,3,⋯,n−1kxk−1<x<xk且∣x−xk−1∣>∣x−xk∣,k=2,3,⋯,n−1n−1x>xn−1
选择插值节点。即靠近
x
0
x_0
x0取
i
=
1
i=1
i=1,计算节点为
x
0
,
x
1
,
x
2
x_0,x_1,x_2
x0,x1,x2;靠近
x
k
−
1
x_{k-1}
xk−1取
i
=
k
−
1
i=k-1
i=k−1,计算节点为
x
k
−
2
,
x
k
−
1
,
x
k
x_{k-2},x_{k-1},x_k
xk−2,xk−1,xk;靠近
x
k
x_k
xk取
i
=
k
i=k
i=k,计算节点为
x
k
−
1
,
x
k
,
x
k
+
1
x_{k-1},x_k,x_{k+1}
xk−1,xk,xk+1;靠近
x
n
x_n
xn取
i
=
n
−
1
i=n-1
i=n−1,计算节点为
x
n
−
2
,
x
n
−
1
,
x
n
x_{n-2},x{n-1},x_n
xn−2,xn−1,xn。
- 分段插值方法特点
(1)分段插值方法算法简单,收敛性可以得到保证,只要节点间距充分小,就能达到任何精度的要求。
(2)如需修改某个数据,则插值函数仅在相关的某个局部范围内受影响。
(3)分段抛物插值所拼接成的插值函数曲线不一定光滑。