2.6 三次样条插值
1.三次样条函数
(1)定义:若函数 S ( x ) ∈ C 2 [ a , b ] S(x)\in C^2[a,b] S(x)∈C2[a,b],且每个小区间 [ x j , x j + 1 ] [x_j,x_{j+1}] [xj,xj+1]上为三次多项式,其中 a = x 0 < x 1 < ⋯ < x n = b a=x_0<x_1<\cdots<x_n=b a=x0<x1<⋯<xn=b为给定节点,则称 S ( x ) S(x) S(x)为节点 x 0 , x 1 , ⋯ , x n x_0,x_1,\cdots,x_n x0,x1,⋯,xn的三次样条函数
若在节点
x
j
x_j
xj上给定函数值
y
j
=
f
(
x
j
)
(
j
=
0
,
1
,
⋯
,
n
)
y_j=f(x_j)(j=0,1,\cdots,n)
yj=f(xj)(j=0,1,⋯,n)并满足
S
(
x
j
)
=
y
j
,
j
=
0
,
1
,
⋯
,
n
(1.46)
S(x_j)=y_j,j=0,1,\cdots,n\tag{1.46}
S(xj)=yj,j=0,1,⋯,n(1.46)
称
S
(
x
)
S(x)
S(x)为三次样条插值函数
(2)定值条件:要求
S
(
x
)
S(x)
S(x),在每个小区间
[
x
j
,
x
j
+
1
]
[x_j,x_{j+1}]
[xj,xj+1]上要确定4个待定系数,共有
n
n
n个区间,故应确定
4
n
4n
4n个参数。根据
S
(
x
)
S(x)
S(x)在
[
a
,
b
]
[a,b]
[a,b]上二阶导数连续,在节点
x
j
(
j
=
1
,
2
,
⋯
,
n
−
1
)
x_j(j=1,2,\cdots,n-1)
xj(j=1,2,⋯,n−1)满足连续性条件
S
(
x
j
−
0
)
=
S
(
x
j
+
0
)
,
S
′
(
x
j
−
0
)
=
S
′
(
x
j
+
0
)
,
S
′
′
(
x
j
−
0
)
=
S
′
′
(
x
j
+
0
)
(1.47)
S(x_j-0)=S(x_j+0),S^\prime(x_j-0)=S^\prime(x_j+0),S^{\prime\prime}(x_j-0)=S^{\prime\prime}(x_j+0)\tag{1.47}
S(xj−0)=S(xj+0),S′(xj−0)=S′(xj+0),S′′(xj−0)=S′′(xj+0)(1.47)
这里共有
3
n
−
3
3n-3
3n−3个条件,加上
S
(
x
)
S(x)
S(x)满足(1.46)这
n
+
1
n+1
n+1个条件,再加上边界条件区间
[
a
,
b
]
[a,b]
[a,b]左右端点
a
=
x
0
,
b
=
x
n
a=x_0,b=x_n
a=x0,b=xn,刚好满足
4
n
4n
4n个条件,三次样条函数问题可解,边界条件的三种常见情况:
1)已知区间两端的一阶导数值,即
S
′
(
x
0
)
=
f
0
′
,
S
′
(
x
n
)
=
f
n
′
(1.48)
S^\prime(x_0)=f^\prime_0,S^\prime(x_n)=f^\prime_n \tag{1.48}
S′(x0)=f0′,S′(xn)=fn′(1.48)
2)已知区间两端的二阶导数值,即
S
′
′
(
x
0
)
=
f
0
′
′
,
S
′
′
(
x
n
)
=
f
n
′
′
(1.49)
S^{\prime\prime}(x_0)=f^{\prime\prime}_0,S^{\prime\prime}(x_n)=f^{\prime\prime}_n \tag{1.49}
S′′(x0)=f0′′,S′′(xn)=fn′′(1.49)
特殊情况(自然边界条件)
S
′
′
(
x
0
)
=
S
′
′
(
x
n
)
=
0
(1.49-C)
S^{\prime\prime}(x_0)=S^{\prime\prime}(x_n)=0 \tag{1.49-C}
S′′(x0)=S′′(xn)=0(1.49-C)
3)当
f
(
x
)
f(x)
f(x)以
x
n
−
x
0
x_n-x_0
xn−x0为周期的周期函数时,则要求
S
(
x
)
S(x)
S(x)也是周期函数,满足
{
S
(
x
0
+
0
)
=
S
(
x
n
−
0
)
,
S
′
(
x
0
+
0
)
=
S
′
(
x
n
−
0
)
S
′
′
(
x
0
+
0
)
=
S
′
′
(
x
n
−
0
)
(1.50)
\begin{cases} S(x_0+0)=S(x_n-0),S^\prime(x_0+0)=S^\prime(x_n-0)\\ S^{\prime\prime}(x_0+0)=S^{\prime\prime}(x_n-0) \end{cases}\tag{1.50}
{S(x0+0)=S(xn−0),S′(x0+0)=S′(xn−0)S′′(x0+0)=S′′(xn−0)(1.50)
此时满足(1.46)式中的
y
0
=
y
n
y_0=y_n
y0=yn,称这类样条函数
S
(
x
)
S(x)
S(x)为周期样条函数
2.三次样条插值函数
推导建立插值函数的过程:
由二阶导数值
S
′
′
(
x
j
)
=
M
j
,
j
=
0
,
1
,
⋯
,
n
S^{\prime\prime}(x_j)=M_j,j=0,1,\cdots,n
S′′(xj)=Mj,j=0,1,⋯,n表达
S
(
x
)
S(x)
S(x).由
S
(
x
)
S(x)
S(x)在区间
[
x
j
,
x
j
+
1
]
[x_j,x_{j+1}]
[xj,xj+1]为三次多项式得
S
′
′
(
x
)
S^{\prime\prime}(x)
S′′(x)为线性函数,写为
S
′
′
(
x
)
=
M
j
x
j
+
1
−
x
h
j
+
M
j
+
1
x
−
x
j
h
j
(1.51)
S^{\prime\prime}(x)=M_j\frac{x_{j+1}-x}{h_j}+M_{j+1}\frac{x-x_j}{h_j}\tag{1.51}
S′′(x)=Mjhjxj+1−x+Mj+1hjx−xj(1.51)
对
S
(
x
)
S(x)
S(x)进行积分并利用
S
(
x
j
)
=
y
j
,
S
(
x
j
+
1
)
=
y
j
+
1
S(x_j)=y_j,S(x_{j+1})=y_{j+1}
S(xj)=yj,S(xj+1)=yj+1条件得到三次样条表达式
S
(
x
)
=
M
j
(
x
j
+
1
−
x
)
3
6
h
j
+
M
j
+
1
(
x
−
x
j
)
3
6
h
j
+
(
y
j
−
M
j
h
j
2
6
)
x
j
+
1
−
x
h
j
+
(
y
j
+
1
−
M
j
+
1
h
j
2
6
)
x
−
x
j
h
j
,
j
=
0
,
1
,
⋯
,
n
−
1
(1.52)
S(x)=M_j\frac{(x_{j+1}-x)^3}{6h_j}+M_{j+1}\frac{(x-x_j)^3}{6h_j}+(y_j-\frac{M_jh_j^2}{6})\frac{x_{j+1}-x}{h_j}\\+(y_{j+1}-\frac{M_{j+1}h_j^2}{6})\frac{x-x_j}{h_j},j=0,1,\cdots,n-1\tag{1.52}
S(x)=Mj6hj(xj+1−x)3+Mj+16hj(x−xj)3+(yj−6Mjhj2)hjxj+1−x+(yj+1−6Mj+1hj2)hjx−xj,j=0,1,⋯,n−1(1.52)
求导得
S
′
(
x
)
=
−
M
j
(
x
j
+
1
−
x
)
2
2
h
j
+
M
j
+
1
(
x
−
x
j
)
2
2
h
j
+
y
j
+
1
−
y
j
2
h
j
−
M
j
+
1
−
M
j
6
h
j
(1.53)
S^\prime(x)=-M_j\frac{(x_{j+1}-x)^2}{2h_j}+M_{j+1}\frac{(x-x_{j})^2}{2h_j}+\frac{y_{j+1}-y_j}{2h_j}-\frac{M_{j+1}-M_j}{6}h_j\tag{1.53}
S′(x)=−Mj2hj(xj+1−x)2+Mj+12hj(x−xj)2+2hjyj+1−yj−6Mj+1−Mjhj(1.53)
由此得到
S
′
(
x
j
+
0
)
=
−
h
j
3
M
j
−
h
j
6
M
j
+
1
+
y
j
+
1
−
y
j
h
j
S
′
(
x
j
−
0
)
=
h
j
−
1
6
M
j
−
1
+
h
j
−
1
3
M
j
+
y
j
−
y
j
−
1
h
j
−
1
\begin{aligned}S^\prime(x_j+0)&=-\frac{h_j}{3}M_j-\frac{h_j}{6}M_{j+1}+\frac{y_{j+1}-y_{j}}{h_j}\\S^\prime(x_j-0)&=\frac{h_{j-1}}{6}M_{j-1}+\frac{h_{j-1}}{3}M_j+\frac{y_j-y_{j-1}}{h_{j-1}}\end{aligned}
S′(xj+0)S′(xj−0)=−3hjMj−6hjMj+1+hjyj+1−yj=6hj−1Mj−1+3hj−1Mj+hj−1yj−yj−1
由
S
′
(
x
j
−
0
)
=
S
′
(
x
j
+
0
)
S^\prime(x_j-0)=S^\prime(x_j+0)
S′(xj−0)=S′(xj+0)得
μ
j
M
j
−
1
+
2
M
j
+
λ
j
M
j
+
1
=
d
j
,
j
=
1
,
2
,
⋯
,
n
−
1
(1.54)
\mu_jM_{j-1}+2M_j+\lambda_jM_{j+1}=d_j,j=1,2,\cdots,n-1\tag{1.54}
μjMj−1+2Mj+λjMj+1=dj,j=1,2,⋯,n−1(1.54)
其中
μ
j
=
h
j
−
1
h
j
−
1
+
h
j
,
λ
j
=
h
j
h
j
−
1
+
h
j
d
j
=
6
h
j
−
1
+
h
j
(
f
[
x
j
,
x
j
+
1
]
−
f
[
x
j
,
x
j
−
1
]
)
=
f
[
x
j
−
1
,
x
j
,
x
j
+
1
]
,
j
=
1
,
2
,
⋯
,
n
−
1
(1.55)
\begin{aligned} \mu_j&=\frac{h_{j-1}}{h_{j-1}+h_j},\lambda_j=\frac{h_{j}}{h_{j-1}+h_j}\\d_j&=\frac{6}{h_{j-1}+h_j}(f[x_j,x_{j+1}]-f[x_j,x_{j-1}])=f[x_{j-1},x_j,x_{j+1}],j=1,2,\cdots,n-1 \end{aligned}\tag{1.55}
μjdj=hj−1+hjhj−1,λj=hj−1+hjhj=hj−1+hj6(f[xj,xj+1]−f[xj,xj−1])=f[xj−1,xj,xj+1],j=1,2,⋯,n−1(1.55)
最后再代入边界条件即可得到矩阵形式的方程组,解出
M
k
(
k
=
j
−
1
,
j
,
j
+
1
)
M_k(k=j-1,j,j+1)
Mk(k=j−1,j,j+1)即可得到三次样条插值函数
S
(
x
)
S(x)
S(x)的表达式.
比较常见的是第一类边界条件的运用,将(1.48)式代入(1.53)式可以推出两个方程
2
M
0
+
M
1
=
6
h
0
(
f
[
x
0
,
x
1
]
−
f
0
′
)
M
n
−
1
+
2
M
n
=
6
h
n
−
1
(
f
n
′
−
f
[
x
n
−
1
,
x
n
]
)
}
(1.56)
\begin{rcases} 2M_0+M_1=\frac{6}{h_0}(f[x_0,x_1]-f_0^\prime)\\ M_{n-1}+2M_n=\frac{6}{h_{n-1}}(f_n^\prime-f[x_{n-1},x_n]) \end{rcases}\tag{1.56}
2M0+M1=h06(f[x0,x1]−f0′)Mn−1+2Mn=hn−16(fn′−f[xn−1,xn])}(1.56)
若令
λ
0
=
1
;
d
0
=
6
h
0
(
f
[
x
0
,
x
1
]
−
f
0
′
)
=
6
h
0
(
f
[
x
0
,
x
1
]
−
P
0
′
)
;
μ
n
=
1
;
d
n
=
6
h
n
−
1
(
f
n
′
−
f
[
x
n
−
1
,
x
n
]
)
=
6
h
n
−
1
(
P
n
′
−
f
[
x
n
−
1
,
x
n
]
)
.
\begin{aligned} \lambda_0&=1;\\ d_0&=\frac{6}{h_0}(f[x_0,x_1]-f_0^\prime)=\frac{6}{h_0}(f[x_0,x_1]-P_0^\prime);\\ \mu_n&=1;\\ d_n&=\frac{6}{h_{n-1}}(f_n^\prime-f[x_{n-1},x_n])=\frac{6}{h_{n-1}}(P_n^\prime-f[x_{n-1},x_n]). \end{aligned}
λ0d0μndn=1;=h06(f[x0,x1]−f0′)=h06(f[x0,x1]−P0′);=1;=hn−16(fn′−f[xn−1,xn])=hn−16(Pn′−f[xn−1,xn]).
写成矩阵形式
[
2
λ
0
μ
1
2
λ
1
⋱
⋱
⋱
μ
n
−
1
2
λ
n
−
1
μ
n
2
]
[
M
0
M
1
⋮
M
n
−
1
M
n
]
=
[
d
0
d
1
⋮
d
n
−
1
d
n
]
(1.57)
\begin{bmatrix} 2&\lambda_0\\ \mu_1&2&\lambda_1\\ &\ddots&\ddots&\ddots\\ &&\mu_{n-1}&2&\lambda_{n-1}\\ &&&\mu_n&2 \end{bmatrix}\begin{bmatrix}M_0\\M_1\\ \vdots\\M_{n-1}\\M_n \end{bmatrix}=\begin{bmatrix}d_0\\d_1\\ \vdots\\d_{n-1}\\d_n \end{bmatrix}\tag{1.57}
2μ1λ02⋱λ1⋱μn−1⋱2μnλn−12
M0M1⋮Mn−1Mn
=
d0d1⋮dn−1dn
(1.57)
利用追赶法可解方程组.