Skip to content

5.6 函数列、函数项级数与一致收敛 ​

前五节讨论的对象都是数:数列、级数、函数在某点的极限。本节把讨论的对象换成函数。函数列 {fn} 的极限是一个函数 f,这个说法有两种解释方式,两者的差别决定了极限运算能否与连续、积分、求导交换次序。5.5 节末尾留下的问题正是这个:积分与极限交换需要什么条件。答案是一致收敛,它是逼近理论、数值分析与后续 Fourier 分析共同的前提。

本节按三条线索展开。语言线索给出两种收敛的定义与判别工具:逐点收敛只看每个固定点上的数列,一致收敛要求误差在整段区间上被同一个量控制,用上确界范数写出就是 ∥fn−f∥∞→0。定理线索处理极限交换:一致收敛时极限函数连续、积分可以交换次序、在导函数一致收敛时求导也能交换。这条线索的反面例子很重要,实验一用 xn 与 nxe−nx2 两个函数列说明逐点收敛不足以保证任何一条性质。逼近线索把一致收敛当作「用简单函数逼近复杂函数」的工具:Weierstrass 逼近定理说明闭区间上的连续函数可以用多项式一致逼近,Bernstein 多项式给出显式构造,实验二实测它的收敛速率;插值是多项式逼近的另一条路线,等距节点会产生 Runge 现象,Chebyshev 节点则收敛,实验三给出两列对照数据。

5.6.1 函数列的收敛 ​

逐点收敛 ​

设函数列 {fn} 与函数 f 都在集合 E 上有定义。若对每个固定的 x∈E,数列 {fn(x)} 收敛到 f(x),称 {fn} 在 E 上逐点收敛于 f:

∀x∈E, ∀ε>0, ∃N(ε,x), ∀n>N,|fn(x)−f(x)|<ε

注意 N 依赖于两个变量:误差要求 ε 与位置 x。这个依赖性是一致收敛与逐点收敛的全部差别所在。把定义按集合的量词顺序读一遍,逐点收敛是「先取点、再取 N」,不同点上的收敛速度可以完全不同。

例:fn(x)=xn 在 [0,1] 上逐点收敛。x<1 时 xn→0(几何数列),x=1 时 xn=1→1,因此极限函数是

