1. 预备理论
假设有离散的 { x 0 , x 1 , . . . , x n } \{x_0,x_1,...,x_n\} {x0,x1,...,xn} 插值节点,以及对应的函数值 { f ( x 0 ) , . . . . , f ( x n ) } \{f(x_0),....,f(x_n)\} {f(x0),....,f(xn)},希望用函数 ϕ ( x ) \phi(x) ϕ(x) 来近似 f ( x ) f(x) f(x),使其满足插值条件 ϕ ( x i ) = f ( x i ) , i = 0 , . . . , n \phi(x_i)=f(x_i),i=0,...,n ϕ(xi)=f(xi),i=0,...,n。一般选择多项式插值函数 p ( x ) = a 0 + a 1 x + ⋯ + a n x n ∈ P n p(x)=a_0+a_1x+\cdots+a_n x^n \in {\mathcal P}_n p(x)=a0+a1x+⋯+anxn∈Pn。
根据插值条件 f ( x i ) = ϕ ( x i ) f(x_i)=\phi(x_i) f(xi)=ϕ(xi) 列出来 n + 1 n+1 n+1 个等式,再由 Hilbert 阵的非奇异性质,可以证明插值函数 p ( x ) p(x) p(x) 存在且唯一。但同时也由于 Hilbert 的病态性,使得这种直接暴力求解的方式不好使。后面给出几种更好用的方法。
2. Lagrange插值
采用了类似“正交基”的想法,如果有 n + 1 n+1 n+1 个插值节点,就先给出 n + 1 n+1 n+1 个“正交基函数”,然后再用线性组合即可得到插值函数。
选择基底函数为
l
i
(
x
)
=
∏
k
=
0
,
k
≠
i
n
x
−
x
k
x
i
−
x
k
=
{
1
,
x
=
x
i
0
,
x
=
x
k
,
k
≠
i
l_i(x) = \prod_{k=0,k\ne i}^n \frac{x-x_k}{x_i-x_k} = \begin{cases} 1, & x=x_i \\ 0, & x=x_k,k\ne i \end{cases}
li(x)=k=0,k=i∏nxi−xkx−xk={1,0,x=xix=xk,k=i
对应构造的插值函数为
L
n
(
x
)
=
∑
i
=
0
n
f
(
x
i
)
l
i
(
x
)
L_n(x)=\sum_{i=0}^n f(x_i)l_i(x)
Ln(x)=∑i=0nf(xi)li(x),插值余项
R
n
(
x
)
≜
f
(
x
)
−
L
n
(
x
)
=
f
(
n
+
1
)
(
ξ
)
(
n
+
1
)
!
w
n
+
1
(
x
)
R_n(x)\triangleq f(x)-L_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!}w_{n+1}(x)
Rn(x)≜f(x)−Ln(x)=(n+1)!f(n+1)(ξ)wn+1(x)
其中
ξ
(
x
)
∈
[
a
,
b
]
\xi(x)\in[a,b]
ξ(x)∈[a,b],
w
n
+
1
(
x
)
=
∏
k
=
0
n
(
x
−
x
k
)
w_{n+1}(x)=\prod_{k=0}^n(x-x_k)
wn+1(x)=∏k=0n(x−xk)。
插值余项的证明:
∀
x
∈
[
a
,
b
]
\forall x\in[a,b]
∀x∈[a,b],将其看作新增插值节点,那么我们构造一个新的Lagrange插值函数
l
n
+
1
(
t
)
=
R
n
(
x
)
w
n
+
1
(
t
)
w
n
+
1
(
x
)
=
{
R
n
(
x
)
,
t
=
x
0
,
t
=
x
0
,
.
.
.
,
x
n
l_{n+1}(t) = R_n(x)\frac{w_{n+1}(t)}{w_{n+1}(x)} =\begin{cases} R_n(x), & t=x \\ 0, & t=x_0,...,x_n \end{cases}
ln+1(t)=Rn(x)wn+1(x)wn+1(t)={Rn(x),0,t=xt=x0,...,xn
那么我们取
L
n
+
1
(
t
)
=
L
n
(
t
)
+
l
n
+
1
(
t
)
L_{n+1}(t) = L_n(t) + l_{n+1}(t)
Ln+1(t)=Ln(t)+ln+1(t),可以验证其满足
L
n
+
1
(
x
i
)
=
f
(
x
i
)
,
t
∈
{
x
,
x
0
,
.
.
.
,
x
n
}
L_{n+1}(x_i)=f(x_i), t\in \{x,x_0,...,x_n\}
Ln+1(xi)=f(xi),t∈{x,x0,...,xn},也就是说他是新的插值函数,插值节点为
{
x
,
x
0
,
.
.
.
,
x
n
}
\{x,x_0,...,x_n\}
{x,x0,...,xn}。此时插值余项为
R
n
+
1
(
t
)
=
f
(
t
)
−
L
n
+
1
(
t
)
=
R
n
(
t
)
−
l
n
+
1
(
t
)
R_{n+1}(t)=f(t)-L_{n+1}(t)=R_n(t)-l_{n+1}(t)
Rn+1(t)=f(t)−Ln+1(t)=Rn(t)−ln+1(t),其满足
R
n
+
1
(
t
)
=
0
,
t
∈
{
x
,
x
0
,
.
.
.
,
x
n
}
R_{n+1}(t)=0,t\in \{x,x_0,...,x_n\}
Rn+1(t)=0,t∈{x,x0,...,xn},反复应用 Rolle 定理,即可得到存在
ξ
∈
[
a
,
b
]
\xi\in[a,b]
ξ∈[a,b] 使得
R
n
+
1
(
n
+
1
)
(
ξ
)
=
f
(
n
+
1
)
(
ξ
)
−
(
n
+
1
)
!
w
n
+
1
(
x
)
R
n
(
x
)
R_{n+1}^{(n+1)}(\xi)=f^{(n+1)}(\xi)-\frac{(n+1)!}{w_{n+1}(x)}R_n(x)
Rn+1(n+1)(ξ)=f(n+1)(ξ)−wn+1(x)(n+1)!Rn(x),证毕。
3. Newton插值
3.1 Newton插值及其余项
前面Lagrange插值方法存在的一个问题在于,如果新增一个插值节点,所有的基底函数
l
i
(
x
)
l_i(x)
li(x) 都要重新计算。Newton插值就是要克服这个问题,其思路在前面“插值余项的证明”过程中已经显现了,也就是每次新增一个插值节点,多项式的阶数会 +1,那么我们就增加一个
n
+
1
n+1
n+1 次多项式来弥补。具体方法如下。
N
n
(
x
)
=
N
n
−
1
(
x
)
+
a
n
w
n
(
x
)
N_n(x) = N_{n-1}(x) + a_n w_n(x)
Nn(x)=Nn−1(x)+anwn(x)
其中
N
n
−
1
(
x
)
N_{n-1}(x)
Nn−1(x) 为
{
x
0
,
.
.
.
,
x
n
−
1
}
\{x_0,...,x_{n-1}\}
{x0,...,xn−1} 的Newton插值函数,现在新增节点
x
n
x_n
xn,其插值函数
N
n
(
x
)
N_n(x)
Nn(x) 只需要添加一个
n
n
n 阶多项式
a
n
w
n
(
x
)
a_n w_n(x)
anwn(x),由
N
n
(
x
n
)
=
f
(
x
n
)
N_n(x_n)=f(x_n)
Nn(xn)=f(xn) 可以推出
a
n
=
f
(
x
n
)
−
N
n
−
1
(
x
n
)
w
n
(
x
n
)
a_n = \frac{f(x_n)-N_{n-1}(x_n)}{w_n(x_n)}
an=wn(xn)f(xn)−Nn−1(xn),记为均差
a
n
=
f
[
x
0
,
.
.
.
,
x
n
]
a_n=f[x_0,...,x_n]
an=f[x0,...,xn](实际上就是
x
n
+
1
x^{n+1}
xn+1 的系数,因此与节点的排列次序无关)。
由此得到Newton插值方法
N
n
(
x
)
=
∑
k
=
0
n
f
[
x
0
,
.
.
.
,
x
k
]
w
k
(
x
)
N_n(x) = \sum_{k=0}^n f[x_0,...,x_k] w_k(x)
Nn(x)=k=0∑nf[x0,...,xk]wk(x)
实际计算过程中均差可以递归计算
f
[
x
0
,
.
.
.
,
x
n
]
=
f
[
x
1
,
.
.
.
,
x
n
]
−
f
[
x
0
,
.
.
.
,
x
n
−
1
]
x
n
−
x
0
f[x_0,...,x_n] = \frac{f[x_1,...,x_n] - f[x_0,...,x_{n-1}]}{x_n-x_0}
f[x0,...,xn]=xn−x0f[x1,...,xn]−f[x0,...,xn−1]
证明:取
P
n
−
1
(
x
)
∈
P
n
−
1
P_{n-1}(x)\in{\mathcal P}_{n-1}
Pn−1(x)∈Pn−1 满足
P
n
−
1
(
x
i
)
=
f
(
x
i
)
,
i
=
0
,
1
,
.
.
.
,
n
−
1
P_{n-1}(x_i)=f(x_i),i=0,1,...,n-1
Pn−1(xi)=f(xi),i=0,1,...,n−1,
Q
n
−
1
(
x
)
∈
P
n
−
1
Q_{n-1}(x)\in{\mathcal P}_{n-1}
Qn−1(x)∈Pn−1 满足
Q
n
−
1
(
x
i
)
=
f
(
x
i
)
,
i
=
1
,
2
,
.
.
.
,
n
Q_{n-1}(x_i)=f(x_i),i=1,2,...,n
Qn−1(xi)=f(xi),i=1,2,...,n。构造
P
n
(
x
)
=
x
−
x
0
x
n
−
x
0
Q
n
−
1
(
x
)
+
x
n
−
x
x
n
−
x
0
P
n
−
1
(
x
)
(
★
)
P_n(x)=\frac{x-x_0}{x_n-x_0}Q_{n-1}(x) + \frac{x_n-x}{x_n-x_0}P_{n-1}(x) \quad(\bigstar)
Pn(x)=xn−x0x−x0Qn−1(x)+xn−x0xn−xPn−1(x)(★),可以验证满足
P
n
(
x
i
)
=
f
(
x
i
)
,
i
=
0
,
.
.
.
,
n
P_n(x_i)=f(x_i),i=0,...,n
Pn(xi)=f(xi),i=0,...,n。考虑
(
★
)
(\bigstar)
(★) 式等号两侧
x
n
x^n
xn 的系数,即可得证。
插值余项为
R
n
(
x
)
=
f
[
x
0
,
.
.
.
,
x
n
,
x
]
∏
i
=
0
n
(
x
−
x
i
)
R_n(x) = f[x_0,...,x_n,x]\prod_{i=0}^n (x-x_i)
Rn(x)=f[x0,...,xn,x]i=0∏n(x−xi)
证明:类似Lagrange中的方法,同样是将
x
x
x 看作一个新的插值节点即可。证毕。
3.2 高阶项
插值条件中除了直接给出函数值
f
(
x
i
)
f(x_i)
f(xi),有时候也会给出
f
′
(
x
i
)
f'(x_i)
f′(xi) 或者更高阶的导数值,那么此时的均差该如何计算呢?对于高阶项,如果有
x
0
≤
x
1
≤
⋯
≤
x
n
x_0\le x_1\le \cdots \le x_n
x0≤x1≤⋯≤xn,那么均差的计算方法为
f
[
x
0
,
.
.
.
,
x
n
]
=
{
f
[
x
1
,
.
.
.
,
x
n
]
−
f
[
x
0
,
.
.
.
,
x
n
−
1
]
x
n
−
x
0
,
x
n
≠
x
0
f
(
n
)
(
x
0
)
n
!
,
x
n
=
x
0
f[x_0,...,x_n] = \begin{cases} \frac{f[x_1,...,x_n] - f[x_0,...,x_{n-1}]}{x_n-x_0}, & x_n\ne x_0 \\ \frac{f^{(n)}(x_0)}{n!}, & x_n=x_0 \end{cases}
f[x0,...,xn]={xn−x0f[x1,...,xn]−f[x0,...,xn−1],n!f(n)(x0),xn=x0xn=x0
在解题过程中,主要还是用列表法,可以参考数值分析相关的教材。
4. Hermite插值
Hermite插值方法就是在Lagrange方法的基础上,再利用上插值节点的(高阶)导数值,用更少的插值节点获得更高阶的插值多项式。例如构造基函数
α
i
,
β
i
∈
P
2
n
+
1
,
i
=
0
,
1
,
.
.
.
,
n
\alpha_i,\beta_i\in {\mathcal P}_{2n+1},i=0,1,...,n
αi,βi∈P2n+1,i=0,1,...,n 满足
{
α
i
(
x
j
)
=
δ
i
j
,
α
i
′
(
x
j
)
=
0
β
i
(
x
j
)
=
0
,
β
i
′
(
x
j
)
=
δ
i
j
\begin{cases} \alpha_i(x_j) = \delta_{ij}, & \alpha'_i(x_j)=0 \\ \beta_i(x_j)=0, & \beta'_i(x_j) = \delta_{ij} \end{cases}
{αi(xj)=δij,βi(xj)=0,αi′(xj)=0βi′(xj)=δij
构造的多项式即为
H
2
n
+
1
(
x
)
=
∑
i
=
0
n
[
f
i
α
i
(
x
)
+
f
′
(
x
i
)
β
i
(
x
)
]
H_{2n+1}(x) = \sum_{i=0}^n [f_i\alpha_i(x) + f'(x_i)\beta_i(x)]
H2n+1(x)=i=0∑n[fiαi(x)+f′(xi)βi(x)]
具体细节略。
5. 样条插值
前面的方法都会出现 Runge 现象,也就是由于多项式本身的性质,插值函数阶数越高,边缘处振荡越严重,误差较大。样条插值的思路就是分段插值,并且只利用低阶多项式(如一阶、二阶、三阶)。其中一阶就是分段线性插值,用的比较多的还是三次样条插值。
三次样条插值的总体思路就是利用插值节点的函数值、一阶导、二阶导列出方程组来求解系数。不过为了使方程适定,需要再添加两个约束条件(增加两个方程),一般可选的有
- 固支边界条件: S 3 ′ ( x 0 ) = f ′ ( x 0 ) , S 3 ′ ( x n ) = f ′ ( x n ) S'_3(x_0)=f'(x_0),S'_3(x_n)=f'(x_n) S3′(x0)=f′(x0),S3′(xn)=f′(xn);
- 自然边界条件: S 3 ′ ′ ( x 0 ) = S 3 ′ ′ ( x n ) = 0 S''_3(x_0)=S''_3(x_n)=0 S3′′(x0)=S3′′(xn)=0;
- 周期边界条件: S 3 ( x 0 ) = S 3 ( x n ) = f 0 , S 3 ′ ( x 0 ) = S 3 ′ ( x n ) , S 3 ′ ′ ( x 0 ) = S 3 ′ ′ ( x n ) S_3(x_0)=S_3(x_n)=f_0, S'_3(x_0)=S'_3(x_n), S''_3(x_0)=S''_3(x_n) S3(x0)=S3(xn)=f0,S3′(x0)=S3′(xn),S3′′(x0)=S3′′(xn)。
具体细节略。
最后给我的博客打个广告,欢迎光临
https://glooow1024.github.io/
https://glooow.gitee.io/
前面的一些博客链接如下
泛函分析专栏
高等数值分析专栏
【高等数值分析】多项式插值
【高等数值分析】函数逼近
【高等数值分析】数值积分和数值微分
【高等数值分析】常微分方程数值解
【高等数值分析】Krylov子空间方法