5.6 函数列、函数项级数与一致收敛
前五节讨论的对象都是数:数列、级数、函数在某点的极限。本节把讨论的对象换成函数。函数列
本节按三条线索展开。语言线索给出两种收敛的定义与判别工具:逐点收敛只看每个固定点上的数列,一致收敛要求误差在整段区间上被同一个量控制,用上确界范数写出就是
5.6.1 函数列的收敛
逐点收敛
设函数列
注意
例:
每个
例:
而极限函数的积分是
一致收敛
若
称
用上确界范数(一致范数)可以把定义写成一句话:
上确界范数度量的是两条曲线之间的最大竖直距离,一致收敛就是「最大距离趋于零」。一致收敛蕴含逐点收敛,反之不成立:
几何含义:一致收敛等价于对任意
逐项检验的一致性:验证一致收敛的常用路径是先求出极限函数,再计算
5.6.2 一致收敛与极限交换
一致收敛的价值体现在三条交换性质上。
连续性
设
由一致收敛,第一项与第三项对充分大的
推论:一致收敛的连续函数列,其极限函数连续。这条推论在应用中常反过来用:若极限函数不连续,则收敛不可能是一致的。
积分交换
设
证明的关键是误差的积分估计:
右端趋于零。一致收敛把「函数值差的上界」变成「积分差的上界」,这一步在逐点收敛时没有。实验一的第二组数据说明这个条件是必要的:
求导交换
求导对一致收敛的要求更强,因为导数放大高频振荡。设
证明用中值定理把
一个直观的说明
一致收敛控制的是「函数的整体形状」,逐点收敛只控制「每个点的最终值」。求导是对形状的敏感运算:函数值的一致小不能保证导数的一致小(
5.6.3 函数项级数
把函数列换成部分和,就得到函数项级数
Weierstrass 判别法
若存在收敛的正项级数
则
右端与
一般的判别工具
M 判别法要求绝对收敛,条件收敛的情形需要更细的工具。
一致 Cauchy 准则:
Dini 定理:设
Abel 与 Dirichlet 的一致形式:把数项级数的判别法逐字搬到函数项可以得到
幂级数的一致收敛
幂级数
5.6.4 逼近定理
一致收敛的一个主要用途是用简单的函数类逼近复杂的函数类。核心结论是 Weierstrass 逼近定理。
Weierstrass 逼近定理:设
也就是说,闭区间上的连续函数可以用多项式一致逼近到任意精度。这条定理的意义在于「连续函数」与「多项式」两类看似相距很远的对象之间架了桥:多项式只有加乘两种运算,容易求值、求导、积分,是计算上的好对象;连续函数是应用中出现的对象。定理说明逼近在精度意义上没有损失,代价是多项式次数随精度要求上升。
Bernstein 构造给出证明。对
右端的权重是二项分布的概率质量函数(参数
其中
Stone-Weierstrass 定理把结论抽象化:紧集
5.6.5 插值、Runge 现象与最佳逼近
多项式逼近有两条路线。第一条是 Weierstrass 型的整体逼近:让多项式的系数尽可能好地拟合函数,误差在整段上被控制。第二条是插值:要求多项式在给定节点上与函数取值相同,误差由插值余项控制。
插值余项
给定
误差由两个因子的乘积决定:导数项
Runge 现象
等距节点是最自然的选法,但它有一个著名的缺陷。取
Chebyshev 节点
节点的最优分布是 Chebyshev 零点:
(在
这个值对
最佳一致逼近
插值要求多项式在节点上精确取值,这未必是最优策略。最佳一致逼近问的是:在所有次数不超过
三种逼近的比较:Taylor 展开在展开点附近精度极高但端点处差(误差不被整体控制);插值在节点上精确,误差由节点分布决定;最佳一致逼近把最大误差压到最小,代价是要迭代计算交错点。数值计算中三者的选择依赖需求:需要局部高精度用 Taylor,需要整段可控且函数光滑用 Chebyshev 插值,需要最小化最大偏差(例如硬件上的函数实现、查表压缩)用 Remez 算法。
5.6.6 Arzelà-Ascoli 定理
一致收敛讨论的是「一个函数列收敛到哪里」。紧性讨论的是「一个函数列是否总能挑出收敛的子列」,后者在存在性证明中是不可替代的工具。
设
Arzelà-Ascoli 定理:
证明的思路分两步。第一条线索是用对角线法抽出逐点收敛的子列:
应用:Arzelà-Ascoli 是常微分方程解的存在性(Peano 定理,用 Euler 折线构造近似解并抽取收敛子列)、变分法直接方法(找极小化序列的收敛子列,5.11 节)、偏微分方程紧性方法(先验估计 + 抽子列)的共同基础。它也是「有界 + 等度连续 = 紧」这个模式的来源,在泛函分析与数值分析中反复出现。
与紧性的对照
有限维空间的紧性由 Heine-Borel 定理刻画(有界闭集即紧)。无限维的函数空间没有这么简单的判别:仅有一致有界不足以保证紧(
5.6.7 数值实验
实验一:逐点收敛与一致收敛
两组函数列分别对应「逐点收敛但不一致收敛」的两种典型形态。第一组的极限函数间断,第二组的极限函数连续但积分不交换。
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}")输出:
(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第一组数据把一致收敛的判据读得很清楚。第一列
第二组数据是「逐点收敛但积分不交换」的标准形态。最大值的实测值与理论值
实验二:Bernstein 多项式逼近
用 Bernstein 多项式逼近
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}")输出:
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误差单调下降,从
由中心极限定理,
这组数据说明两件事。一是收敛速率由函数的光滑程度决定:
实验三:插值逼近与 Runge 现象
比较等距节点与 Chebyshev 节点上的插值误差。插值多项式用重心公式(barycentric formula)计算:给定节点
这个形式的数值稳定性远好于直接解线性方程组,且计算量是
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}")输出:
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两列数据的走向完全相反。等距节点一列从
Chebyshev 节点一列单调下降,从
Runge 函数的局部性值得说明:
误差按
5.6.8 本节小结
函数列收敛的三层内容
本节把函数列的收敛组织为三层。定义层给出两种收敛:逐点收敛的
函数列的收敛与逼近处理的是「用简单函数逼近复杂函数」,下一节把注意力转向一类特殊的函数项级数:幂级数与 Fourier 级数。前者是 Taylor 展开的严格版本,后者把函数按三角函数系展开,两者都属于正交展开,共同的框架是内积空间与基底。
练习题
第 1 题 概念推导
(a) 证明:若连续函数列
参考答案
(a) 取
前一项与后一项的上界与
(b)
因此
(c) 一致收敛只控制函数值,不控制振荡。反例:
第 2 题 计算推理
(a) 判断
参考答案
(a) 一致收敛。取
(b) 误差公式
等距节点
(c)
第 3 题 代码验证
用本节代码做三组实验并解释:(a) 在实验一里把
参考答案
(a)
(b)
(c) 极值点取法 numpy.polynomial.chebyshev 的内部节点生成)常用极值点,因为节点的递推关系更简洁。
第 4 题 综合应用
某数值程序需要用多项式在
参考答案
方案一:等距节点高次插值。
方案二:Chebyshev 节点插值。节点分布改为 Chebyshev 点,误差的节点项
方案三:最小二乘拟合。在 Chebyshev 基(或一般的正交多项式基)下用
推荐:方案三。选择依据是数据条件的两个特征:噪声存在(插值类方案会把噪声完整带入,拟合方案可以平均)与函数只能逐点求值(不需要解析导数,正交基的构造只需要数值积分或采样)。实现步骤是先用 Chebyshev 节点做变量替换把区间标准化,在 Chebyshev 基下构造法方程(或直接用 QR 分解避免法方程的条件数平方),取
常见错误
错误 1 · 用逐点收敛的结论做需要一致收敛的运算
原因:逐点收敛只保证每个点上的数值收敛,不保证极限运算与求导、积分、取上确界交换。实验一第二组的
解决:使用交换性质前先验证一致收敛。验证路径是先求极限函数,再计算
错误 2 · 把连续模给出的上界当作实际收敛速率
原因:Weierstrass 逼近定理的误差界
解决:区分「上界」与「实际阶」。使用估计时标明它是上界;需要精确速率时查该函数类的专门结论(可导性、导数的 Lipschitz 常数、解析性各有对应的阶),或者用数值实验测定(本节实验二的第三列就是测定速率的做法:把误差乘以
错误 3 · 加密插值节点以提高精度
原因:插值误差由导数项与节点项两部分组成,等距节点下节点项随
解决:先检查节点的分布与函数的解析性。等距节点只适合低次插值(
错误 4 · 把上确界范数与逐点最大值混为一谈
原因:
解决:解析判断时明确上确界所在的区间(闭区间还是开区间、是否含端点),必要时求导定位极值点。数值检验时把候补的最坏位置(区间端点、函数或导数的奇点、噪声的极值点)显式加入网格,或者用两层网格(粗网格定位加细网格细化)搜索,报告时说明网格的密度与覆盖范围,避免把「网格上的最大误差」当作上确界范数。