函数近似主要想解决的问题是,如果我们只知道一个函数的有限值,如何尽量精确地补齐这个函数的其他值
本节将主要介绍两种方法
暂时省略
# Lagrange 插值
作为数学事实,如果我们能唯一确定相异的 n+1 个点 x0,x1,…,xn 上的函数值 f(x0),f(x1),…,f(xn),就可以唯一确定一个 n 次多项式 P 使得 P(xk)=f(xk) 对于 k=0,1,…,n 都成立
该多项式称为函数 f 在点 x0,x1,…,xn 处的 Lagrange 插值多项式
令多项式的形式为
p(x):=k=0∑nakxk
我们想要求解出系数 ak,根据条件,应该有 n+1 个方程
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧a0+a1x0+⋯+anx0n=f(x0)a0+a1x1+⋯+anx1n=f(x1)⋯a0+a1xn+⋯+anxnn=f(xn)
将其改写为矩阵形式
⎝⎜⎜⎜⎜⎛11⋮1x0x1⋮xn⋯⋯⋱⋯x0nx1n⋮xnn⎠⎟⎟⎟⎟⎞⎝⎜⎜⎜⎜⎛a0a1⋮an⎠⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎛f(x0)f(x1)⋮f(xn)⎠⎟⎟⎟⎟⎞
注意看系数矩阵,其行列式为 Vandermonde 行列式,因此
∣∣∣∣∣∣∣∣∣∣11⋮1x0x1⋮xn⋯⋯⋱⋯x0nx1n⋮xnn∣∣∣∣∣∣∣∣∣∣=0≤j<k≤n∏(xk−xj)=0
这说明系数矩阵可逆,因此方程组有唯一解,进而多项式 P 也唯一存在
实际上,也可以直接写出多项式 P 的表达式
p(x)=k=0∑nf(xk)j=0,j=k∏nxk−xjx−xj
接下来考察 Lagrange 插值的误差,令误差函数
E(x):=f(x)−p(x)
选取并固定一个点 x,令
F(z):=E(z)−E(x)∏k=0n(x−xk)∏k=0n(z−xk)
由于对于点 x0,x1,…,xn,Lagrange 插值多项式 p 都与函数 f 的值一致,因此 E(xk)=0,并且对于所固定的 x,F(x)=0,也就是说 F(z) 在 n+2 个点上取值为 0
对其重复应用 n+1 次 Rolle 定理,可以得到 F(n+1)(ξ)=0
再注意到 p(x) 是 n 次多项式,因此 p(n+1)(x)=0
综上所述
F(n+1)(ξ)=f(n+1)(ξ)−E(x)∏k=0n(x−xk)n!=0
移项得到
E(x)=n!f(n+1)(ξ)k=0∏n(x−xk)
也就是说,通过差值区间上函数的 n+1 阶导数的最大值与差值区间长度的 n+1 次幂的乘积,可以估计出 Lagrange 插值的误差
接下来考虑如何计算 Lagrange 插值多项式 p 的值,直接套用其定义式会有 O(n2) 的时间复杂度,我们将引入 Neville 迭代法
我们想要通过 n+1 个点来近似一个 n 次多项式 p(x)
该算法的核心思想是:
- 先移除最末尾的一个点,转为用 n 个点近似 n−1 次多项式的问题,并假设已经得到了这么一个多项式 q(x)
- 再移除最前面的一个点,转为用 n 个点近似 n−1 次多项式的问题,并假设已经得到了这么一个多项式 r(x)
通过
p(x)=xn−x0(x−x0)q(x)−(x−xn)r(x)
就可以简单地得到 p(x) 的值
以下开始算法说明,给定 n+1 个点 x0,x1,…,xn 与函数值 f(x0),f(x1),…,f(xn),以及一个点 α,我们想要计算 p(α) 的值
- 将 x0,x1,…,xn 按照靠近 α 的程度进行排序并重新编号
- 对于每个 m=0,1,…,n,定义起始值 Pm,0:=f(xm)
- 逐一开始迭代,选取点 xm,并在 ℓ=0,1,…,m 下循环计算
Pm,ℓ:=xm−xm−ℓ(α−xm−ℓ)Pm,ℓ−1−(α−xm)Pm−1,ℓ−1
- 最后 Pn,n 就是 p(α) 的值
# Spline 插值
在点数较多的情况下,Lagrange 插值的误差会变得非常大,因此我们需要引入 Spline 插值来解决问题