基本思想: 给出函数 y = f ( x ) y=f(x) y=f(x)的一组观测点(函数表)
x x x x 0 x_0 x0 x 1 x_1 x1 … \ldots … x n x_n xn y y y y 0 y_0 y0 y 1 y_1 y1 … \ldots … y n y_n yn去寻找一个解析形式的函数 ϕ ( x ) \phi(x) ϕ(x),它在各个插值节点处的函数值正好等于表中的函数值,而在其它点上的函数值近似于 f ( x ) f(x) f(x)。如果选取的函数是次数不超过 n n n的多项式,则称插值为代数插值。
插值法主要有:
n次多项式插值;分段线性插值Hermit插值三次样条函数插值B样条函数插值每种插值方法在MATLAB中都有相应的函数(包括自己编写的),下面先讨论n次多项式插值。
给出函数 f ( x ) f(x) f(x)的 n + 1 n+1 n+1组观测点 ( x 0 , y 0 ) , ( x 1 , y 1 ) , … , ( x n , y n ) (x_0,y_0),(x_1,y_1),\ldots,(x_n,y_n) (x0,y0),(x1,y1),…,(xn,yn),令 φ ( x ) \varphi(x) φ(x)是次数不超过n的多项式 φ ( x ) = a 0 + a 1 x + a 2 x 2 + … + a n x n \varphi(x)=a_0+a_1x+a_2x^2+\ldots+a_nx^n φ(x)=a0+a1x+a2x2+…+anxn 并且有 φ ( x i ) = y i , i = 0 , 1 , … , n \varphi(x_i)=y_i,i=0,1,\ldots,n φ(xi)=yi,i=0,1,…,n。将各个节点代入多项式得到系数 ( a 0 , … , a n ) (a_0,\ldots,a_n) (a0,…,an)满足的线性方程组 { a 0 + a 1 x 0 + … + a n x 0 n = y 0 a 0 + a 1 x 1 + … + a n x 1 n = y 1 … a 0 + a 1 x n + … + a n x n n = y n \left\{ \begin{array}{c} a_0+a_1x_0+\ldots+a_nx^n_0=y_0\\ a_0+a_1x_1+\ldots+a_nx^n_1=y_1\\ \ldots \\ a_0+a_1x_n+\ldots+a_nx^n_n=y_n \end{array} \right. ⎩⎪⎪⎨⎪⎪⎧a0+a1x0+…+anx0n=y0a0+a1x1+…+anx1n=y1…a0+a1xn+…+anxnn=yn 易知此线性方程组的系数矩阵为Vandermonde矩阵 A = ( 1 x 0 … x 0 n 1 x 1 … x 1 n ⋮ ⋮ ⋱ ⋮ 1 x n … x n n ) \mathbf{A} = \left( \begin{array}{cccc} 1 & x_0 & \ldots & x_0^n \\ 1 & x_1 & \ldots & x_1^n \\ \vdots & \vdots & \ddots & \vdots \\ 1 & x_n & \ldots & x_n^n \end{array} \right) A=⎝⎜⎜⎜⎛11⋮1x0x1⋮xn……⋱…x0nx1n⋮xnn⎠⎟⎟⎟⎞ 它的行列式 ∣ A ∣ = ∏ j ≠ i ( x j − x i ) |\mathbf{A}|=\prod_{j\neq i}(x_j-x_i) ∣A∣=∏j=i(xj−xi)。当 ∣ A ∣ ≠ 0 |\mathbf{A}|\neq0 ∣A∣=0时可以解出唯一解。
这种方法的缺点是计算量太大。
为了利于编程,可以将 φ ( x ) \varphi(x) φ(x)表示成 n + 1 n+1 n+1个插值基函数 ( l 0 ( x ) , … , l n ( x ) ) (l_0(x),\ldots,l_n(x)) (l0(x),…,ln(x)) 的线性组合,插值基函数的性质是: l i ( x ) l_i(x) li(x)在 x i x_i xi上的取值为1,在其他点上的取值为0 l i ( x j ) = { 1 , i = j 0 , i ≠ j l_i(x_j)=\left\{ \begin{array}{cc} 1 &,i=j\\ 0 &,i\neq j \end{array} \right. li(xj)={10,i=j,i=j 那么 φ ( x ) \varphi(x) φ(x)被它们线性表出的表达式为 φ ( x ) = ∑ k = 0 n y k l k ( x ) \varphi(x)=\sum_{k=0}^n y_kl_k(x) φ(x)=k=0∑nyklk(x) 很容易得出每个插值基函数的表达式为 l i ( x ) = ( x − x 0 ) … ( x − x i − 1 ) ( x − x i + 1 ) … ( x − x n ) ( x i − x 0 ) … ( x i − x i − 1 ) ( x i − x i + 1 ) … ( x i − x n ) l_i(x)=\frac{(x-x_0)\ldots(x-x_{i-1})(x-x_{i+1})\ldots(x-x_{n})}{(x_i-x_0)\ldots(x_i-x_{i-1})(x_i-x_{i+1})\ldots(x_i-x_{n})} li(x)=(xi−x0)…(xi−xi−1)(xi−xi+1)…(xi−xn)(x−x0)…(x−xi−1)(x−xi+1)…(x−xn)
函数 f ( x ) f(x) f(x)在两个节点 x i , x j x_i,x_j xi,xj处的一阶均差为 f [ x i , x j ] = f ( x i ) − f ( x j ) x i − x j f[x_i,x_j]=\frac{f(x_i)-f(x_j)}{x_i-x_j} f[xi,xj]=xi−xjf(xi)−f(xj) 相应地,在三个节点 x i , x j , x k x_i,x_j,x_k xi,xj,xk处的二阶均差为 f [ x i , x j , x k ] = f [ x i , x j ] − f [ x j , x k ] x i − x k f[x_i,x_j,x_k]=\frac{f[x_i,x_j]-f[x_j,x_k]}{x_i-x_k} f[xi,xj,xk]=xi−xkf[xi,xj]−f[xj,xk] 在n个节点 x 1 , x 2 , … , x n x_1,x_2,\ldots,x_n x1,x2,…,xn处的n阶均差为 f [ x 0 , x 1 , … , x n ] = f [ x 0 , … , x n − 1 ] − f [ x 1 , … , x n ] x 0 − x n f[x_0,x_1,\ldots,x_n]=\frac{f[x_0,\ldots,x_{n-1}]-f[x_1,\ldots,x_n]}{x_0-x_n} f[x0,x1,…,xn]=x0−xnf[x0,…,xn−1]−f[x1,…,xn]
将函数 f ( x ) f(x) f(x)直到n阶均差列在一个表中,就得到了均差表 ( x y f [ x i , x j ] f [ x i , x j , x k ] … f [ x 0 , x 1 , … , x n ] x 0 y 0 x 1 y 1 f [ x 0 , x 1 ] x 2 y 2 f [ x 1 , x 2 ] f [ x 0 , x 1 , x 2 ] x 3 y 3 f [ x 2 , x 3 ] f [ x 1 , x 2 , x 3 ] … ⋮ ⋮ ⋮ ⋮ ⋮ x n y n f [ x n − 1 , x n ] f [ x n − 1 , x n − 1 , x n ] … f [ x 0 , x 1 , … , x n ] ) \begin{pmatrix} x&y&f[x_i,x_j]&f[x_i,x_j,x_k]&\ldots&f[x_0,x_1,\ldots,x_n]\\ x_0&y_0& & & &\\ x_1&y_1&f[x_0,x_1]& & &\\ x_2&y_2&f[x_1,x_2]&f[x_0,x_1,x_2]& & \\ x_3&y_3&f[x_2,x_3]&f[x_1,x_2,x_3]&\ldots&\\ \vdots&\vdots&\vdots&\vdots&\vdots&\\ x_n&y_n&f[x_{n-1},x_n]&f[x_{n-1},x_{n-1},x_n]&\ldots&f[x_0,x_1,\ldots,x_n] \end{pmatrix} ⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛xx0x1x2x3⋮xnyy0y1y2y3⋮ynf[xi,xj]f[x0,x1]f[x1,x2]f[x2,x3]⋮f[xn−1,xn]f[xi,xj,xk]f[x0,x1,x2]f[x1,x2,x3]⋮f[xn−1,xn−1,xn]……⋮…f[x0,x1,…,xn]f[x0,x1,…,xn]⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
已知 f ( x ) f(x) f(x)在节点 x 0 , x 1 , … , x n x_0,x_1,\ldots,x_n x0,x1,…,xn处的函数值为 { f ( x k ) } k = 0 n \{f(x_k)\}_{k=0}^n {f(xk)}k=0n,先构造均差表,然后取对角线作为系数构造n次牛顿插值公式 φ n ( x ) = f ( x 0 ) + f [ x 0 , x 1 ] ( x − x 0 ) + f [ x 0 , x 1 , x 2 ] ( x − x 0 ) ( x − x 1 ) + f [ x 0 , x 1 , … , x n ] ( x − x 0 ) ( x − x 1 ) … ( x − x n − 1 ) \varphi_n(x)=f(x_0)+f[x_0,x_1](x-x_0)+f[x_0,x_1,x_2](x-x_0)(x-x_1)\\ +f[x_0,x_1,\ldots,x_n](x-x_0)(x-x_1)\ldots(x-x_{n-1}) φn(x)=f(x0)+f[x0,x1](x−x0)+f[x0,x1,x2](x−x0)(x−x1)+f[x0,x1,…,xn](x−x0)(x−x1)…(x−xn−1)
牛顿插值公式计算比较方便,只需要计算均差就可以马上得到函数的表达式。
已知函数 f ( x ) f(x) f(x)在等距节点 x k = x 0 + k h ( k = 0 , 1 , … , n ) x_k=x_0+kh(k=0,1,\ldots,n) xk=x0+kh(k=0,1,…,n)的函数值为 f k = f ( x 0 + k h ) f_k=f(x_0+kh) fk=f(x0+kh),其中 h h h为步长。那么记 f ( x ) f(x) f(x)在节点 x 0 x_0 x0处的一阶向前差分为 Δ f k = f k + 1 − f k , k = 0 , 1 , … , n − 1 \Delta f_k=f_{k+1}-f_k,k=0,1,\ldots,n-1 Δfk=fk+1−fk,k=0,1,…,n−1 n阶向前差分 Δ n f k = Δ n − 1 f k + 1 − Δ n − 1 f k , n = 2 , 3 … \Delta^nf_k=\Delta^{n-1}f_{k+1}-\Delta^{n-1}f_k,n=2,3\ldots Δnfk=Δn−1fk+1−Δn−1fk,n=2,3…
用函数值表示二阶向前差分 Δ 2 f k = Δ f k + 1 − Δ f k = f k + 2 − 2 f k + 1 + f k \Delta^2f_k=\Delta f_{k+1}-\Delta f_k\\ =f_{k+2}-2f_{k+1}+f{k} Δ2fk=Δfk+1−Δfk=fk+2−2fk+1+fk
f [ x 0 , … , x n ] = 1 n ! h n Δ n f 0 f[x_0,\ldots,x_n]=\frac{1}{n!h^n}\Delta^nf_0 f[x0,…,xn]=n!hn1Δnf0 Δ n f 0 \Delta^nf_0 Δnf0是差分表中处在对角线的元素。
令 x = x 0 + t h x=x_0+th x=x0+th, x k = x 0 + k h , k = 1 , 2 , … , n x_k=x_0+kh,k=1,2,\ldots,n xk=x0+kh,k=1,2,…,n将均差表改为差分表,那么就得到了等距节点的Newton插值公式 φ n ( x ) = f 0 + t Δ f 0 + t ( t − 1 ) 2 ! Δ 2 f 0 + … + t ( t − 1 ) … ( t − n + 1 ) n ! Δ n f 0 \varphi_n(x)=f_0+t\Delta f_0 +\frac{t(t-1)}{2!}\Delta^2f_0+\ldots+ \frac{t(t-1)\ldots(t-n+1)}{n!}\Delta^nf_0 φn(x)=f0+tΔf0+2!t(t−1)Δ2f0+…+n!t(t−1)…(t−n+1)Δnf0
证明: 利用差分与均差的关系,可以的得到 f [ x 0 , … , x n ] ( x − x 0 ) … ( x − x n − 1 ) = 1 n ! h n Δ n f 0 ( x − x 0 ) … ( x − x n − 1 ) = 1 n ! h n Δ n f 0 h n t ( t − 1 ) … t ( t − n + 1 ) = t ( t − 1 ) … ( t − n + 1 ) n ! Δ n f 0 f[x_0,\ldots,x_n](x-x_0)\ldots(x-x_{n-1}) =\frac{1}{n!h^n}\Delta^nf_0(x-x_0)\ldots(x-x_{n-1})\\ =\frac{1}{n!h^n}\Delta^nf_0h^nt(t-1)\ldots t(t-n+1) =\frac{t(t-1)\ldots(t-n+1)}{n!}\Delta^nf_0 f[x0,…,xn](x−x0)…(x−xn−1)=n!hn1Δnf0(x−x0)…(x−xn−1)=n!hn1Δnf0hnt(t−1)…t(t−n+1)=n!t(t−1)…(t−n+1)Δnf0
设 φ n ( x ) \varphi_n(x) φn(x)是过点 x 0 , x 1 , … , x n x_0,x_1,\ldots,x_n x0,x1,…,xn的n次插值多项式, f ( x ) ∈ C [ a , b ] n f(x)\in\mathbf{C}_{[a,b]}^n f(x)∈C[a,b]n, f ( n + 1 ) ( x ) f^{(n+1)}(x) f(n+1)(x)在 [ a , b ] [a,b] [a,b]上存在,其中 [ a , b ] [a,b] [a,b]是包含节点的任意区间,则任意给定 x ∈ [ a , b ] x\in [a,b] x∈[a,b],总存在一点 ξ ∈ ( a , b ) \xi\in(a,b) ξ∈(a,b),使得余项 R n ( x ) = f ( x ) − φ n ( x ) = ω n ( x ) f [ x 0 , … , x n ] = f ( n + 1 ) ( ξ ) ( n + 1 ) ! ω n ( x ) R_n(x)=f(x)-\varphi_n(x)=\omega_n(x)f[x_0,\ldots,x_n] =\frac{f^{(n+1)}(\xi )}{(n+1)!}\omega_n(x) Rn(x)=f(x)−φn(x)=ωn(x)f[x0,…,xn]=(n+1)!f(n+1)(ξ)ωn(x) 其中, ω n ( x ) = ( x − x 0 ) … ( x − x n − 1 ) \omega_n(x)=(x-x_0)\ldots(x-x_{n-1}) ωn(x)=(x−x0)…(x−xn−1)