计算方法(二):n次多项式插值

mac2024-04-05  36

插值法的基本思想

基本思想: 给出函数 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次多项式插值。

n次Lagrange插值

1. 基本思想

给出函数 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=y1a0+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=111x0x1xnx0nx1nxnn 它的行列式 ∣ A ∣ = ∏ j ≠ i ( x j − x i ) |\mathbf{A}|=\prod_{j\neq i}(x_j-x_i) A=j=i(xjxi)。当 ∣ A ∣ ≠ 0 |\mathbf{A}|\neq0 A=0时可以解出唯一解。

这种方法的缺点是计算量太大。

2. n次插值基函数

为了利于编程,可以将 φ ( 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=0nyklk(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)=(xix0)(xixi1)(xixi+1)(xixn)(xx0)(xxi1)(xxi+1)(xxn)

3. 程序实现

%Lagrange插值函数(保存为lagrange.m) function y = lagrange(x0, y0, x) %x0,y0是插值节点 %x是待计算其它点,y为这些点上的函数值 n=length(x0); m=length(x); for i = 1:m z = x(i); y(i) = baseLagrange(x0, y0, z, n); end %嵌套插值基函数 function s = baseLagrange(x0, y0, z, n) s = 0.0; for k = 1:n p = 1.0; for j = 1:n if j ~= k p = p*(z - x0(j))/(x0(k) - x0(j)); end end s = p*y0(k) + s; end end end

n次Newton插值

1. 均差

函数 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]=xixjf(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]=xixkf[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]=x0xnf[x0,,xn1]f[x1,,xn]

2. 均差表

将函数 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} xx0x1x2x3xnyy0y1y2y3ynf[xi,xj]f[x0,x1]f[x1,x2]f[x2,x3]f[xn1,xn]f[xi,xj,xk]f[x0,x1,x2]f[x1,x2,x3]f[xn1,xn1,xn]f[x0,x1,,xn]f[x0,x1,,xn]

3. Newton插值函数的表达式

已知 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](xx0)+f[x0,x1,x2](xx0)(xx1)+f[x0,x1,,xn](xx0)(xx1)(xxn1)

牛顿插值公式计算比较方便,只需要计算均差就可以马上得到函数的表达式。

差分Newton插值公式

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+1fk,k=0,1,,n1 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=Δn1fk+1Δn1fk,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+22fk+1+fk

2. 差分与均差

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是差分表中处在对角线的元素。

3. 等距节点的差分插值表达式

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(t1)Δ2f0++n!t(t1)(tn+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](xx0)(xxn1)=n!hn1Δnf0(xx0)(xxn1)=n!hn1Δnf0hnt(t1)t(tn+1)=n!t(t1)(tn+1)Δnf0

n次插值多项式的余项

定理

φ 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)=(xx0)(xxn1)

结尾

Lagrange插值和Newton插值是同一类型的插值Newton插值使用均差表,计算比Lagrange插值方便实际应用中并不常用这两种插值。
最新回复(0)