5.10 测度与 Lebesgue 积分初步
前面九节的积分理论有一个共同的框架:Riemann 积分。它把「分割求和的极限」作为积分的定义,覆盖了连续函数、单调函数与有界且间断点有限的函数(5.5 节),也支撑了重积分、曲线曲面积分与三大公式(5.9 节)。但它有两个明显的限制。第一个限制是可积函数类偏窄:Dirichlet 函数不可积,而它的「积分值」从直觉上应当是零(有理点是可数的、很少)。第二个限制是极限交换的条件偏强:5.6 节用一致收敛保证
本节介绍的 Lebesgue 积分同时缓解这两个限制。做法是把定义的方式换一下:不再按自变量方向分割,而是按函数值分割:先考虑取值简单的函数(有限个取值的「简单函数」),它们的积分是「函数值乘以对应集合的测度」之和,然后用简单函数从下方逼近一般函数并取上确界。这套定义需要一个新的基础概念:集合的测度,也就是「大小」的推广,它必须能处理可数多个集合的并(
三个收敛定理是本节最有实用价值的部分。单调收敛定理、Fatou 引理与控制收敛定理给出了比一致收敛弱得多的交换条件,代价是需要单调性或控制函数。这三个定理是概率论(期望与极限的交换)、统计学(大数律与中心极限定理的证明)与随机过程(鞅的收敛)的标准工具,第二章的极限定理部分正是它们的应用。最后的
5.10.1 Riemann 积分的两个限制
限制一:可积函数类。5.5 节给出的刻画是「间断点集为零测集」,其中零测集的含义是可以用总长度任意小的区间覆盖。这个条件排除了 Dirichlet 函数(在每个区间上都有有理点与无理点,间断点集是整个区间),但 Dirichlet 函数从积分的角度看很简单:它取值只有
限制二:极限交换。实验一给出三组失效的形态。第一组
5.10.2 测度与可测函数
代数与测度
设
; - 对补集封闭:
; - 对可数并封闭:
,
称
测度是定义在
第二条称
零测集是测度为零的集合,它们的子集都可测(这一点由完备化得到),且零测集不影响积分:改变函数在零测集上的取值,积分不变。这条性质是 Lebesgue 积分比 Riemann 积分灵活的关键,它把「几乎处处」(a.e.)这个概念引入分析:性质在除去一个零测集之外处处成立。
可测函数
可测函数对四则运算、可数上确界与下确界、逐点极限都封闭:若
简单函数是取有限个值的可测函数。任何非负可测函数都可以用单调递增的简单函数列从下方逼近(把函数值截断到
这个构造是 Lebesgue 积分定义的技术核心,也给出了「先定义简单函数的积分、再用逼近定义一般函数的积分」这条路线。
5.10.3 Lebesgue 积分
定义
简单函数
右端可能出现
即「用简单函数从下方逼近所能达到的最高值」。对一般可测函数
与 Riemann 积分的关系
三条对照。
包含关系:
反常积分:绝对收敛的反常积分两者相等;条件收敛的反常积分在 Lebesgue 意义下不可积(
本质区别:Riemann 积分按自变量方向分割,对函数的间断点敏感(间断点集测度为零才可积);Lebesgue 积分按函数值分层,对称地处理了「函数的定义域」与「函数值」,因此可积函数类大得多。
基本性质
三条性质在一元与多元情形都成立,且不需要额外条件。
线性:
单调性:
可数可加性:
三个「几乎处处」的约定使结论更简洁:
5.10.4 三大收敛定理
单调收敛定理
设
结论可以写成
实验一第一组的数据给出这条定理的量化形态:
Fatou 引理
设
方向只有一个:左边的极限函数的积分不超过右边积分列的下极限。取严格不等号的情形与「质量丢失」对应,实验一的第二组与第三组都是这类:
控制收敛定理
设
第二条结论(
控制函数也可以换成一致可积性(比被单一可积函数控制更弱),这条推广形式称为Vitali 收敛定理,在概率论中对应「一致可积性与收敛的等价」(一致可积加上依概率收敛蕴含
三个定理的配合
三者的逻辑关系是:单调收敛定理 ⟹ Fatou 引理 ⟹ 控制收敛定理(证明链条)。使用时的判断顺序是:
- 有单调性且非负时直接用单调收敛定理,条件最弱。
- 没有单调性时看是否有可积的控制函数,有则用控制收敛定理。
- 都没有时用 Fatou 引理得到不等式(至少能确定方向),或者加上一致可积性、紧性等其他条件。
这套顺序与 5.6 节的最大区别在于「控制条件」的形态:5.6 节的一致收敛要求误差在整段上一致地小(上确界范数),控制收敛定理只要求被一个可积函数压住(
与概率论一章的连接
把测度取为概率测度(
5.10.5 Lp 空间
定义与范数
固定
几乎处处相等的函数视为同一个元素(否则
Hölder 不等式把两个函数的乘积控制住:
等号成立的条件是
实验三的两组数据验证这些不等式。第一组对
第二组验证 Hölder 不等式,取
完备性
完备性是「把极限留在空间内」的保证,也是许多存在性定理的基础:变分法中求极小值需要保证极小化序列收敛(5.11 节)、偏微分方程的弱解需要
5.10.6 绝对连续与 Radon-Nikodym 定理
测度的分解
设
绝对连续(
相互奇异(
Lebesgue 分解定理:任意两个
即「可积密度部分」与「奇异部分」之和。这条分解是概率论中「连续型分布与离散型分布、奇异型分布」分类的理论依据。
Radon-Nikodym 定理
若
这条定理在概率论中的形态是概率密度函数的定义:若随机变量
条件期望是 Radon-Nikodym 定理最重要的应用之一:给定子
牛顿-莱布尼茨公式的失效
5.5 节的 Newton-Leibniz 公式
实验四第二、三组给出条件失效的标准例子:Cantor 函数。它连续、单调,
第三组数据从数值角度说明奇异测度的特征:导数非零的网格步占比从
5.10.7 数值实验
实验一:极限与积分交换的三种情形
三组函数列分别对应「单调收敛成立」「质量逃逸到无穷」「质量集中到一点」。
import math
import numpy as np
print("(a) 单调收敛:f_n(x) = (1 + x/n)^n 在 [0, 1] 上单调递增趋于 e^x")
print(f"{'n':>8} {'f_n(0.5)':>16} {'int f_n(精确式)':>20} {'与 e-1 的差':>16}")
exact = math.e - 1
for n in [1, 2, 5, 10, 50, 100, 1000]:
fn = (1 + 0.5 / n) ** n
integ = (n / (n + 1)) * ((1 + 1.0 / n) ** (n + 1) - 1)
print(f"{n:>8} {fn:>16.10f} {integ:>20.12f} {abs(integ - exact):>16.3e}")
print(f" f_n(0.5) 的极限 e^0.5 = {math.exp(0.5):.10f}")
print(f" 极限函数的积分 int_0^1 e^x dx = e - 1 = {exact:.12f}")
print("(b) 质量逃逸到无穷:f_n(x) = 1_{(n, n+1)}(x)(在实轴上)")
print(f"{'n':>8} {'int f_n':>12} {'f_n(0.5)':>12} {'f_n(100.5)':>14}")
for n in [1, 10, 100, 1000]:
print(f"{n:>8} {1.0:>12.1f} {0:>12} {1 if n < 100.5 < n + 1 else 0:>14}")
print("(c) 质量集中到一点:f_n(x) = n 在 (0, 1/n) 上,其余为 0(区间 [0, 1])")
print(f"{'n':>8} {'int f_n(梯形法)':>20} {'f_n(0.5)':>12} {'max f_n':>12}")
xs = np.linspace(0, 1, 200001)
for n in [10, 100, 1000, 10000]:
ys = np.where(xs < 1.0 / n, float(n), 0.0)
print(f"{n:>8} {float(np.trapezoid(ys, xs)):>20.10f} {0.0:>12.4f} {float(n):>12.1f}")输出:
(a) 单调收敛:f_n(x) = (1 + x/n)^n 在 [0, 1] 上单调递增趋于 e^x
n f_n(0.5) int f_n(精确式) 与 e-1 的差
1 1.5000000000 1.500000000000 2.183e-01
2 1.5625000000 1.583333333333 1.349e-01
5 1.6105100000 1.654986666667 6.330e-02
10 1.6288946268 1.684651551009 3.363e-02
50 1.6446318218 1.711195872211 7.086e-03
100 1.6466684921 1.714714819521 3.567e-03
1000 1.6485152621 1.717922933235 3.589e-04
f_n(0.5) 的极限 e^0.5 = 1.6487212707
极限函数的积分 int_0^1 e^x dx = e - 1 = 1.718281828459
(b) 质量逃逸到无穷:f_n(x) = 1_{(n, n+1)}(x)(在实轴上)
n int f_n f_n(0.5) f_n(100.5)
1 1.0 0 0
10 1.0 0 0
100 1.0 0 1
1000 1.0 0 0
(c) 质量集中到一点:f_n(x) = n 在 (0, 1/n) 上,其余为 0(区间 [0, 1])
n int f_n(梯形法) f_n(0.5) max f_n
10 0.9999750000 0.0000 10.0
100 0.9997500000 0.0000 100.0
1000 0.9975000000 0.0000 1000.0
10000 0.9750000000 0.0000 10000.0(a) 单调收敛的情形。
(b) 质量逃逸到无穷。每个
(c) 质量集中到一点。
实验二:Monte Carlo 的收敛速率与置信区间
用
import math
import numpy as np
rng = np.random.default_rng(7)
ref = 0.746824132812427
print("估计 I = int_0^1 e^(-x^2) dx(每个 n 重复 40 次,报告均方根误差)")
print(f"{'n':>10} {'标准误(理论)':>16} {'均方根误差':>14} {'误差均值':>14}")
reps = 40
rms_list, ns = [], [10 ** 2, 10 ** 3, 10 ** 4, 10 ** 5, 10 ** 6, 10 ** 7]
for n in ns:
errs = []
for _ in range(reps):
x = rng.random(n)
errs.append(float(np.mean(np.exp(-x * x))) - ref)
errs = np.array(errs)
se_theory = math.sqrt(float(np.var(np.exp(-rng.random(100000) ** 2))) / n)
rms_list.append(float(np.sqrt(np.mean(errs ** 2))))
print(f"{n:>10} {se_theory:>16.3e} {rms_list[-1]:>14.3e} {float(np.mean(errs)):>14.3e}")
print(f"{'区间':>24} {'均方根误差比值':>16} {'理论比值 sqrt(10)':>20}")
for i in range(len(ns) - 1):
print(f"{ns[i]:>10} -> {ns[i + 1]:>10} {rms_list[i] / rms_list[i + 1]:>16.3f} {math.sqrt(10):>20.3f}")
print("95% 置信区间的覆盖率(重复 500 次,每次 n = 1000)")
cover, trials, n = 0, 500, 1000
for _ in range(trials):
x = rng.random(n)
fv = np.exp(-x * x)
est = float(np.mean(fv))
se = float(np.std(fv, ddof=1) / math.sqrt(n))
if est - 1.96 * se <= ref <= est + 1.96 * se:
cover += 1
print(f" 覆盖 {cover} / {trials} = {cover / trials:.3f}(理论值 0.950)")输出:
估计 I = int_0^1 e^(-x^2) dx(每个 n 重复 40 次,报告均方根误差)
n 标准误(理论) 均方根误差 误差均值
100 2.009e-02 1.971e-02 -2.365e-04
1000 6.336e-03 6.407e-03 9.297e-05
10000 2.008e-03 1.988e-03 2.614e-04
100000 6.357e-04 5.942e-04 4.665e-05
1000000 2.009e-04 1.997e-04 -7.711e-05
10000000 6.348e-05 7.860e-05 6.727e-06
区间 均方根误差比值 理论比值 sqrt(10)
100 -> 1000 3.077 3.162
1000 -> 10000 3.222 3.162
10000 -> 100000 3.346 3.162
100000 -> 1000000 2.976 3.162
1000000 -> 10000000 2.541 3.162
95% 置信区间的覆盖率(重复 500 次,每次 n = 1000)
覆盖 470 / 500 = 0.940(理论值 0.950)第一张表的两列给出
第二张表的比值列给出速率的直接读数:
第三部分检验置信区间的可靠性:
实验三:Lp 范数与 Hölder 不等式
计算幂函数
import math
import numpy as np
def integral_power(c, m_pts=4000000, factor=3.0):
"""计算 int_0^1 x^(-c) dx(要求 c < 1),用换元 x = u^m 消除端点奇性"""
m = int(math.ceil(factor / (1.0 - c)))
u = (np.arange(m_pts) + 0.5) / m_pts
return m * float(np.mean(u ** (m - 1 - c * m)))
print("f(x) = x^(-0.4) 在 [0, 1] 上,||f||_p = (1 - 0.4p)^(-1/p)(p < 2.5)")
print(f"{'p':>6} {'数值 ||f||_p':>16} {'精确值':>16} {'相对偏差':>12}")
for p in [1.0, 1.5, 2.0, 2.2, 2.4, 2.49]:
num = integral_power(0.4 * p) ** (1.0 / p)
ex = (1 - 0.4 * p) ** (-1.0 / p)
print(f"{p:>6} {num:>16.8f} {ex:>16.8f} {abs(num - ex) / ex:>12.3e}")
print("Hölder 不等式:||f g||_1 <= ||f||_p ||g||_q,f = x^(-0.2),g = x^(-0.3)")
print(f"{'p':>5} {'q':>7} {'||f||_p':>12} {'||g||_q':>12} {'||fg||_1':>12} "
f"{'右端/左端':>12} {'理论比值':>12}")
for p in [1.5, 2.0, 2.5, 3.0, 4.0]:
q = p / (p - 1.0)
nf = integral_power(0.2 * p) ** (1.0 / p)
ng = integral_power(0.3 * q) ** (1.0 / q)
nfg = integral_power(0.5)
th = (1 - 0.2 * p) ** (-1.0 / p) * (1 - 0.3 * q) ** (-1.0 / q) / 2.0
print(f"{p:>5.1f} {q:>7.2f} {nf:>12.6f} {ng:>12.6f} {nfg:>12.6f} "
f"{nf * ng / nfg:>12.6f} {th:>12.6f}")输出:
f(x) = x^(-0.4) 在 [0, 1] 上,||f||_p = (1 - 0.4p)^(-1/p)(p < 2.5)
p 数值 ||f||_p 精确值 相对偏差
1.0 1.66666667 1.66666667 1.559e-14
1.5 1.84201575 1.84201575 1.217e-14
2.0 2.23606798 2.23606798 9.136e-15
2.2 2.62152485 2.62152485 7.962e-15
2.4 3.82362246 3.82362246 6.156e-15
2.49 9.18392051 9.18392051 4.449e-15
Hölder 不等式:||f g||_1 <= ||f||_p ||g||_q,f = x^(-0.2),g = x^(-0.3)
p q ||f||_p ||g||_q ||fg||_1 右端/左端 理论比值
1.5 3.00 1.268434 2.154435 2.000000 1.366379 1.366379
2.0 2.00 1.290994 1.581139 2.000000 1.020621 1.020621
2.5 1.67 1.319508 1.515717 2.000000 1.000000 1.000000
3.0 1.50 1.357209 1.489675 2.000000 1.010900 1.010900
4.0 1.33 1.495349 1.466853 2.000000 1.096728 1.096728第一张表验证了
第二张表给出 Hölder 不等式的完整读数。
实验四:卷积平滑与 Cantor 函数
第一部分用热核平滑阶跃函数,观察
import math
import numpy as np
print("(a) 用热核 K_eps(x) = exp(-x^2/(4 eps)) / sqrt(4 pi eps) 平滑阶跃函数")
def phi(z):
return 0.5 * (1.0 + math.erf(z / math.sqrt(2.0)))
print(f"{'eps':>10} {'L1 误差':>14} {'最大点态误差':>16} {'L1 比值':>10}")
xg = np.linspace(-1, 1, 4001)
f0 = (xg > 0).astype(float)
prev_l1 = None
for eps in [1e-1, 1e-2, 1e-3, 1e-4]:
fe = np.array([phi(v / math.sqrt(2 * eps)) for v in xg])
l1 = float(np.trapezoid(np.abs(fe - f0), xg))
sup = float(np.max(np.abs(fe - f0)))
ratio = "-" if prev_l1 is None else f"{prev_l1 / l1:.2f}"
print(f"{eps:>10.1e} {l1:>14.6f} {sup:>16.6f} {ratio:>10}")
prev_l1 = l1
def cantor(x, n=40):
"""Cantor 函数:把三进制展开中的数字 2 改成二进制 1,遇到数字 1 则截断"""
if x >= 1.0:
return 1.0
y = 0.0
for i in range(1, n + 1):
x *= 3
d = int(x)
if d == 2:
y += 2.0 ** (-i)
x -= 2
elif d == 1:
y += 2.0 ** (-i)
return y
return y
print("(b) Cantor 函数:连续、单调,导数几乎处处为零,但 f(1) - f(0) = 1")
print(f" f(1/3) = {cantor(1/3):.10f},f(2/3) = {cantor(2/3):.10f},f(1) = {cantor(1.0):.10f}")
print(f" f(1/4) = {cantor(0.25):.10f}(理论值 1/3 = {1 / 3:.10f})")
print(f"{'网格点数':>12} {'最大步长增量':>16} {'零增量步数占比':>18} {'总变差':>12}")
for N in [10 ** 4, 10 ** 5, 10 ** 6]:
xs = np.linspace(0, 1, N + 1)
ys = np.array([cantor(v) for v in xs])
dv = np.diff(ys)
print(f"{N:>12} {float(np.max(dv)):>16.8f} {float(np.mean(dv == 0.0)):>18.6f} "
f"{float(np.sum(np.abs(dv))):>12.8f}")
print("(c) 奇异测度:导数的质量集中在不断变细的集合上")
print(f"{'网格点数':>12} {'导数非零的步数占比':>20} {'Σ|Δf|':>12} {'最大 |Δf|/Δx':>16}")
for N in [10 ** 3, 10 ** 4, 10 ** 5, 10 ** 6]:
xs = np.linspace(0, 1, N + 1)
ys = np.array([cantor(v) for v in xs])
dv = np.diff(ys)
slopes = dv / np.diff(xs)
print(f"{N:>12} {float(np.mean(dv > 0)):>20.6f} {float(np.sum(np.abs(dv))):>12.8f} "
f"{float(np.max(slopes)):>16.4e}")输出:
(a) 用热核 K_eps(x) = exp(-x^2/(4 eps)) / sqrt(4 pi eps) 平滑阶跃函数
eps L1 误差 最大点态误差 L1 比值
1.0e-01 0.352882 0.500000 -
1.0e-02 0.112838 0.500000 3.13
1.0e-03 0.035683 0.500000 3.16
1.0e-04 0.011285 0.500000 3.16
(b) Cantor 函数:连续、单调,导数几乎处处为零,但 f(1) - f(0) = 1
f(1/3) = 0.5000000000,f(2/3) = 0.5000000000,f(1) = 1.0000000000
f(1/4) = 0.3333333333(理论值 1/3 = 0.3333333333)
网格点数 最大步长增量 零增量步数占比 总变差
10000 0.00195312 0.936200 1.00000000
100000 0.00048828 0.972540 1.00000000
1000000 0.00012207 0.988196 1.00000000
(c) 奇异测度:导数的质量集中在不断变细的集合上
网格点数 导数非零的步数占比 Σ|Δf| 最大 |Δf|/Δx
1000 0.160000 1.00000000 9.7656e+00
10000 0.063800 1.00000000 1.9531e+01
100000 0.027460 1.00000000 4.8828e+01
1000000 0.011804 1.00000000 1.2207e+02(a) 平滑核的收敛形态。卷积
(b) Cantor 函数的基本性质。
网格数据给出两条关键信息。最大步长增量随网格加密按
(c) 奇异测度的数值特征。导数非零的网格步占比从
5.10.8 本节小结
测度论的五层内容
本节把测度与 Lebesgue 积分组织为五层。测度层给出
测度论给出了积分的严格基础,下一节回到几何与变分。曲线与曲面的曲率、测地线、Euler-Lagrange 方程与 Sobolev 空间构成了变分法的内容,其中最优化、机器学习与物理中的大量问题都可以写成「求一个泛函的极小值」,本节建立的
练习题
第 1 题 概念推导
(a) 证明零测集的子集是零测集,并说明为什么「
参考答案
(a) 设
积分部分的证明:设
(b) 关系是包含:
Lebesgue 可积但 Riemann 不可积的例子是 Dirichlet 函数
(c) 若不认同几乎处处相等的函数,
第 2 题 计算推理
(a) 用单调收敛定理计算
参考答案
(a) 被积函数是正项级数:
结论是发散。右侧的调和级数发散,左侧的积分
(b) 交换不合法,因为被积函数列没有可积的控制函数:
积分列发散到无穷,而
(c)
第 3 题 代码验证
用本节代码做三组实验并解释:(a) 在实验一里把第二组的区间从
参考答案
(a) 新的函数列是
(b) 指数
(c) 取
第 4 题 综合应用
某统计程序需要从
参考答案
判断框架的核心是把两次运算都写成积分,然后用 Fubini 定理或收敛定理判断换序是否合法。设
(第二种写法是「先对样本平均」,即先用样本估计
检查步骤分三步。
绝对可积性。检查
,即 。这一步决定能否使用 Fubini 定理。若 ,换序可能给出不同的值(经典的例子是重尾分布下的「样本均值与理论均值的次序问题」,此时样本均值不收敛,两种次序没有可比性)。 可测性与条件期望的存在性。
作为 的函数需要可测(由条件期望的定义与 Radon-Nikodym 定理保证),否则「对 积分」没有意义。这一步在实践中通常自动满足(条件期望按 Radon-Nikodym 定理定义,本身就要求可测),但在非标准的情形(例如参数空间不是欧氏空间)需要单独检查。 数值可辨识性。即使理论上两种次序相等,数值上仍可能有偏差:内层期望若用少量样本估计(例如用
的 个分位点做数值积分),偏差的量级是 量级;外层用 个样本估计,标准误是 。两者的量级相当,因此换序带来的差异可能被数值误差掩盖。检查方式是用同一批随机数做两次计算(公共随机数),比较结果的差与各自的标准误。
会失败的情形:
实施建议:先用解析方法确认
常见错误
错误 1 · 把「几乎处处」当作「处处」使用
原因:Lebesgue 理论的结论大多以「几乎处处」的形式成立,忽略这个限定会得到不成立的强结论。典型例子是:
解决:写结论时保留「几乎处处」的限定,除非确实证明了处处成立(连续函数的情形通常可以,因为连续函数在零测集外相等蕴含处处相等)。涉及具体数值的结论(某点的值、某处的导数)要单独确认,不能从 a.e. 的结论直接推出。调试时把「在哪些点上结论可能失效」作为检查项,特别是跳跃点、定义域端点与奇异集合附近。
错误 2 · 在没有控制条件时交换极限与积分
原因:控制收敛定理需要可积的控制函数,单调收敛定理需要单调性,条件不满足时交换可能失败。本节实验一的后两组、练习 2(b) 的
解决:交换前按顺序检查三条:单调性(非负且单调递增时直接用单调收敛定理);可积控制函数(找到
错误 3 · 把条件收敛的反常积分当作 Lebesgue 可积
原因:Lebesgue 积分只处理绝对可积的情形。
解决:区分「反常 Riemann 积分收敛」与「Lebesgue 可积」,后者要求绝对值可积。使用
错误 4 · 用直方图或网格上的差分判断密度是否存在
原因:有限分辨率的数值结果无法区分绝对连续与奇异。实验四(c) 的数据给出明确的证据:Cantor 函数在
解决:判断密度是否存在时检查「质量所在的集合随分辨率如何变化」:在两级或多级网格上计算「非零增量的步数占比」与「最大增量随步长的变化」,若占比随网格加密趋向零而总变差保持不变,说明质量集中在一个测度趋零的集合上,属于奇异型;若占比保持为