【高等数值分析】多项式插值

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++anxnPn

根据插值条件 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=inxixkxxk={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(xxk)

插值余项的证明 ∀ 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)=Nn1(x)+anwn(x)
其中 N n − 1 ( x ) N_{n-1}(x) Nn1(x) { x 0 , . . . , x n − 1 } \{x_0,...,x_{n-1}\} {x0,...,xn1} 的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)Nn1(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=0nf[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]=xnx0f[x1,...,xn]f[x0,...,xn1]
证明:取 P n − 1 ( x ) ∈ P n − 1 P_{n-1}(x)\in{\mathcal P}_{n-1} Pn1(x)Pn1 满足 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 Pn1(xi)=f(xi),i=0,1,...,n1 Q n − 1 ( x ) ∈ P n − 1 Q_{n-1}(x)\in{\mathcal P}_{n-1} Qn1(x)Pn1 满足 Q n − 1 ( x i ) = f ( x i ) , i = 1 , 2 , . . . , n Q_{n-1}(x_i)=f(x_i),i=1,2,...,n Qn1(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)=xnx0xx0Qn1(x)+xnx0xnxPn1(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=0n(xxi)
证明:类似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 x0x1xn,那么均差的计算方法为
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]={xnx0f[x1,...,xn]f[x0,...,xn1],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,βiP2n+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=0n[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子空间方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值