插值问题:Interpolation.
- 已知函数 f ( x ) f(x) f(x) 在区间 [ a , b ] [a,b] [a,b] 上 n + 1 n+1 n+1 个相异点 a ≤ x 0 < x 1 < . . . < x n ≤ b a≤x_0<x_1<...<x_n≤b a≤x0<x1<...<xn≤b 处的函数值为 f ( x 0 ) , f ( x 1 ) , . . . , f ( x n ) f(x_0),f(x_1),...,f(x_n) f(x0),f(x1),...,f(xn),如果存在一个函数 S ( x ) S(x) S(x) 满足 S ( x i ) = f ( x i ) , i = 0 , 1 , 2 , . . . , n S(x_i)=f(x_i),i=0,1,2,...,n S(xi)=f(xi),i=0,1,2,...,n,则称函数 S ( x ) S(x) S(x) 为 f ( x ) f(x) f(x) 在点 x i , i = 0 , 1 , 2 , . . . , n x_i,i=0,1,2,...,n xi,i=0,1,2,...,n 处的插值函数。
- 相应地, f ( x ) f(x) f(x) 为被插值函数, x i x_i xi 为插值节点, [ a , b ] [a,b] [a,b] 为插值区间,求解插值函数 S ( x ) S(x) S(x) 的方法统称为插值法。
- 一般而言,插值函数 S ( x ) S(x) S(x) 和原函数 f ( x ) f(x) f(x) 之间总是会存在一定误差的,误差函数 R ( x ) = f ( x ) − S ( x ) R(x)=f(x)-S(x) R(x)=f(x)−S(x) 被称作插值余项。
初次接触余项概念是学习泰勒展开,使用高阶导数组合逼近原函数,熟悉的有皮亚诺余项、拉格朗日余项。泰勒展开的理念表明可以基于多项式来逼近光滑函数。
- 插值函数可以用于计算原函数 f ( x ) f(x) f(x) 的函数值、导数值、数值积分和数值微分等一系列近似计算。满足插值条件的插值函数有多种形式,常见的有多项式、有理分式、三角函数和指数函数。多项式(分段多项式)由于其计算简单的优势,在工程应用中备受青睐,例如Bezier曲线和B-样条曲线。
- 当插值函数是次数不超过 n n n 次的多项式 P n ( x ) = ∑ i = 0 n a i x i P_n(x)=\sum^n_{i=0}a_ix^i Pn(x)=∑i=0naixi 时,称其为 f ( x ) f(x) f(x) 的 n n n 次插值多项式。
插值多项式唯一性.
- 【定理】已知函数 f ( x ) f(x) f(x) 在区间 [ a , b ] [a,b] [a,b] 上 n + 1 n+1 n+1 个相异点 a ≤ x 0 < x 1 < . . . < x n ≤ b a≤x_0<x_1<...<x_n≤b a≤x0<x1<...<xn≤b 处的函数值 f ( x i ) , i = 0 , 1 , 2 , . . . , n f(x_i),i=0,1,2,...,n f(xi),i=0,1,2,...,n,则存在唯一的不超过 n n n 次的多项式 P n ( x ) = ∑ i = 0 n a i x i P_n(x)=\sum^n_{i=0}a_ix^i Pn(x)=∑i=0naixi 使得 P n ( x i ) = f ( x i ) , i = 0 , 1 , 2 , . . . , n P_n(x_i)=f(x_i),i=0,1,2,...,n Pn(xi)=f(xi),i=0,1,2,...,n.
- 【证明】由插值函数的定义可知 P n ( x i ) = f ( x i ) , i = 0 , 1 , 2 , . . . , n P_n(x_i)=f(x_i),i=0,1,2,...,n Pn(xi)=f(xi),i=0,1,2,...,n 必须成立,即 a 0 x i 0 + a 1 x i 1 + a 2 x i 2 + . . . + a n x i n = f ( x i ) , i = 0 , 1 , 2 , . . . , n a_0x_i^0+a_1x_i^1+a_2x_i^2+...+a_nx_i^n=f(x_i),i=0,1,2,...,n a0xi0+a1xi1+a2xi2+...+anxin=f(xi),i=0,1,2,...,n.
- 其系数矩阵的行列式是著名的范德蒙德行列式(注意此处是 n + 1 n+1 n+1 阶),值为 ∏ 0 ≤ j < i ≤ n ( x i − x j ) \prod_{0≤j<i≤n}(x_i-x_j) 0≤j<i≤n∏(xi−xj)
- 由于插值节点互异,所以系数行列式不为零,该方程组有唯一解,即插值多项式 P n ( x ) P_n(x) Pn(x) 存在且唯一。
拉格朗日插值法.
- 上部分证明过程中使用待定系数法也能够解出插值多项式的系数,但其问题在于计算量过大,并且当插值节点分布密集时,其稀疏矩阵是病态的,数值求解不稳定。
线性(一次)插值.
- 如果只有一个插值节点 f ( x 0 ) f(x_0) f(x0),那么得到的插值多项式即为常函数 P n ( x ) = f ( x 0 ) P_n(x)=f(x_0) Pn(x)=f(x0).
- 【一次插值】已知函数 f ( x ) f(x) f(x) 在区间 [ a , b ] [a,b] [a,b] 上两点 x 0 , x 1 x_0,x_1 x0,x1 处的函数值 y 0 , y 1 y_0,y_1 y0,y1,求插值函数 L 1 L_1 L1 满足 L 1 ( x 0 ) = y 0 , L 1 ( x 1 ) = y 1 L_1(x_0)=y_0,L_1(x_1)=y_1 L1(x0)=y0,L1(x1)=y1.
- 实际上此时的插值多项式就是过点 ( x 0 , y 0 ) , ( x 1 , y 1 ) (x_0,y_0),(x_1,y_1) (x0,y0),(x1,y1) 的直线,其函数式为 L 1 ( x ) = x − x 1 x 0 − x 1 ⋅ y 0 + x − x 0 x 1 − x 0 ⋅ y 1 L_1(x)=\frac{x-x_1}{x_0-x_1}·y_0+\frac{x-x_0}{x_1-x_0}·y_1 L1(x)=x0−x1x−x1⋅y0+x1−x0x−x0⋅y1.
- 记 l 0 ( x ) = x − x 1 x 0 − x 1 , l 1 ( x ) = x − x 0 x 1 − x 0 l_0(x)=\frac{x-x_1}{x_0-x_1},l_1(x)=\frac{x-x_0}{x_1-x_0} l0(x)=x0−x1x−x1,l1(x)=x1−x0x−x0,那么 L 1 ( x ) = l 0 ( x ) ⋅ y 0 + l 1 ( x ) ⋅ y 1 L_1(x)=l_0(x)·y_0+l_1(x)·y_1 L1(x)=l0(x)⋅y0+l1(x)⋅y1 称为 f ( x ) f(x) f(x) 在 [ a , b ] [a,b] [a,b] 上的Lagrange型线性插值函数,其中 l 0 ( x ) , l 1 ( x ) l_0(x),l_1(x) l0(x),l1(x) 分别是点 x 0 , x 1 x_0,x_1 x0,x1 上的Lagrange插值基函数。
- 可以发现 l 0 ( x ) , l 1 ( x ) l_0(x),l_1(x) l0(x),l1(x) 都是线性函数,并且具有以下性质: ① l 0 ( x ) + l 1 ( x ) = 1 ①~l_0(x)+l_1(x)=1 ① l0(x)+l1(x)=1; ② l k ( x i ) = δ k i ②~l_k(x_i)=\delta_{ki} ② lk(xi)=δki,其中 δ \delta δ 是Kronecker符号。
- 拉格朗日插值函数可以视为节点函数值 y i y_i yi 对节点插值基函数 l i ( x ) l_i(x) li(x) 的线性组合。
二次插值.
- 已知函数 f ( x ) f(x) f(x) 在区间 [ a , b ] [a,b] [a,b] 上三点 x 0 , x 1 , x 2 x_0,x_1,x_2 x0,x1,x2 处的函数值 y 0 , y 1 , y 2 y_0,y_1,y_2 y0,y1,y2,求插值函数 L 2 L_2 L2 满足 L 2 ( x i ) = y i L_2(x_i)=y_i L2(xi)=yi.
- 令 L 2 ( x ) = ∑ i = 0 2 l i ( x ) ⋅ y i L_2(x)=\sum^2_{i=0}l_i(x)·y_i L2(x)=∑i=02li(x)⋅yi,由于 l k ( x i ) = δ k i l_k(x_i)=\delta_{ki} lk(xi)=δki,所以对于 l 0 ( x ) l_0(x) l0(x) 而言,它是一个以 x 1 , x 2 x_1,x_2 x1,x2 为零点的二次函数 C ( x − x 1 ) ( x − x 2 ) C(x-x_1)(x-x_2) C(x−x1)(x−x2),又 l 0 ( x 0 ) = 1 l_0(x_0)=1 l0(x0)=1,可得 C = [ ( x 0 − x 1 ) ( x 0 − x 2 ) ] − 1 C=[(x_0-x_1)(x_0-x_2)]^{-1} C=[(x0−x1)(x0−x2)]−1,同理可以计算出 l 1 ( x ) , l 2 ( x ) l_1(x),l_2(x) l1(x),l2(x).
- 观察 l 0 ( x ) = ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) = ∏ j = 0 , j ≠ 0 2 x − x j x 0 − x j l_0(x)=\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}=\prod^2_{j=0,j≠0}\frac{x-x_j}{x_0-x_j} l0(x)=(x0−x1)(x0−x2)(x−x1)(x−x2)=∏j=0,j=02x0−xjx−xj 以及 l 1 ( x ) , l 2 ( x ) l_1(x),l_2(x) l1(x),l2(x) 的表达式,可以统一写为 l k ( x ) = ∏ j = 0 , j ≠ k 2 x − x j x k − x j l_k(x)=\prod^2_{j=0,j≠k}\frac{x-x_j}{x_k-x_j} lk(x)=∏j=0,j=k2xk−xjx−xj,所以: L 2 ( x ) = ∑ k = 0 2 ( ∏ j = 0 , j ≠ k 2 x − x j x k − x j ) L_2(x)=\sum^2_{k=0}(\prod^2_{j=0,j≠k}\frac{x-x_j}{x_k-x_j}) L2(x)=k=0∑2(j=0,j=k∏2xk−xjx−xj)
n n n 次插值.
- 回到最一般的情况,已知函数 f ( x ) f(x) f(x) 在区间 [ a , b ] [a,b] [a,b] 上 n + 1 n+1 n+1 个相异点 a ≤ x 0 < x 1 < . . . < x n ≤ b a≤x_0<x_1<...<x_n≤b a≤x0<x1<...<xn≤b 处的函数值为 y i , i = 0 , 1 , 2 , . . . , n y_i,i=0,1,2,...,n yi,i=0,1,2,...,n.
- L n ( x ) = ∑ k = 0 n ( ∏ j = 0 , j ≠ k n x − x j x k − x j ) L_n(x)=\sum^n_{k=0}(\prod^n_{j=0,j≠k}\frac{x-x_j}{x_k-x_j}) Ln(x)=k=0∑n(j=0,j=k∏nxk−xjx−xj)
插值余项.
- 【定理】拉格朗日插值法得到的插值多项式 L n ( x ) L_n(x) Ln(x) 产生的误差 R n ( x ) = f ( x ) − L n ( x ) = f ( n + 1 ) ( ξ ) ( n + 1 ) ! ω n + 1 ( x ) R_n(x)=f(x)-L_n(x)=\frac{f^{(n+1)(\xi)}}{(n+1)!}\omega_{n+1}(x) Rn(x)=f(x)−Ln(x)=(n+1)!f(n+1)(ξ)ωn+1(x).
- 其中 f ( x ) f(x) f(x) 在 [ a , b ] [a,b] [a,b] 上具有 n n n 阶连续导数,并且在 ( a , b ) (a,b) (a,b) 内 n + 1 n+1 n+1 阶可导, ξ ∈ ( a , b ) \xi∈(a,b) ξ∈(a,b), ω n + 1 ( x ) = ∏ i = 0 n ( x − x i ) \omega_{n+1}(x)=\prod^n_{i=0}(x-x_i) ωn+1(x)=∏i=0n(x−xi).
- 【证明】根据 R n ( x ) = f ( x ) − L n ( x ) R_n(x)=f(x)-L_n(x) Rn(x)=f(x)−Ln(x),当 x = x i , i = 0 , 1 , 2 , . . . , n x=x_i,i=0,1,2,...,n x=xi,i=0,1,2,...,n 时 R n ( x i ) = 0 R_n(x_i)=0 Rn(xi)=0,所以 R n ( x ) R_n(x) Rn(x) 有 n + 1 n+1 n+1 个零点,可以设 R n ( x ) = K ( x ) ( x − x 0 ) ( x − x 1 ) . . . ( x − x n ) R_n(x)=K(x)(x-x_0)(x-x_1)...(x-x_n) Rn(x)=K(x)(x−x0)(x−x1)...(x−xn),其中 K ( x ) K(x) K(x) 待定。
- 构造辅助函数 ϕ ( t ) = R n ( t ) − K ( x ) ∏ i = 0 n ( t − x i ) \phi(t)=R_n(t)-K(x)\prod^n_{i=0}(t-x_i) ϕ(t)=Rn(t)−K(x)∏i=0n(t−xi),当 t = x t=x t=x 时可以发现 ϕ ( x ) = 0 \phi(x)=0 ϕ(x)=0,另外 t = x i t=x_i t=xi 时 ϕ ( x i ) = 0 \phi(x_i)=0 ϕ(xi)=0,因此 ϕ ( t ) \phi(t) ϕ(t) 有 n + 2 n+2 n+2 个零点。
【罗尔定理】函数 f ( x ) f(x) f(x) 满足在区间 [ a , b ] [a,b] [a,b] 连续, ( a , b ) (a,b) (a,b) 可导并且 f ( a ) = f ( b ) f(a)=f(b) f(a)=f(b) 时,一定存在 ξ ∈ ( a , b ) \xi∈(a,b) ξ∈(a,b) 使得 f ′ ( ξ ) = 0 f'(\xi)=0 f′(ξ)=0.
- 已知函数 ϕ ( t ) \phi(t) ϕ(t) 有 n + 2 n+2 n+2 个零点,将其按从小到大的顺序排列并重新编号为 t 0 , t 1 , . . . , t n + 1 t_0,t_1,...,t_{n+1} t0,t1,...,tn+1. 考察区间 [ t 0 , t 1 ] [t_0,t_1] [t0,t1],根据罗尔定理,存在 ξ 0 ∈ ( t 0 , t 1 ) \xi_0∈(t_0,t_1) ξ0∈(t0,t1) 使得 ϕ ′ ( ξ 0 ) = 0 \phi'(\xi_0)=0 ϕ′(ξ0)=0. 同理可以得到另外 n n n 个 ϕ ′ ( t ) \phi'(t) ϕ′(t) 的零点。
- 对 ϕ ′ ( t ) \phi'(t) ϕ′(t) 继续使用罗尔定理,可以得到 ϕ ′ ′ ( t ) \phi''(t) ϕ′′(t) 的 n − 1 n-1 n−1 个零点,第 n + 1 n+1 n+1 次迭代后得到以下结论:存在 ξ ∈ ( a , b ) \xi∈(a,b) ξ∈(a,b) 使得 ϕ ( n + 1 ) ( ξ ) = 0 \phi^{(n+1)}(\xi)=0 ϕ(n+1)(ξ)=0.
- 由于 ϕ ( t ) = R n ( t ) − K ( x ) ∏ i = 0 n ( t − x i ) = f ( x ) − L n ( x ) − K ( x ) ∏ i = 0 n ( t − x i ) \phi(t)=R_n(t)-K(x)\prod^n_{i=0}(t-x_i)=f(x)-L_n(x)-K(x)\prod^n_{i=0}(t-x_i) ϕ(t)=Rn(t)−K(x)∏i=0n(t−xi)=f(x)−Ln(x)−K(x)∏i=0n(t−xi),对其三个部分求 n + 1 n+1 n+1 阶导数, f ( x ) f(x) f(x) 部分求导为 f ( n + 1 ) ( x ) f^{(n+1)}(x) f(n+1)(x); L n ( x ) L_n(x) Ln(x) 为 n n n 次多项式,所以其 n + 1 n+1 n+1 阶导数为 0 0 0;第 3 3 3 部分为 n + 1 n+1 n+1 次多项式,求导结果为 K ( x ) ⋅ ( n + 1 ) ! K(x)·(n+1)! K(x)⋅(n+1)!.
- 综上所述,得 ϕ ( n + 1 ) ( ξ ) = f ( n + 1 ) ( ξ ) − ( n + 1 ) ! ⋅ K ( x ) = 0 \phi^{(n+1)}(\xi)=f^{(n+1)}(\xi)-(n+1)!·K(x)=0 ϕ(n+1)(ξ)=f(n+1)(ξ)−(n+1)!⋅K(x)=0,解得 K ( x ) = f ( n + 1 ) ( ξ ) ( n + 1 ) ! K(x)=\frac{f^{(n+1)(\xi)}}{(n+1)!} K(x)=(n+1)!f(n+1)(ξ),因此 R n ( x ) = K ( x ) ∏ i = 0 n ( x − x i ) = f ( n + 1 ) ( ξ ) ( n + 1 ) ! ⋅ ω n + 1 ( x ) R_n(x)=K(x)\prod^n_{i=0}(x-x_i)=\frac{f^{(n+1)(\xi)}}{(n+1)!}·\omega_{n+1}(x) Rn(x)=K(x)∏i=0n(x−xi)=(n+1)!f(n+1)(ξ)⋅ωn+1(x),拉格朗日插值法余项得证。
碎碎念.
- 如果将 f ( x ) f(x) f(x) 和 L n ( x ) L_n(x) Ln(x) 分别视为真实模型和假设模型,那么 R n ( x ) R_n(x) Rn(x) 可以视为误差。从其表达式可以看出 R n ( x ) R_n(x) Rn(x) 并不是随着插值节点数量的增加单调减小。
- 一般来说对于拉格朗日插值法而言,增加插值节点的个数可以减小余项大小,但回忆前面部分从线性插值、二次插值到 n n n 次插值的推导过程可以发现,每次增加插值节点,插值基函数都需要重新计算,有很多冗余的计算量。