f(x)={0,0≤x<11,x=1

每个 fn 都连续,极限函数在 x=1 处间断。连续性被逐点收敛破坏了。

例:gn(x)=nxe−nx2 在 [0,1] 上逐点收敛于 f≡0。每个固定点上 ne−nx2 随指数衰减,乘积趋于零。积分方面

∫01gn(x)dx=[−12e−nx2]01=12(1−e−n)→12

而极限函数的积分是 ∫010dx=0。积分与极限不能交换。原因在于 gn 的峰值随 n 增大(在 x=12n 处取到 n2e),峰宽同时收窄,面积保持 12 左右,逐点收敛只看到每个点最终落到零,看不到这个「移动的尖峰」在累积量上的贡献。

一致收敛 ​

若 fn 与 f 满足

∀ε>0, ∃N(ε), ∀n>N, ∀x∈E,|fn(x)−f(x)|<ε

称 {fn} 在 E 上一致收敛于 f。量词顺序的改变带来实质差别:N 只依赖于 ε,一个 N 对整段区间上的所有点同时有效。

用上确界范数(一致范数)可以把定义写成一句话:

∥fn−f∥∞=supx∈E|fn(x)−f(x)|→0(n→∞)

上确界范数度量的是两条曲线之间的最大竖直距离,一致收敛就是「最大距离趋于零」。一致收敛蕴含逐点收敛,反之不成立:xn 在 [0,1] 上的最大距离是 sup[0,1]|xn−f(x)|=1(在 x→1− 处趋近 1,x=1 处等于 0,上确界仍为 1),不趋于零。把区间改成 [0,0.99] 之后最大距离是 0.99n→0,一致收敛成立。这个例子里「一致」与否取决于区间是否包含端点附近,端点处的收敛速度被端点本身拖慢了。

几何含义:一致收敛等价于对任意 ε>0,存在 N 使得 n>N 时函数 fn 的图像整体落在 f 图像上下各 ε 宽的「带子」内。逐点收敛对每个 ε 都能找到带子,但带子的宽度依赖 x,无法用一条带子一次罩住整段。

逐项检验的一致性:验证一致收敛的常用路径是先求出极限函数,再计算 sup|fn−f| 并判断它是否趋于零。直接算上确界困难时可以求导找极值点(实验一第二组就是这样处理 gn 的),或者用下面给的判别工具。

5.6.2 一致收敛与极限交换 ​

一致收敛的价值体现在三条交换性质上。

连续性 ​

设 {fn} 在 E 上一致收敛于 f,且每个 fn 在 x0∈E 连续,则 f 在 x0 连续。证明用 ε3 的分解:

|f(x)−f(x0)|≤|f(x)−fn(x)|+|fn(x)−fn(x0)|+|fn(x0)−f(x0)|

由一致收敛,第一项与第三项对充分大的 n 一致地小于 ε3(与 x 无关,这是关键);固定这个 n 后,由 fn 在 x0 连续,第二项在 x 足够接近 x0 时小于 ε3。三段合起来得 |f(x)−f(x0)|<ε。逐点收敛时第一项的上界依赖 x,无法先固定 n 再讨论 x 的邻域,证明失败,xn 的例子显示结论确实不成立。

推论:一致收敛的连续函数列,其极限函数连续。这条推论在应用中常反过来用:若极限函数不连续,则收敛不可能是一致的。

积分交换 ​

设 {fn} 在 [a,b] 上 Riemann 可积且一致收敛于 f,则 f 在 [a,b] 上可积,且

limn→∞∫abfn(x)dx=∫ablimn→∞fn(x)dx=∫abf(x)dx

证明的关键是误差的积分估计:

|∫abfn−∫abf|≤∫ab|fn−f|≤(b−a)∥fn−f∥∞

右端趋于零。一致收敛把「函数值差的上界」变成「积分差的上界」,这一步在逐点收敛时没有。实验一的第二组数据说明这个条件是必要的:gn 逐点收敛到零但积分趋于 12,∥gn∥∞=n2e→∞,一致收敛不成立。

求导交换 ​

求导对一致收敛的要求更强,因为导数放大高频振荡。设 fn 在 [a,b] 上可导,{fn} 在某个点 x0 收敛,且导函数列 {fn′} 在 [a,b] 上一致收敛于 g,则 {fn} 一致收敛于某个可导函数 f,且 f′=g:

(limn→∞fn)′=limn→∞fn′

证明用中值定理把 fn−fm 的差表示成 (fn′−fm′) 的积分形式,再用 {fn′} 的一致收敛给出 Cauchy 估计,最后用 5.4 节的导数定义完成极限交换。注意假设针对的是导函数列,不是函数列本身:sin⁡(nx)n 一致收敛到零,导数 cos⁡(nx) 不一致收敛,求导交换失效。这条结论在含参积分求导、级数求和求导与偏微分方程的解的正则性分析中反复使用。

一个直观的说明

一致收敛控制的是「函数的整体形状」,逐点收敛只控制「每个点的最终值」。求导是对形状的敏感运算:函数值的一致小不能保证导数的一致小(sin⁡(nx)n 就是例子),因此求导交换需要把一致收敛的条件加在导数上。积分相反,它对形状的变化不敏感(有平滑作用),因此对函数列本身一致收敛即可。

5.6.3 函数项级数 ​

把函数列换成部分和,就得到函数项级数 ∑k=1∞uk(x)。级数在 E 上一致收敛指部分和函数列 Sn=∑k=1nuk 一致收敛。一致收敛的级数继承函数列的三条交换性质:和函数连续、可以逐项积分、在导级数一致收敛时可以逐项求导。

Weierstrass 判别法 ​

若存在收敛的正项级数 ∑Mk 使得

|uk(x)|≤Mk,∀x∈E, k=1,2,…

则 ∑uk(x) 在 E 上一致收敛(且绝对收敛)。这条判别法称 M 判别法(Weierstrass 判别法)。证明直接用 Cauchy 准则与三角不等式:

|∑k=mnuk(x)|≤∑k=mn|uk(x)|≤∑k=mnMk<ε

右端与 x 无关,一致 Cauchy 条件成立。例:∑k=1∞sin⁡(kx)k2 在 R 上一致收敛(取 Mk=1k2),和函数处处连续;由 |sin⁡(kx)k2|≤1k2 得到的一致上界还可以直接用于逐项积分的误差估计。

一般的判别工具 ​

M 判别法要求绝对收敛,条件收敛的情形需要更细的工具。

一致 Cauchy 准则:∑uk 在 E 上一致收敛,等价于对任意 ε>0 存在 N,使得 n>m>N 时 |∑k=m+1nuk(x)|<ε 对所有 x∈E 成立。

Dini 定理:设 uk 在紧集 E 上连续、uk≥0,∑uk(x) 在 E 上逐点收敛于连续函数 S(x),则收敛是一致的。这条定理用「逐点收敛 + 单调性 + 极限函数连续」换来了「一致收敛」,在证明 Fourier 级数与概率母函数的结论时常用。

Abel 与 Dirichlet 的一致形式:把数项级数的判别法逐字搬到函数项可以得到 ∑ak(x)bk(x) 的一致收敛判据。Dirichlet 形式假设 {bk(x)} 对每个 x 单调且一致趋于零,ak 的部分和有界(一致界),结论是一致收敛。例:∑k=1∞(−1)kk+x 在 [0,1] 上一致收敛,bk=1k+x 一致趋于零,ak=(−1)k 的部分和取值为 0 与 −1。

幂级数的一致收敛 ​

幂级数 ∑akxk 有收敛半径 R。在 |x|≤r<R 的任意闭区间上,由 |akxk|≤|ak|rk 与 ∑|ak|rk 收敛得 M 判别法的条件成立,幂级数一致收敛。这个「在半径内部的任意紧子集上一致收敛」(内闭一致收敛)是幂级数全部交换性质的来源:和函数在 (−R,R) 内连续、可逐项积分、可逐项求导,求导后半径不变。5.7 节会把这些结论用于 Taylor 级数与正交展开。

5.6.4 逼近定理 ​

一致收敛的一个主要用途是用简单的函数类逼近复杂的函数类。核心结论是 Weierstrass 逼近定理。

Weierstrass 逼近定理:设 f 在 [a,b] 上连续,则对任意 ε>0 存在多项式 P 使得

∥f−P∥∞=maxx∈[a,b]|f(x)−P(x)|<ε

也就是说,闭区间上的连续函数可以用多项式一致逼近到任意精度。这条定理的意义在于「连续函数」与「多项式」两类看似相距很远的对象之间架了桥:多项式只有加乘两种运算,容易求值、求导、积分,是计算上的好对象;连续函数是应用中出现的对象。定理说明逼近在精度意义上没有损失,代价是多项式次数随精度要求上升。

Bernstein 构造给出证明。对 f∈C[0,1] 定义

Bnf(x)=∑k=0nf(kn)(nk)xk(1−x)n−k

右端的权重是二项分布的概率质量函数(参数 n 与 x),因此 Bnf(x) 是 f 在二项分布下的期望:取 X∼Bin(n,x),则 Bnf(x)=E[f(Xn)]。证明一致性用 f 的连续模(5.3 节)与二项分布的方差 Var(Xn)=x(1−x)n≤14n:由 f 一致连续,|f(kn)−f(x)| 在 |kn−x| 小时小,这个事件之外的尾部概率被方差控制(用 Chebyshev 不等式或 Bernstein 不等式),量级为 14nε2,趋于零。结论:Bnf 在 [0,1] 上一致收敛于 f,收敛速率由 f 的连续模决定:

∥Bnf−f∥∞≤32ωf(1n)

其中 ωf 是连续模。对 Lipschitz 连续的函数 ωf(δ)≤Lδ,速率是 O(n−1/2);对可导且导数 Lipschitz 的函数,通过 Voronoi 估计可以提高到 O(n−1)。实验二用 f(x)=|x−12| 验证这个速率:它是 Lipschitz 连续的(L=1)但在 12 处不可导,实测误差乘以 n 稳定在 0.3988,与 O(n−1/2) 一致。

Stone-Weierstrass 定理把结论抽象化:紧集 K 上的连续函数代数(对加法、乘法、数乘封闭的函数族)若分离点(任意两个不同点处有函数取不同值)且包含常数,则在一致范数下稠密于 C(K)。多项式代数在闭区间上满足这些条件,三角多项式代数在圆周上满足,由此得到两个常用的逼近类。这条定理在泛函分析中是很多结论的出发点,也是核方法(用核函数构造的函数族逼近连续函数)与神经网络逼近能力的理论源头。

5.6.5 插值、Runge 现象与最佳逼近 ​

多项式逼近有两条路线。第一条是 Weierstrass 型的整体逼近:让多项式的系数尽可能好地拟合函数,误差在整段上被控制。第二条是插值:要求多项式在给定节点上与函数取值相同,误差由插值余项控制。

插值余项 ​

给定 [a,b] 上 n+1 个互异节点 x0,…,xn 与函数值 f(xi),存在唯一的次数不超过 n 的多项式 Pn 满足 Pn(xi)=f(xi)(Lagrange 插值多项式)。若 f 有 n+1 阶导数,误差有显式形式:

f(x)−Pn(x)=f(n+1)(ξ)(n+1)!∏i=0n(x−xi),ξ∈(a,b)

误差由两个因子的乘积决定:导数项 f(n+1)(n+1)! 与节点多项式 ω(x)=∏(x−xi)。节点固定时导数项无法控制(高阶导数可能快速增长),实际能优化的是 max|ω(x)|,也就是节点的分布。

Runge 现象 ​

等距节点是最自然的选法,但它有一个著名的缺陷。取 f(x)=11+25x2(Runge 函数)与 [−1,1] 上的等距节点,实验三显示最大误差随节点数增大:n=4 时 4.38×10−1,n=10 时 1.92,n=16 时 1.44×101,误差在端点附近剧烈振荡并放大,中间部分却拟合得很好。原因是 max|ω(x)| 对等距节点随 n 快速增长:Canterbury 界给出 max[−1,1]|ω|≥n!2(2n+1) 量级的估计,端点附近的 ω 值远大于中心。

Chebyshev 节点 ​

节点的最优分布是 Chebyshev 零点:

xi=cos⁡(2i+1)π2n+2,i=0,1,…,n

(在 [−1,1] 上的另一种常用取法是极值点 cos⁡iπn,实验三用后者。)这套节点的分布特点是端点附近密、中心稀疏,与等距节点的分布恰好相反。对应的节点多项式满足

max[−1,1]|∏i=0n(x−xi)|=12n

这个值对 n 以指数速度下降,是全体验节点分布中的最小值(Chebyshev 定理)。代入误差公式,插值误差的量级约 max|f(n+1)|2n(n+1)!,只要函数在 [−1,1] 附近解析,误差以几何速度下降。实验三的对照数据:Chebyshev 节点下 n=6 的误差是 3.11×10−1,n=16 降到 3.67×10−2,相邻节点数之间的比值稳定在 0.64 附近,是典型的几何收敛;等距节点的误差则单调上升,两者在 n=16 处相差约 400 倍。

最佳一致逼近 ​

插值要求多项式在节点上精确取值,这未必是最优策略。最佳一致逼近问的是:在所有次数不超过 n 的多项式中,哪一个使 ∥f−P∥∞ 最小。答案由 Chebyshev 交错定理刻画:P∗ 是最佳逼近,当且仅当误差函数 f−P∗ 在 [a,b] 上有至少 n+2 个交错点(误差依次达到 +∥f−P∗∥∞ 与 −∥f−P∗∥∞)。这一定理把「最小最大」的优化问题化为「等幅振荡」的形状条件,是 Remez 交换算法的基础,也是 3.9 节中「极大极小问题」在逼近论中的对应物。

三种逼近的比较:Taylor 展开在展开点附近精度极高但端点处差(误差不被整体控制);插值在节点上精确,误差由节点分布决定;最佳一致逼近把最大误差压到最小,代价是要迭代计算交错点。数值计算中三者的选择依赖需求:需要局部高精度用 Taylor,需要整段可控且函数光滑用 Chebyshev 插值,需要最小化最大偏差(例如硬件上的函数实现、查表压缩)用 Remez 算法。

5.6.6 Arzelà-Ascoli 定理 ​

一致收敛讨论的是「一个函数列收敛到哪里」。紧性讨论的是「一个函数列是否总能挑出收敛的子列」,后者在存在性证明中是不可替代的工具。

设 F 是 C[a,b] 中的函数族。若存在常数 M 使 |f(x)|≤M 对所有 f∈F、x∈[a,b] 成立,称 F 一致有界(逐点有界还不够)。若对任意 ε>0 存在 δ>0(只依赖 ε,不依赖 f 与 x),使得 |x−y|<δ 时 |f(x)−f(y)|<ε 对所有 f∈F 成立,称 F 等度连续。等度连续就是上一致收敛版本的一致连续:同一组 δ 对整个函数族有效。

Arzelà-Ascoli 定理:C[a,b] 中一致有界且等度连续的函数族是相对紧的,即任意函数列都含有一致收敛的子列。

证明的思路分两步。第一条线索是用对角线法抽出逐点收敛的子列:[a,b] 上的有理点可数,按有理点逐个抽子列(每个点上的数值有界,Bolzano-Weierstrass 定理保证有收敛子列),对角线子列在每个有理点上收敛。第二条线索是用等度连续性把逐点收敛提升为一致收敛:对给定的 ε,用有限个有理点(或 δ 网)覆盖 [a,b],在这些点上收敛后,由等度连续性把收敛性推广到全区间。两条线索合起来给出子列的一致收敛。

应用:Arzelà-Ascoli 是常微分方程解的存在性(Peano 定理,用 Euler 折线构造近似解并抽取收敛子列)、变分法直接方法(找极小化序列的收敛子列,5.11 节)、偏微分方程紧性方法(先验估计 + 抽子列)的共同基础。它也是「有界 + 等度连续 = 紧」这个模式的来源,在泛函分析与数值分析中反复出现。

与紧性的对照

有限维空间的紧性由 Heine-Borel 定理刻画(有界闭集即紧)。无限维的函数空间没有这么简单的判别:仅有一致有界不足以保证紧(sin⁡(nx) 一族有界但任意子列都不一致收敛),必须补上等度连续这个条件。这条差别是泛函分析与有限维线性代数的分水岭,也是数值方法里「网格加密不一定收敛」现象的根源:离散解族通常一致有界,等度连续性需要额外的稳定性估计。

5.6.7 数值实验 ​

实验一:逐点收敛与一致收敛 ​

两组函数列分别对应「逐点收敛但不一致收敛」的两种典型形态。第一组的极限函数间断,第二组的极限函数连续但积分不交换。

python
import math
import numpy as np

xs = np.linspace(0.0, 1.0, 200001)
xs2 = np.linspace(0.0, 0.99, 100001)

print("(a) f_n(x) = x^n")
print(f"{'n':>6} {'max on [0,1]':>14} {'max on [0,0.99]':>16} {'int_0^1 f_n':>13}")
for n in [10, 100, 1000, 10000]:
    m1 = float(np.max(xs ** n))
    m2 = float(np.max(xs2 ** n))
    print(f"{n:>6} {m1:>14.6f} {m2:>16.6f} {1.0 / (n + 1):>13.8f}")

print("(b) g_n(x) = n x exp(-n x^2)")
print(f"{'n':>6} {'max g_n':>14} {' sup 理论值':>14} {'int_0^1 g_n':>13} {'极限 1/2':>10}")
dx = 1.0 / 200000
for n in [10, 100, 1000, 10000]:
    gn = n * xs * np.exp(-n * xs ** 2)
    print(f"{n:>6} {float(np.max(gn)):>14.4f} {math.sqrt(n / (2 * math.e)):>14.4f} "
          f"{float(np.sum(gn) * dx):>13.8f} {0.5:>10.4f}")

输出:

text
(a) f_n(x) = x^n
     n   max on [0,1]  max on [0,0.99]   int_0^1 f_n
    10       1.000000         0.904382    0.09090909
   100       1.000000         0.366032    0.00990099
  1000       1.000000         0.000043    0.00099900
 10000       1.000000         0.000000    0.00009999
(b) g_n(x) = n x exp(-n x^2)
     n        max g_n        sup 理论值   int_0^1 g_n     极限 1/2
    10         1.3562         1.3562    0.49997730     0.5000
   100         4.2888         4.2888    0.50000000     0.5000
  1000        13.5624        13.5624    0.50000000     0.5000
 10000        42.8882        42.8882    0.49999998     0.5000

第一组数据把一致收敛的判据读得很清楚。第一列 max[0,1]xn 恒为 1(x=1 处 1n=1),与 n 无关,一致收敛不成立;第二列 max[0,0.99]xn=0.99n 按 0.904382→0.366032→0.000043→0 下降(n=10000 时 0.9910000=e−100.5≈3.7×10−44,在双精度下下溢为 0),一致收敛成立。同一个函数列在不同区间上的结论相反,差别只在端点:x=1 处函数值恒为 1,把整段的上确界锁住。第三列积分 1n+1 趋于零,与「极限函数在 [0,1) 上为零、单点的值不影响积分」相符;但积分与极限的交换在这里成立是因为积分值本身趋于零,不是因为收敛一致。

第二组数据是「逐点收敛但积分不交换」的标准形态。最大值的实测值与理论值 n2e 逐位相符(n=10 时 10/5.4366=1.3562,n=10000 时 10000/5.4366=42.888),峰值随 n 以 n 的速率增长,位置 x=12n 向零点移动。积分列 0.49997730→0.50000000→0.50000000→0.49999998 是 12(1−e−n),趋于 12,与极限函数的积分 0 不符。两条数据放在一起给出判断依据:一致收敛要求 ∥fn−f∥∞→0,这里 ∥gn∥∞→∞,条件以最强烈的方式被违反。

实验二:Bernstein 多项式逼近 ​

用 Bernstein 多项式逼近 f(x)=|x−12|,观察误差随次数的下降,并用「误差乘以 n」检验速率。

python
import math
import numpy as np
from scipy.stats import binom

xg = np.linspace(0.0, 1.0, 401)
print(f"{'n':>6} {'最大误差':>13} {'误差 * sqrt(n)':>16}")
for n in [4, 16, 64, 256, 1024]:
    ks = np.arange(n + 1)
    errs = []
    for x in xg:
        w = binom.pmf(ks, n, x)
        val = float(np.sum(w * np.abs(ks / n - 0.5)))
        errs.append(abs(val - abs(x - 0.5)))
    e = max(errs)
    print(f"{n:>6} {e:>13.4e} {e * math.sqrt(n):>16.4f}")

输出:

text
     n          最大误差     误差 * sqrt(n)
     4    1.8750e-01           0.3750
    16    9.8190e-02           0.3928
    64    4.9673e-02           0.3974
   256    2.4910e-02           0.3986
  1024    1.2464e-02           0.3988

误差单调下降,从 n=4 的 1.88×10−1 降到 n=1024 的 1.25×10−2,但下降得很慢:次数增加 256 倍(从 4 到 1024),误差只降到原来的 115。第三列给出了速率的答案:「误差 ×n」稳定在 0.3988 附近,说明误差按 0.4n 衰减,即 O(n−1/2)。这个数值有理论解释:逼近误差的最大值出现在 x=12 处,那里

Bnf(12)=E|Xn−12|,X∼Bin(n,12)

由中心极限定理,X−n/2n/2 近似标准正态,E|X−n2|≈n22π,除以 n 得 12πn≈0.3989n,与实测的 0.3988 一致。

这组数据说明两件事。一是收敛速率由函数的光滑程度决定:f 在 12 处有拐角(不可导),速率为 O(n−1/2);若 f 处处可导且导数 Lipschitz,速率提高到 O(n−1);若 f 有 k 阶连续导数,速率为 O(n−k/2) 量级。二是 Bernstein 多项式的实际效率不高:达到 10−6 的精度需要 n 约 (0.410−6)2=1.6×1011 次,远不如 Chebyshev 插值或最佳逼近。它的价值在于构造的显式性与证明的简洁性,以及概率论解释带来的直观。

实验三:插值逼近与 Runge 现象 ​

比较等距节点与 Chebyshev 节点上的插值误差。插值多项式用重心公式(barycentric formula)计算:给定节点 xi 与权重 wi=1∏j≠i(xi−xj),

P(x)=∑iwix−xif(xi)∑iwix−xi

这个形式的数值稳定性远好于直接解线性方程组,且计算量是 O(n)。

python
import math
import numpy as np

def runge(x):
    return 1.0 / (1.0 + 25.0 * x * x)

def barycentric(nodes, xs):
    n = len(nodes)
    w = np.ones(n)
    for i in range(n):
        w[i] = 1.0 / float(np.prod([nodes[i] - nodes[j] for j in range(n) if j != i]))
    num = np.zeros_like(xs)
    den = np.zeros_like(xs)
    for i in range(n):
        t = w[i] / (xs - nodes[i])
        num += t * runge(nodes[i])
        den += t
    return num / den

xg = np.linspace(-0.999, 0.999, 1999)
print(f"{'n':>5} {'等距节点最大误差':>18} {'Chebyshev 节点最大误差':>22}")
for n in [4, 6, 8, 10, 12, 14, 16]:
    eq_nodes = np.linspace(-1.0, 1.0, n + 1)
    ch_nodes = -np.cos(np.arange(n + 1) * math.pi / n)
    ee = float(np.nanmax(np.abs(barycentric(eq_nodes, xg) - runge(xg))))
    ec = float(np.nanmax(np.abs(barycentric(ch_nodes, xg) - runge(xg))))
    print(f"{n:>5} {ee:>18.4e} {ec:>22.4e}")

输出:

text
    n           等距节点最大误差       Chebyshev 节点最大误差
    4         4.3836e-01             4.5998e-01
    6         6.1695e-01             3.1119e-01
    8         1.0452e+00             2.0468e-01
   10         1.9156e+00             1.3220e-01
   12         3.6633e+00             8.4396e-02
   14         7.1949e+00             5.3508e-02
   16         1.4394e+01             3.6713e-02

两列数据的走向完全相反。等距节点一列从 4.38×10−1 上升到 1.44×101,节点数每增加 2 误差大约翻一倍,Runge 现象在数据上表现为「加密节点反而更差」。误差的位置在端点附近:[−1,1] 上的等距插值在 |x| 接近 1 处出现幅度越来越大的振荡,中心区域的误差始终很小(n=16 时中心部分的误差在 10−3 以下),而最大误差由端点附近的振荡决定。

Chebyshev 节点一列单调下降,从 n=6 的 3.11×10−1 降到 n=16 的 3.67×10−2,相邻项的比值是 0.204680.31119=0.658、0.132200.20468=0.646、0.0843960.13220=0.638、0.0535080.084396=0.634、0.0367130.053508=0.686,稳定在 0.64 附近,是几何收敛。n=4 时两者接近(4.38 与 4.60,此时 Chebyshev 略差),因为次数太低时端点加密带来的收益还没有超过与函数形状的差异。n=16 时两列相差约 14.40.0367≈392 倍,且差距随 n 继续扩大。

Runge 函数的局部性值得说明:f(x)=11+25x2 在复平面上有极点 x=±i5,距实轴 0.2。Chebyshev 插值的收敛速率由极点到 [−1,1] 的 Bernstein 椭圆参数决定:

ρ=|z+z2−1||z=0.2i=|0.2i+1.0198i|=1.2198

误差按 ρ−n 衰减。表中相邻两行的次数相差 2,理论比值是 ρ−2=0.672,实测比值在 0.634 到 0.686 之间,两者相符。等距插值的收敛条件要求函数在一条以区间为底的窄带内解析,0.2 的距离不够(等距插值需要带状区域的宽度趋于零时仍有解析性),所以发散。这条对照说明「插值是否收敛」归根到底由函数的解析性与节点的分布共同决定,两个因素都可以事先检查。

5.6.8 本节小结 ​

函数列收敛的三层内容

本节把函数列的收敛组织为三层。定义层给出两种收敛:逐点收敛的 N 依赖 ε 与 x,一致收敛的 N 只依赖 ε,等价形式是 ∥fn−f∥∞→0;一致收敛蕴含逐点收敛,反之不成立,两个标准反例是 xn(极限函数间断,实验一第一组:max[0,1]=1 恒成立,max[0,0.99]=0.99n→0)与 nxe−nx2(积分不交换,实验一第二组:∥gn∥∞=n/(2e) 增长到 42.888,积分恒为 12,极限函数的积分为零)。定理层是三条交换性质:一致收敛时极限函数连续(ε3 分解),积分可以交换(|∫fn−∫f|≤(b−a)∥fn−f∥∞),求导交换需要导函数列一致收敛。判别工具是 M 判别法(|uk|≤Mk 且 ∑Mk 收敛)、一致 Cauchy 准则、Dini 定理与 Abel-Dirichlet 的一致形式;幂级数在半径内部任意闭子区间上一致收敛,这保证了它的逐项积分与逐项求导。逼近层给出三条路线:Weierstrass 逼近定理(连续函数可用多项式一致逼近)与 Bernstein 构造(误差 ≤32ωf(n−1/2),实验二实测「误差 ×n」稳定在 0.3988,对应 O(n−1/2),速率由光滑性决定);插值的误差公式 f(n+1)(ξ)(n+1)!ω(x) 把误差分成导数项与节点项,等距节点的节点项随 n 快速增长导致 Runge 现象(实验三:n 从 4 到 16,误差从 4.38×10−1 升到 1.44×101),Chebyshev 节点的 max|ω|=2−n 给出几何收敛(同区间内误差从 4.60×10−1 降到 3.67×10−2,比值稳定在 0.64);最佳一致逼近由 Chebyshev 交错定理刻画,是 Remez 算法的依据。Arzelà-Ascoli 定理(一致有界 + 等度连续蕴含相对紧)提供了「从函数列中抽取一致收敛子列」的工具,是微分方程与变分法存在性证明的基础。

函数列的收敛与逼近处理的是「用简单函数逼近复杂函数」,下一节把注意力转向一类特殊的函数项级数:幂级数与 Fourier 级数。前者是 Taylor 展开的严格版本,后者把函数按三角函数系展开,两者都属于正交展开,共同的框架是内积空间与基底。

练习题 ​

第 1 题 概念推导 ​

(a) 证明:若连续函数列 {fn} 在 [a,b] 上一致收敛于 f,则 f 连续(写出 ε3 分解的完整论证)。(b) 用一致收敛的定义直接证明 fn(x)=x1+nx2 在 R 上一致收敛于零,并指出其最大值的位置与数值。(c) 说明为什么「{fn} 一致收敛」不能推出「{fn′} 一致收敛」。

参考答案

(a) 取 x0∈[a,b] 与任意 ε>0。由一致收敛,存在 N 使得 n>N 时 ∥fn−f∥∞<ε3。固定一个这样的 n,由 fn 在 x0 连续,存在 δ>0 使得 |x−x0|<δ(且 x∈[a,b])时 |fn(x)−fn(x0)|<ε3。对这样的 x,

|f(x)−f(x0)|≤|f(x)−fn(x)|+|fn(x)−fn(x0)|+|fn(x0)−f(x0)|<ε3+ε3+ε3=ε

前一项与后一项的上界与 x 无关,这是先固定 n 的合法性所在;逐点收敛时这个上界依赖 x,无法在讨论 x 的邻域之前固定 n。

(b) fn 是奇函数,考察 x>0。求导:fn′(x)=1−nx2(1+nx2)2,零点在 x=1n,此处的值为

fn(1n)=1/n1+1=12n

因此 ∥fn∥∞=12n→0,一致收敛成立(N=14ε2 即可,与 x 无关)。注意峰值同样随 n 移动并收窄,但幅度按 n−1/2 趋于零,而实验一的 nxe−nx2 幅度按 n1/2 增长,两者只差指数因子的写法,收敛性质截然不同。

(c) 一致收敛只控制函数值,不控制振荡。反例:fn(x)=sin⁡(nx)n,∥fn∥∞≤1n→0 一致收敛到零;导函数 fn′(x)=cos⁡(nx),∥fn′∥∞=1 对任何 n 都成立,且 cos⁡(nx) 在 [0,2π] 上不逐点收敛(n 取不同值时在 [−1,1] 内往复)。求导交换的正确条件加在导函数列上:只要 {fn′} 一致收敛,交换就成立(5.6.2 节的定理)。这个反例也解释了为什么数值求导对数据中的噪声敏感:噪声的幅度小但频率高,函数值上的小误差对应导数上的大误差。

第 2 题 计算推理 ​

(a) 判断 ∑k=1∞cos⁡(kx)k2+1 在 R 上是否一致收敛,并说明理由。(b) 用 Runge 函数 f(x)=11+25x2 在 [−1,1] 上的 n+1 个等距节点插值,写出误差公式并说明为什么 n 增大时误差可能增大。(c) 估计 Bernstein 多项式逼近 f(x)=x 在 [0,1] 上达到 10−3 精度所需的次数。

参考答案

(a) 一致收敛。取 Mk=1k2+1,|cos⁡(kx)k2+1|≤1k2+1 对一切 x 成立,而 ∑k≥11k2+1≤∑k≥11k2=π26 收敛,由 M 判别法得一致收敛。和函数在 R 上连续且绝对收敛,逐项积分与逐项求导在导级数一致收敛时成立。注意分母用 k2+1 而不是 k:若换成 ∑cos⁡(kx)k,M 判别法失效(∑1k 发散),这时需要用 Dirichlet 的一致形式判断(1k 单调趋于零,cos⁡(kx) 的部分和一致有界),结论是完全收敛但不绝对收敛,且在含 x=0 的区间上不一致收敛(x=0 处是调和级数)。

(b) 误差公式

f(x)−Pn(x)=f(n+1)(ξ)(n+1)!ω(x),ω(x)=∏i=0n(x−xi)

等距节点 xi=−1+2in。Runge 函数的高阶导数随 n 快速增长:它在 ±i5 处有极点,在 [−1,1] 上的解析性很差,f(n+1) 的最大值按 ∼n!5n+1 增长(极点距离决定指数因子),与分母 (n+1)! 相除后仍按 5n+1 增长。节点项 max|ω| 对等距节点也按 n!2(2n+1) 量级增长。两项相乘,误差随 n 增长,这就是实验三的观测。若把节点换成 Chebyshev 节点,节点项改为 2−n 指数下降,与导数项中的指数因子相抵,误差按 ρ−n 收敛。

(c) x 在 [0,1] 上连续(一致连续,因为闭区间上连续),但导数 12x 在零点无界,连续模满足 ωf(δ)≤δ(取 x=0、y=δ 时 δ−0=δ 达到量级)。由误差界 ∥Bnf−f∥∞≤32ωf(n−1/2)≤32n−1/4,要求 32n−1/4≤10−3,得 n≥(1.5×103)4≈5×1012。这个天文数字说明 Bernstein 多项式对含端点奇性的函数效率极低,实际计算应当用别的路线(变量替换 x=t2 去掉奇性后再逼近,或者改用 Chebyshev 加权逼近)。结论:连续模给出的速率估计是上界,原则上不可改进(Bnf 对 x 的实际误差确实按 n−1/2 量级衰减,因为 Chebyshev 型的不等式在这个问题上接近最优)。

第 3 题 代码验证 ​

用本节代码做三组实验并解释:(a) 在实验一里把 xn 换成 sinn⁡x,检查在 [0,π2] 上的一致收敛性;(b) 在实验三里把 Runge 函数换成 f(x)=ex,比较两种节点的误差并说明差别消失的原因;(c) 在实验三里把 Chebyshev 节点的取法从极值点改成零点 −cos⁡(2i+1)π2n+2,比较两种取法的误差。

参考答案

(a) sinn⁡x 在 [0,π2] 上逐点收敛于 f(x)=0(x<π2 时 sin⁡x<1)且 f(π2)=1n=1。在闭区间 [0,π2] 上 maxsinn⁡x=1(端点取得),一致收敛不成立,与 xn 的情形相同。在 [0,π2−δ] 上最大值为 sinn⁡(π2−δ)=cosn⁡δ→0,一致收敛成立。这说明一致收敛的判断依赖区间:只要把端点排除在外,结论就翻转。sinn 与 xn 的共同点是函数在端点处取到恒为 1 的值。

(b) ex 在 [−1,1] 上解析且在整个复平面解析,两种节点的误差都随 n 以几何速度下降,差别很小。原因:阶的误差公式里 f(n+1)=eξ 在 [−1,1] 上不超过 e,不随 n 增长,误差完全由节点项 max|ω| 决定,而两种节点项都随 n 下降。差别体现在常数因子上:Chebyshev 节点的 max|ω|=2−n 是最优值,等距节点的 max|ω| 要大一些(量级 n!2(2n+1)⋅1(n+1)! 乘上区间长度因子),但不随 n 增长,因此不会出现 Runge 现象。Runge 现象的本质是「函数解析性差 + 节点项增长」的乘积效应,函数解析性好时后一个条件不构成问题。

(c) 极值点取法 xi=−cos⁡iπn(i=0,…,n)与零点取法 xi=−cos⁡(2i+1)π2n+2(i=0,…,n)都基于余弦分布,误差量级相同,差别在常数因子。零点取法在区间内部没有重复的端点,插值多项式的次数分配更均匀,对于 n 相同的比较,零点取法的最大误差通常略小(相差一个不超过 2 的因子);极值点取法的优势是包含两个端点,适合需要端点处的信息或与 Chebyshev 展开的系数直接对应的场合。实际实现(例如 numpy.polynomial.chebyshev 的内部节点生成)常用极值点,因为节点的递推关系更简洁。

第 4 题 综合应用 ​

某数值程序需要用多项式在 [−1,1] 上逼近一个由实验测量得到的函数(只能逐点求值,无法求导,数据带有 10−6 量级的随机噪声,共可获得 200 个采样点,要求逼近误差在 10−5 以下)。请比较三种方案并给出推荐:等距节点的高次插值、Chebyshev 节点插值、最小二乘拟合。

参考答案

方案一:等距节点高次插值。200 个等距节点对应 n=199 次多项式。两个问题。第一是 Runge 现象:若函数在区间端点附近的解析性不好(测量数据通常如此),等距插值在端点附近的振荡幅度可能达到 100 以上,远超要求,且随节点数增加而恶化。第二是噪声放大:插值要求多项式精确通过每个数据点,10−6 的噪声被完整地引入多项式系数,高次插值的条件数很大(等距节点的 Vandermonde 矩阵条件数随 n 指数增长),噪声的放大倍数可能达到 106 以上。这一方案不可行。

方案二:Chebyshev 节点插值。节点分布改为 Chebyshev 点,误差的节点项 max|ω|=2−n,Runge 现象被消除,插值的稳定性由重心公式保证。这一方案与方案一相比解决了振荡问题,但仍然要求插值多项式精确经过每个测量点,10−6 的噪声同样被完整吸收。若函数本身光滑,插值误差可以低于 10−6,但噪声引起的误差与 10−6 同量级,与要求的 10−5 之间余量很小。此外测量点通常不落在 Chebyshev 节点上,需要先重采样或做变量替换。

方案三:最小二乘拟合。在 Chebyshev 基(或一般的正交多项式基)下用 200 个数据点拟合 m 个系数(m 远小于 200,例如 m=10 到 20)。两个优点。一是噪声的平均效果:最小二乘把 200 个点上的噪声平均掉,系数误差的量级约 σ200≈7×10−8,比方案二低一个数量级以上。二是条件数好:正交基下的最小二乘问题条件数接近 1,不需要正则化。代价是引入截断误差(拟合的多项式次数低于数据的自由度),对光滑函数这个误差随 m 指数下降。m=15 时截断误差通常在 10−8 以下,总误差由噪声项主导,约 10−7,满足要求。

推荐:方案三。选择依据是数据条件的两个特征:噪声存在(插值类方案会把噪声完整带入,拟合方案可以平均)与函数只能逐点求值(不需要解析导数,正交基的构造只需要数值积分或采样)。实现步骤是先用 Chebyshev 节点做变量替换把区间标准化,在 Chebyshev 基下构造法方程(或直接用 QR 分解避免法方程的条件数平方),取 m=15 左右,用交叉验证或残差曲线选择 m(残差降到噪声量级后再增加 m 只会引入振荡,这条经验与 3.9 节中「模型复杂度的选择」是同一个问题)。这条题目的方法论可以概括为:逼近的精度上限由数据的噪声水平决定,选方案时把噪声的传递方式(放大、平均、截断)作为第一判据,把收敛速率作为第二判据。

常见错误 ​

错误 1 · 用逐点收敛的结论做需要一致收敛的运算

原因:逐点收敛只保证每个点上的数值收敛,不保证极限运算与求导、积分、取上确界交换。实验一第二组的 nxe−nx2 是标准反例:逐点收敛到零,但积分恒为 12,若用「积分与极限交换」得到 ∫010dx=0 就错了。另一类错误是看到 limn→∞fn(xn) 这类「点的位置也在变」的表达式时直接代入极限函数(例如 fn(x)=xn、xn=1−1n 时 fn(xn)→e−1 而极限函数在 x=1 处取值 1),一致收敛可以排除这种情形。

解决:使用交换性质前先验证一致收敛。验证路径是先求极限函数,再计算 ∥fn−f∥∞ 是否趋于零;直接算上确界时可以求导找极值点(实验一第二组就是这样得到 n/(2e) 的),或者用 M 判别法、Dini 定理等工具。若一致收敛不成立,所有交换性质都需要单独证明或放弃。

错误 2 · 把连续模给出的上界当作实际收敛速率

原因:Weierstrass 逼近定理的误差界 32ωf(n−1/2) 是上界,不是速率的下界,也不是精确值。对 Lipschitz 连续的 f,这个界给出 O(n−1/2),但实验二对 f(x)=|x−12| 的实测速率恰好是 O(n−1/2)(这正是练习 2(c) 中 x 的情形),两者吻合;对可导且导数 Lipschitz 的函数,实际速率提高到 O(n−1),连续模的上界仍然给出 O(n−1/2),偏保守。把上界当作精确速率会低估光滑函数的逼近效率。

解决:区分「上界」与「实际阶」。使用估计时标明它是上界;需要精确速率时查该函数类的专门结论(可导性、导数的 Lipschitz 常数、解析性各有对应的阶),或者用数值实验测定(本节实验二的第三列就是测定速率的做法:把误差乘以 n1/2 看是否趋于常数)。报告中区分「理论上界」与「实测速率」,避免用保守上界否决可行的方案。

错误 3 · 加密插值节点以提高精度

原因:插值误差由导数项与节点项两部分组成,等距节点下节点项随 n 增长,导数项对解析性差的函数也增长,两者相乘使误差随 n 增大。实验三的第一列数据直接给出反例:Runge 函数在等距节点上的最大误差从 n=4 的 4.38×10−1 升到 n=16 的 1.44×101,节点增加 5 倍误差增加 33 倍。若在高次插值后看到端点附近的大幅振荡,把节点加密只会让振荡更剧烈。

解决:先检查节点的分布与函数的解析性。等距节点只适合低次插值(n 不超过约 10 到 15)或在区间很短、函数很光滑的场合;一般情形换用 Chebyshev 节点。对含端点奇性的函数(x、ln⁡x、xα)先做变量替换去掉奇性,或者改用加权逼近。若目的是从含噪数据构造近似函数,改用最小二乘拟合而非插值(练习 4 的方案三)。

错误 4 · 把上确界范数与逐点最大值混为一谈

原因:∥f∥∞=sup|f| 与 max|f| 在有界闭区间上相等,但在开区间或无穷区间上可能不同(上确界可能取不到)。判断一致收敛时若只在一个点或一段网格上检查误差,会把「区间端点附近的坏行为」漏掉:实验一中 max[0,0.99]xn→0 而 max[0,1]xn=1,两者只差一个端点。用数值网格检查一致收敛时,网格的取点方式决定了能否看到最坏位置:实验一的第二组峰值位于 x=12n(n=10000 时 x=0.007),等距网格的间距若大于峰宽就会低估峰值。

解决:解析判断时明确上确界所在的区间(闭区间还是开区间、是否含端点),必要时求导定位极值点。数值检验时把候补的最坏位置(区间端点、函数或导数的奇点、噪声的极值点)显式加入网格,或者用两层网格(粗网格定位加细网格细化)搜索,报告时说明网格的密度与覆盖范围,避免把「网格上的最大误差」当作上确界范数。