外观
Lesson 7 插值法 III
约 3177 字大约 11 分钟
2026-03-13
Part 4 函数的近似与计算
本节我们讨论函数的近似与计算问题。我们将分为几类的函数的计算。一类是函数具有明确的表达式的计算问题。另一类是用某种函数近似后进行的数值计算。
· 级数表达
很多函数是以级数的形式表达的 (比如 Bessel 函数、Legendre 函数等等)。很多函数实际上也是这样去计算的。需要指出的是,尽管某些函数的级数展开在数学上是收敛的,但是直接按照级数去计算往往并不是最合适的方法。典型的例子如
sinx=k=1∑∞(−)k−1k!xk .
我们知道这个级数对于任意的 ∣x∣ 都是收敛的,但是如果 ∣x∣≥1,那么直接这么计算需要求和的项数是比较多的。事实上,一种更为有效的做法是首先将 x 化到第一或第四象限:x∈[−π/2,π/2],然后我们可以利用公式: sinx=3sin(x/3)−4sin3(x/3) 将其化为计算较小的角度 (x/3) 的正弦问题。当然,这个过程可以进一步迭代直到 (x/3) 足够地小以至于一两项级数就足以满足精度要求为止。当然更为现代一些的算法是利用我们后面提及的 Chebyshev 近似来进行计算。事实上,多数的超越函数都可以利用 Chebyshev 近似的方法进行计算。
· Chebyshev 近似
Chebyshev 多项式是个好东西。它可以用来近似很多的函数。事实上,它在数值计算中是如此有用以至于我们通常的很多函数,甚至是一些初等的函数,都可以利用 Chebyshev 进行展开和计算。
对于任意的 x∈[−1,1],我们可以定义 n 阶的第一类 Chebyshev 多项式 Tn(x),它可以明确地写为,1
Tn(x)=cos(narccosx) .(g)
对于最低的几个多项式,我们很容易写出它的明确表达式:
T0(x)T1(x)T2(x)T3(x)Tn+1(x)=1=x=2x2−1=4x3−3x⋯=2xTn(x)−Tn−1(x)n≥1 .
Chebyshev 多项式满足一系列重要的性质。其中一个比较重要的是它的正交归一性,
∫−111−x2Ti(x)Tj(x)dx=⎩⎨⎧0π/2πi=ji=j=0i=j=0
另一个比较重要的性质是其零点以及极值点的位置。Tn(x) 在 [−1,1] 之中恰好有 n 个零点,它们的位置由下式给出:
xk=cos(nπ(k+1/2)) , k=0,1,⋯,n−1 .(h)
而它的极值点共有 (n+1) 个,其位置为,
xk=cos(nπk) , k=0,1,⋯,n .
符号 T 是因为 Chebyshev 有时候又曾译为 Tchebycheff。
在这些极值点处,Chebyshev 多项式恰好等于 +1(极大值) 或 −1(极小值)。也就是说,Chebyshev 多项式的绝对值总是在 1 以下的。正是这个特性使得它成为近似任意函数的有力工具,因为它可以很好地控制误差。
最后一个重要的性质是分立版本的正交归一关系。令 xk 是由式 (h) 给出的 Tn(x) 的 n 个零点,那么对于 i,j<n,我们有,
k=0∑n−1Ti(xk)Tj(xk)=⎩⎨⎧0n/2ni=ji=j=0i=j=0
利用上面给出的正交归一关系我们可以证明,对于任意的一个定义在 [−1,1] 上面的函数 f(x),我们可以构建 N 个系数 cm, m=0,1,⋯,N−1 如下,
cm=N2k=0∑N−1f[cos(Nπ(k+1/2))]cos(Nπm(k+1/2)) .
然后我们可以用下面的式子来近似表达目标函数 f(x):
f(x)≈2c0+k=1∑N−1ckTk(x) .(i)
事实上,利用前面的表达式可以很容易证明,恰好在 TN(x) 的零点处这个表达式是严格成立的 (如果不计舍入误差的话)。即使不在这些零点处,这个表达式也给出了函数 f(x) 的一个非常好的近似。
我们运用 Chebyshev 最多的时候并不是利用很大的 N 的时候,而是往往利用不那么大 N 的时候。由于 Chebyshev 具有模永远小于 1 的特性,因此它可以很好地控制误差。例如,对于给定区间 [−1,1] 上的任意函数 f(x) 和给定的阶 N,我们可以试图寻找一个阶数不超过 N 的多项式 pN(x),使得它与函数 f(x) 的差的绝对值的最大值取极小,即 maxx∈[−1,1]∣f(x)−pN(x)∣ 取极小。
这样得到的多项式 pN(x) 称为给区间上到指定阶 N 的最小偏离多项式 (minimax polynomial)。
要求出一个函数的最小偏离多项式并不是很简单的事情,而且计算也颇费周章。但是函数的 Chebyshev 多项式展开 (i) 提供了一个非常好的近似。换句话说,它非常接近于相应的最小偏离多项式,而且其计算也方便很多。
由于截断到 N 阶的近似式的下一阶是 cNTN(x) 而 ∣TN(x)∣≤1,因此误差主要由 ∣cN∣ 的大小来控制。一般来说随 N 的增加 cN 衰减得非常快 (如果函数足够光滑的话,它们随着 N 的增加是指数衰减的),所以我们往往仅仅需要几阶就够了。这正是 Chebyshev 强大的地方。
大家也许觉得这些展开很像 Fourier 展开,对吧。其实它们就是。或者说从数学上证明这些结论我们就就是需要利用 Fourier 展开的定理。这当然也不奇怪,因为 Chebyshev 多项式的定义 (g) 本身就是利用三角函数给出的。顺便指出的是,下面的展开式还有另外的一种常用的写法: f(x)≈−2c0+∑k=0N−1ckTk(x)。由于其中对于 k 的求和从 k=0 开始,而 T0(x)≡1,因此这个表达式与 (i) 是完全一致的。
· Padé 近似
一个函数 f(x) 如果我们知道了它的 Taylor 展开的部分系数,我们还可以利用一个分式来近似地表示这个函数。如果我们令,
R(x)=1+∑k=1Nbkxk∑k=0Makxk .
我们期待它可以近似
f(x)=k=0∑∞ckxk .
我们要求,
R(k)(x)∣x=0=f(k)(x)∣x=0 , k=0,1,⋯,M+N
并称 R(x) 是函数 f(x) 的一个 (M,N) 阶的 Padé 近似式。
假定所有的 Taylor 展开系数 ck 已知,那么最为简单的计算 Padé 近似式的各个系数 ak 和 bk 的方法是令 f(x)=R(x) 并将分母乘到等式的左边,然后比较两边 x 同幂次的系数。在假定 M=N 的情形下,这给出如下的方程,
m=1∑NbmcN−m+km=0∑kbmck−m=−cN+k , k=1,⋯,N ,=ak , k=1,⋯,N ,
上式中的前一个方程可以视为 (b1,⋯,bN) 的一个线性方程,求解这个方程我们就可以获得系数 (b1,⋯,bN),再带入第二个方程就可以获得系数 (a1,⋯,aN)。另一方面,我们必须有 a0=c0。显然,要能够确定解出所有的系数,我们需要首先知道 ck, k=0,1,⋯,2N 这 (2N+1) 个展开系数。
Padé 近似最经常的应用是为一个比较短的级数展开式“续命”。比如说我们在一个复杂的微扰计算中获得了某个函数的 Taylor 展开中的前 5 项,进行后续的展开实在是太过繁琐。但是有时候我们又希望将这个展开应用到比较大的 x 的区域。我们就可以利用 Padé 近似来到达这个“偷懒”的目的。一般来说,Padé 近似的优点和缺点是并存的。优点是,它可能会工作得很好,甚至出奇的好;当然,它也可能完全不行,甚至在相当多的情况下误导我们的判断。换句话说,它是一个不太靠谱的近似。但是它一般不会比你原先的 Taylor 展开式更差。从这个角度来说,如果你并不想继续计算下一阶的系数,那么你没有失去什么。当然,你也没有百分之百得到什么,因为 Padé 给出的结果并不可靠。
Numerical Recipes 给出了一个十分有趣的例子。假定经过复杂的解析计算——比如说通过量子场论中一个复杂过程的大量四圈以下的费曼图的计算——你获得了一个重要的物理量 f(x) 作为一个小的耦合参数 x 的微扰展开式:
f(x)≈2+91x+811x2−874849x3+78732175x4+⋯ .(j)
它实际上是你感兴趣的物理量 f(x) 在 x=0 处的 Taylor 展开的前 5 项。在 x 比较小的时候——比如说 x≲1 的时候——这个表达式被大量的实验证明是相当精确的。但是假定我们希望研究 x≳1 时的 f(x) 的情况。当然,我们可以试图去计算下一阶的贡献。这意味着需要计算一系列的五圈图,而这注定是一个无法完成的任务,因为需要计算的费曼图的数目和计算量随着圈数的增加是指数增长的。事实上,上面的那个展开式恰好是下列函数的 Taylor 展开:
f(x)=[7+(1+x)4/3]1/3 .(k)
假如 x 的绝对值不是很大,那么上面的展开式 (j) 与严格的函数 (k) 本身的差别很小;大约从 x≥2 起两者的差别才变得明显。但是如果你并不知道函数的严格表达式 (k),同时又没有能力去计算下一阶的贡献,这时候不妨试试 Padé 近似。仅仅使用已知的 5 个系数来构建相应的 Padé 近似式并与函数进行比较后我们会发现,即使到大约 x≈10,Padé 近似式与严格函数的差别都是可忽略的,而对于相应的 Taylor 展开,如果 x 超过 2 就已经相当明显地偏离了。在这个例子中,Padé 近似几乎就是一个奇迹。
Part 5 数值微分的计算
本节我们讨论导数的计算问题。数值上计算函数的导数实际上主要从导数的定义出发。
f′(x)≃hf(x+h)−f(x) , h→0 .
也就是说,近似计算一个点 x 处的导数,我们需要计算两次函数。事实上,这并不是最佳的计算方法。对于比较光滑的函数来说,同样是计算 x 处的导数,我们宁愿计算,
f′(x)≃2hf(x+h)−f(x−h) , h→0 .
对于同样大小的 h,这个方法比起上面的拿衣服的方法要好很多。它的截断误差是正比于 h2 而不是 h 的。另一方面,计算还有舍入误差。事实上,如果真的利用这种方法来计算导数,我们可以选择一些优化的间隔 h 以尽可能地减少舍入误差和截断误差。
另外一种更好的方法是利用函数本身的 Chebyshev 近似式。正如我们上节所说,如果我们有,
f(x)≈k=0∑NckTk(x) ,
那么我们同样可以获得 f′(x) 的 Chebyshev 展开式,
f′(x)≈k=0∑Nck′Tk(x) ,
其中的系数 ck′ 与原先的系数之间的关系为,
cN′ck−1′=cN−1′=0 ,=ck+1′+2kck ,(k=N−1,N−2,⋯,1)
事实上,有了函数的 Chebyshev 近似式,除了可以计算它的导数 (微分) 之外,还可以计算其积分。这就获得了一个近似的积分表达式,而这是我们下一章中需要讨论的内容。
更新日志
2026/10/7 03:54
查看所有更新日志
98079-修正于76ef6-computational-physics于