数值分析 笔记 6
函数逼近与函数插值
这两种方法本质上都是在用简单函数去近似复杂函数的过程,不同的是:
- 逼近要求整体上误差最小
- 插值要求在一些点上简单函数与原函数的值相等
函数逼近
函数逼近是指,对于给定函数 f(x),希望在某个函数空间 Φ 中找到一个函数 p(x),使得在某种度量意义下,误差函数 p(x)−f(x) 达到最小
通常 f(x) 是一个有表达式的复杂函数或者表格函数,而 Φ 通常有:多项式、有理分式、指数函数、三角函数、分段多项式等简单函数类
函数逼近的例子有很多,例如常见的 Taylor 展开、Fourier 变换、数据点拟合等等
我们通常使用函数空间上的范数来度量误差,C[a,b] 上常见的范数包括:
∣∣f(x)∣∣∞∣∣f(x)∣∣1∣∣f(x)∣∣2=x∈[a,b]max∣f(x)∣=∫ab∣f(x)∣dx=[∫abf2(x)dx]1/2
其中 2-范数又称内积范数,定义见下方
在这些范数中,使用 ∞-范数来度量误差是最优的,因为他规定了在整个定义域上两个函数都非常接近,这种逼近方式被称为最佳一致逼近
但是最佳一致逼近非常难以求解,而 1-范数实际上是考察两个函数图像之间的面积,误差较大,因此通常使用 2-范数来度量逼近误差,这被称为最佳平方(最小二乘)逼近
函数内积
函数内积定义为:
⟨u,v⟩=∫abu(x)v(x)dx
对于内积有 Cauthy-Schwarz 不等式:
∣⟨u,v⟩∣2≤⟨u,u⟩⟨v,v⟩
对于实内积空间 S 中的 n 个函数 u1,…,un,其线性无关的充要条件是 Gram 矩阵 G 非奇异,Gram 矩阵定义为:
Gij=⟨ui,uj⟩
由内积的对称性和正定性可以得到,非奇异的 Gram 矩阵是对称正定的
上述内积定义中,两个函数的地位是等价的,也就是内积的对称性,但是有的时候这并不是想要的,内积本质上是一种广义上的求和操作,因此根据加权求和的思想,引入加权内积
权函数 ρ(x) 定义为满足以下条件的函数:
- ∀x∈[a,b],ρ(x)≥0
- ∀k∈N,∫abxkρ(x)dx 是存在的
- 对于任意非负连续函数 g(x),若 ∫abg(x)ρ(x)dx=0,则 g(x)≡0,即ρ(x) 没有局部恒为 0 的情况
则定义加权内积为:
⟨u,v⟩=∫abρ(x)u(x)v(x)dx
最佳平方逼近
考虑函数类 Φ=span{φ1,…,φn},则我们需要找到 S(t)=i=1∑nxiφi(t),使得 ∣∣S(t)−f(t)∣∣2 最小
根据内积的双线性性与对称性,有:
F=∣∣S(t)−f(t)∣∣22=⟨i=1∑nxiφi−f,i=1∑nxiφi−f⟩=i=1∑nj=1∑nxixj⟨φi,φj⟩−2i=1∑nxi⟨f,φi⟩+⟨f,f⟩
因此:
∂xk∂F=2i=1∑nxi⟨φi,φk⟩−2⟨f,φk⟩
令所有的偏导数等于 0,可以得到一个线性方程组 Gx=b,其中 G 是 Gram 矩阵,b=[⟨f,φ1⟩,…,⟨f,φn⟩]T
如果这些函数线性无关,那么 G 是对称正定的,这个线性方程组有唯一解,并且可以证明这个解可以让误差度量达到最小值,几何意义上来说,这代表:
S∗−f⊥Φ
基函数线性无关时,最佳平方逼近算法
- 计算 Gram 矩阵 G
- 作 Cholesky 分解 G=LLT
- 解方程得到 x
多项式最佳平方逼近
可以取:Φ=Pn−1,即次数不超过 n−1 的所有多项式的集合
对于 [0,1] 区间,此时有:
⟨φi,φj⟩=∫01ti+j−2dt=i+j−11
即 G=Hn
根据 Weierstrass 定理,多项式可以对连续函数进行任意好的逼近,但是根据上述结论,其 Gram 矩阵会随着次数增大而极具病态,并且是稠密的,计算复杂度高
如果我们将基函数取成一组正交基,那根据正交的特性很容易得到,Gram 矩阵会变成对角阵!这种情况下解方程是非常容易的
此处的正交需要两两之间加权内积为 0,权函数选取不同可能会得出不同的结果,最 naive 的权函数是 ρ(x)≡1
可以通过 Gram-Schmidt 正交化的方式从 {1,t,…,tn−1} 得到一组正交多项式,具体来说:
φ1(t)φk(t)=1=tk−1−i=1∑k−1⟨φi(t),φi(t)⟩⟨tk−1,φi(t)⟩φi(t)
对于正交基,可以很方便地求出逼近结果:
S∗=k=1∑n⟨φk(t),φk(t)⟩⟨f(t),φk(t)⟩φk(t)
在选取不同的定义域与不同的权函数时,Gram-Schmidt 正交化的结果可以表示成不同的递推形式,如下表:
表中的递推式可以帮助我们方便的求出 φk
如果定义域不满足上表中的条件,可以使用线性映射的方式修改,例如对于 Legendre 多项式,从 [−1,1] 映射到 [a,b]:
s=2b−at+2b+a
因此映射后的 Legendre 多项式为:
Pk~(s)=Pk(b−a2s−(b+a))
注意在求和的时候计算系数与基函数都应该是映射后的
可以证明使用多项式来逼近的时候,逼近误差一致不大于 nε
在 n 充分大的时候度量方式为 2-范数,如果原函数二阶导连续,则可以扩展为 无穷范数
最小二乘法
与最佳平方逼近的思路大致相同,不同的是这种方法通常用于给定数据点对的表格,需要最优化的函数不再是内积范数,而是:
i=1∑m[S(ti)−f(ti)]2
本质上来说,定义在离散点处的表格函数也构成了一个线性空间,离散情况下,从连续区间上的函数变成了离散的向量,范数也从积分变成了求和,因此最小二乘是一种最佳平方逼近
法方程法
将表格函数定义为向量 f=[f(t1),…,f(tm)]T,则需要找到向量 x 使得 ∣∣Ax−f∣∣2 最小,其中 A∈Rm×n 定义为:
Aij=φj(ti)
A 的每一列代表的是一个基函数,每一行代表的是某一个基函数在不同输入下的函数值,因此可以写成:
A=[φ1,…,φn]
考虑到离散函数可以用向量来表示,而向量的范数就是对应下标元素求和的形式,因此:
G=ATAb=ATf
也即我们将最小二乘法转换为了最佳平方逼近的 Gx=b,如果表格基函数线性无关,也即 A 是列满秩的,那 Gx=b 一定存在唯一解
然而,通常最小二乘的使用场景都是拟合大量数据点,即 m>>n 时,但是这种情况下就会导致 Gx=b 并不等价于 Ax=f,甚至在列满秩的情况下很容易后者无解,不过可以证明的是 Gx=b 的解满足使得 ∣∣Ax−f∣∣2 最小
因此得到
表格基函数线性无关时,最小二乘法
- 计算系数矩阵 A
- 解方程 ATAx=ATf
对于连续函数来说,是否线性无关与输入没有关系,而对于表格函数来说,是否线性无关是与观测点的值有关的,并且观测点可能出现相同的(即一对多),有 Haar 条件:
若 ti 中至少有 n 个不同的值,则 Pn−1 对应的表格基函数是线性无关的
正交变换法
由于法方程法会面临最佳平方逼近的同样问题,因此我们仍然需要选取正交的表格基函数,一种可行的方法是 A 的 QR 变换:
由于正交变换不改变 2-范数,因此:
∣∣f−Ax∣∣2=∣∣QTf−Rx∣∣2
对于 A∈Rm×n,其对应的 QR 分解可以分块为:
Q=[Q1,Q2],R=[R1O]
其中 Q1∈Rm×n,R1∈Rn×n
则有:
∣∣QTf−Rx∣∣2=∣∣Q1Tf−R1x∣∣2+∣∣Q2Tf∣∣2≥∣∣Q2Tf∣∣2
当且仅当 Q1Tf=R1x 时取等
因此得到
表格基函数线性无关时,最小二乘法
- 计算系数矩阵 A
- 正交三角化 A 得到 R,同时变换 f 得到 QTf
- 取前 n 行,解方程 R1x=QTf
由于 R 是三角阵,因此解方程快速且稳定
函数插值
本质上是一种假设数据没有误差的时候做的函数拟合,我们用 P(x) 代表插值结果,则需要满足 P(xi)=yi
常见的插值函数包括多项式、三角函数、有理分式、分段函数等
多项式插值
对于有 n+1 个数据点的插值条件,我们可以使用 n 次多项式来进行插值,有代数基本定理可以知道,一定可以找到唯一的一个多项式满足条件
最直接的方式是求解线性方程组:
⎩⎨⎧a0+a1x0a0+a1x1a0+a1xn+⋯+anx0n=y0+⋯+anx1n=y1⋮+⋯+anxnn=yn
系数矩阵为 Vandermonde 矩阵:
A=11⋮1x0x1⋮xn⋯⋯⋱⋯x0nx1n⋮xnn
但是这个矩阵是稠密的,并且使用这种方法不利于分析,因此引入 Lagrange 插值法
Lagrange 插值
考虑 n=1 的情况,也就是使用一维方程(直线)去插值两个节点,我们可以使用经典的两点式直线方程得到结果:
y=x0−x1x−x1y0+x1−x0x−x0y1
这实际上可以看成是一些基函数的线性组合,系数为给定的函数值,即:
y=y0l0(x)+y1l1(x)
其中 l0(x) 与 l1(x) 都是一次函数,并且满足 l0(x0)=l1(x1)=1,l0(x1)=l1(x0)=0
这就是最基础的 Lagrange 插值
扩展到更高维的形式,则插值函数为:
Ln(x)=k=0∑nyklk(x)
基函数 lk(x) 的次数也为 n,并且满足:
lk(xi)={10i=ki=k
确定基函数最简单的方式是利用给定的 n 个零点,这可以得到一个成比例的函数簇,之后根据 xk 处的函数值求出系数即可
具体来说,令:
ωn+1(x)=i=0∏n(x−xi)
则有ωn+1(xi)≡0
对其求导:
ωn+1′(x)=j=0∑n(i=0i=j∏n(x−xi))
因此:
ωn+1′(xk)=i=0i=k∏n(xk−xi)=(x−xk)ωn+1(x)
遂得到基函数表达式:
lk(x)=(x−xk)ωn+1′(xk)ωn+1(x)
我们定义 Rn(x)≡f(x)−Pn(x) 为插值余项,则 Lagrange 插值的余项为:
Rn(x)=(n+1)!f(n+1)(ξ(x))ωn+1(x)
其中 ξ(x)∈(a,b)
证明方法是根据 Rn(x) 在所有的插值点上的值为 0,则其可以写成 Rn(x)=g(x)ωn+1(x) 的形式
为了求出 g(x),取一个无关辅助变量 t,构造函数
φ(t)=f(t)−Ln(t)−g(x)ωn+1(t)
则 φ(t) 有 n+2 个根 x,xi(i=0,…,n),不断使用罗尔定理,可以得到:
φ(n+1)(ξ)=f(n+1)(ξ)−g(x)(n+1)!
即得到:
g(x)=(n+1)!f(n+1)(ξ)
但是 Lagrange 插值有一个巨大的问题,即在插值点有变动的时候,插值函数的变动非常巨大,开销太大,因此引入 Newton 插值
Newton 插值
Newton 插值的主要思想是逐步增加插值点的数目,逐步增加高次项,而不是每一个插值点都使用同样次数的基函数
扩展方式为:
Pn(x)=Pn−1(x)+cnωn(x)
最终公式为:
Nn(x)=i=0∑nciωi(x)
为了求出系数 ci,我们引入函数差商的概念,函数的 k 阶差商是如下递归定义出来的:
f[x0]f[x0,x1,…,xk]=f(x0)=xk−xk−1f[x0,…,xk−2,xk]−f[x0,x1,…,xk−1]
可以归纳证明出:
f[x0,…,xk]=i=0∑kωk+1′(xi)f(xi)
直接取 ck=f[x0,…,xk] 即可,此时余项为:
Rn(x)=f[x,x0,…,xn]ωn+1(x)
在使用 Newton 插值的过程中,可以使用 Nk+1(x)−Nk(x) 或者余项来判断是否需要使用新的插值点
分段多项式插值
对于上述的多项式插值有一些很显著的问题:
- 数值稳定性差,容易被异常数据影响
- 无法保证曲线的单调性和凸性
- 容易出现过拟合(Runge 现象:n越高对曲线的拟合效果不一定越好)
可以采用分段多项式插值的方式来修改
分段线性插值
定义 x−1=x0<x1<⋯<xn=xn+1
则基函数定义为:
li(x)=⎩⎨⎧xi−xi−1x−xi−1xi−xi+1x−xi+10xi−1≤x≤xixi≤x≤xi+1others
也即每两个数据点之间是线性的
令
Ih(x)=i=0∑nyili(x)
为分段线性插值结果,则每个小区间上的余项都是一个二阶的 Lagrange 余项,则可以证明:
若 f(x)∈C2[a,b],则:
h→0limIh(x)=f(x)
其中 h=1≤i≤nmax(xi+1−xi)