压缩映射定理,也叫 Banach 不动点定理,是我做研究和带学生时反复用到的一个结果。它说的是:在一个完备度量空间里,如果某个映射 T 能把任意两个点的距离至少缩小一个固定比例,那么这个映射一定有且只有一个不动点,而且从任何初始点出发反复迭代都会精确地靠近它。这个定理很“便宜”:不要求空间是欧氏空间,不要求 T 线性、可微,甚至不要求提前知道解长什么样。它同时给出存在性、唯一性、收敛性、误差估计和构造算法。所以从常微分方程初值问题到积分方程再到数值迭代,它都是绕不开的关节。这篇文章把证明的每一个关键步骤掰开讲,顺带梳理定理背后的动机、证明中容易忽略的“为什么”,以及几个经典反例,希望看完你也能自己推一遍。
1. 从解方程到迭代:压缩映射定理的直观图景
1.1 把“求根”变成“找不动点”
数学和工程里大量问题最终都能写成“求 x 使 F(x)=0”。这种形式虽然标准,但很多时候并不好用。换个角度,把它改写成 x = T(x),原本的求根问题就变成找映射 T 的不动点。比如解方程 x³ - x - 2 = 0,可以写成 x = ∛(x+2),于是从任意 x₀ 出发,不停计算 x_{n+1} = ∛(x_n+2),如果这个数列收敛,极限大概率就是方程的解。
这个朴素思路并非空想。数值分析里的牛顿法、割线法、不动点迭代法,本质都是在构造一个合适的 T,然后反复迭代。问题是:你凭什么保证序列一定收敛?如果收敛,极限是唯一的不动点吗?误差有多大?这些疑问,压缩映射定理一次性全回答了。它像一个通用的“收敛性保险”:只要你的 T 满足一个只与距离有关的条件,迭代法就自动成立了。
我用一个生活类比帮学生理解:压缩映射就像一个“缩小镜”,无论你把两个点放在镜前什么位置,镜中的像都比原物至少缩短一个固定比例。你不断把像再放到镜前,像会越来越小,最终所有的点都挤到同一个位置——那个位置就是不动点。这个类比虽然不严谨,但抓住了压缩条件的核心:每操作一次,距离都会按照一个固定比率衰减。
1.2 定理名字背后的故事与内涵
这个定理由波兰数学家斯特凡·巴拿赫在1922年给出,所以也叫巴拿赫不动点定理。它属于度量空间理论中最早也最漂亮的结果之一。巴拿赫当时的动机之一,是把积分方程和微分方程的存在唯一性问题统一成一个抽象的迭代问题。这种做法在当时的分析领域很有冲击力:不再执着于具体表达式的计算,而是把问题放到一个“空间”里,只考察空间元素之间的距离和映射的性质。
从现代视角看,压缩映射定理是泛函分析中“算子观点”的典范。它告诉我们,不需要知道空间里每个元素的坐标,不需要展开成级数,甚至连映射的具体公式都不重要。唯一重要的性质是:这个映射在度量意义下“缩短距离”。这种抽象思维后来发展成不动点理论的大家族,包括 Brouwer 不动点定理、Schauder 不动点定理、Leray-Schauder 度理论等等。但巴拿赫这个版本始终是最特殊的一个,因为它给的不仅是存在性,还是一套能落地的算法。
这也是为什么我建议每个学分析的人都要亲手把它的证明写一遍。证明不长,但每个步骤都充满典型技巧:构造迭代序列、用等比级数控制距离、借助完备性取极限、利用压缩条件证唯一性。这几个动作几乎贯穿了所有和迭代、逼近有关的数学分支。
1.3 为什么这是“一石三鸟”的定理
很多存在性定理只告诉你“解存在”,不告诉你怎么找,也不保证唯一。压缩映射定理却很慷慨,它一次给出三样东西。
存在性:迭代序列收敛,极限就是不动点。唯一性:如果还有另一个不动点,两者距离必须同时小于等于一个小于1的倍数,只能为零。构造性:从任意初值 x₀ 出发,xₙ = Tⁿx₀ 就是逼近序列,而且有明确的速度估计。这三者天然绑定,背后是压缩条件极强的控制力。相比之下,像介值定理只能保证零点存在,却不能保证唯一;牛顿法能构造逼近序列,但全局收敛需要额外条件。压缩映射定理把“能算”和“存在”统一成一个命题,这在数学里是很少见的。
我常和学生说,如果你在方程式里看到一个积分、一个微分或一个复杂的非线性变换,别急着硬解,先试试能不能把它构造成一个压缩映射。凡是能构造出来的,后面所有问题都顺了。
2. 证明的地基:定理完整陈述与条件解剖
2.1 完备度量空间与压缩映射的标准定义
要严谨地陈述定理,需要三个基本概念:度量空间、完备性、压缩映射。
度量空间就是带距离的空间。集合 X 配上满足三条公理的函数 d:X×X→[0,∞),三条公理是正定性(d(x,y)=0 当且仅当 x=y)、对称性(d(x,y)=d(y,x))和三角不等式(d(x,z)≤d(x,y)+d(y,z))。实数轴、欧氏空间 Rⁿ、连续函数空间 C[a,b] 配上 sup 范数、平方可积序列空间 ℓ² 配上 ℓ² 距离,都是标准的度量空间。
完备性指的是:空间里每个柯西列都在空间内部收敛。直观说,这个空间没有“洞”,任何看起来要聚到某点的序列,那个点一定还留在空间里。有理数集 Q 作为实数轴上的子空间不完备,因为可以有有理数序列以无理数为极限。闭区间 [0,1] 完备,开区间 (0,1) 不完备。
压缩映射的定义是:设 (X,d) 为度量空间,T:X→X。若存在常数 λ∈[0,1),使得对任意 x,y∈X,有 d(Tx,Ty)≤λ d(x,y),则称 T 为压缩映射,λ 叫压缩常数。注意这里要求 λ 严格小于 1,并且对所有点对都一样。这是一个全局性质。
2.2 定理完整表述
现在可以写出标准形式:
定理(Banach 不动点定理 / 压缩映射定理):设 (X,d) 是非空完备度量空间,T:X→X 是压缩映射,压缩常数为 λ∈[0,1)。则 T 在 X 中存在唯一的不动点 x*,即 Tx* = x*。更进一步,对任意 x₀∈X,由 x_{n+1}=Tx_n 定义的迭代序列都收敛到 x*。
这个表述里有一个容易被忽略的细节:压缩映射自动一致连续。因为对任意 ε>0,只要 d(x,y)<δ=ε/(λ+1),就有 d(Tx,Ty)≤λ d(x,y)<ε。所以在证明的最后阶段,可以放心地把极限符号放进 T 里面,这个性质稍后会用到。
2.3 三个条件,少一个都不行
如果用一句话概括定理的条件,就是“空间完备 + 全局一致压缩”。这两个条件缺一不可。此外,虽然定理中没有单独列出连续性,但连续性是压缩条件免费赠送的,所以不需要额外假设。
为什么完备性不能去掉?因为迭代序列看起来柯西,但极限可能跑出空间。一个经典反例来自有理数区间。令 X = Q∩[0,1],配通常实数距离。定义 T(x) = x²/4 + 1/4。
先检查 T 是否把 X 映到 X:x 是有理数时,T(x) 显然是有理数;同时当 x∈[0,1] 时,T(x) 的最小值是 T(0)=1/4,最大值是 T(1)=1/2,所以 T(x)∈[1/4,1/2]⊂[0,1]。因此 T 是 X 到 X 的映射。压缩性用平方差公式验证:
|T(x)-T(y)| = |x²-y²|/4 = ((x+y)/4)|x-y| ≤ (1/2)|x-y|。
所以 λ=1/2,T 是压缩映射。然而不动点要满足 x=x²/4+1/4,即 x²-4x+1=0,解得 x=2±√3。落在 [0,1] 里的只有 2-√3≈0.268,这是一个无理数,不属于 X。于是这个压缩映射在 X 里没有任何不动点。问题出在哪?空间不完备,极限在外部。这个例子我建议你亲手算一遍,体会“完备性”到底保护了什么。
再看压缩常数统一小于 1 是否必须。考虑 X=[1,∞),T(x)=x+1/(x+1)。因为 T(x)>x,所以任何 x 都不是不动点,T 不可能满足压缩映射定理的结论。但它是否“看起来像压缩”?
对任意 x,y≥1,计算
|T(x)-T(y)| = |x-y + 1/(x+1) - 1/(y+1)| = |x-y| · |1 - 1/((x+1)(y+1))|。
因为 (x+1)(y+1)≥4,后面那个因子严格小于 1,于是 |T(x)-T(y)|<|x-y|。也就是说,任意两点经过 T 后距离严格缩短,但缩短的比例下确界是 1,无法找到一个统一的小于 1 的 λ。这个例子告诉我们:逐点严格缩短并不够,必须存在一个全局统一的 λ<1。否则迭代的收敛速度可能无限慢,最后根本收敛不到不动点。
3. 一步一步走完证明:从任意点出发都收敛
3.1 画出一条迭代轨迹
证明从任取 x₀∈X 开始。令 x₁=Tx₀,x₂=Tx₁,一般地
x_{n+1} = Tx_n。
这个序列完全由初值 x₀ 决定。先看相邻两项之间的距离。由压缩条件反复套用:
d(x₂,x₁) = d(Tx₁,Tx₀) ≤ λ d(x₁,x₀)。
继续下去,
d(x₃,x₂) ≤ λ d(x₂,x₁) ≤ λ² d(x₁,x₀)。
归纳得到:
d(x_{n+1},x_n) ≤ λⁿ d(x₁,x₀)。
这是一个等比序列。因为 λ<1,相邻两项之间的距离随 n 指数衰减。这个估计是整个证明的第一块基石。如果 d(x₁,x₀)=0,那么 x₀ 已经是不动点,后面就不用讨论了。一般情形下 d(x₁,x₀)>0,这个值会成为误差估计中的初始项。
3.2 用等比级数证明序列是柯西列
光看相邻项还不够,要证明极限存在,通常需要是柯西列:对任意 ε>0,存在 N,使得所有 m,n>N 都满足 d(x_m,x_n)<ε。怎么得到这个估计?三角不等式把差得很远的两个点拆成一条由相邻点组成的路径。
不妨设 m>n。反复利用三角不等式:
d(x_m,x_n) ≤ d(x_m,x_{m-1}) + d(x_{m-1},x_{m-2}) + ... + d(x_{n+1},x_n)。
代入相邻距离估计,得到
d(x_m,x_n) ≤ Σ_{k=n}^{m-1} λ^k d(x₁,x₀)。
等比数列前几项求和有明确公式:
Σ_{k=n}^{m-1} λ^k = λⁿ(1-λ^{m-n})/(1-λ) ≤ λⁿ/(1-λ)。
所以
d(x_m,x_n) ≤ d(x₁,x₀) · λⁿ/(1-λ)。
现在固定初始距离 d(x₁,x₀),由于 λⁿ→0,只要 n 足够大,右边可以任意小。因此 {x_n} 是柯西列,这正是压缩条件里 λ<1 最核心的体现:只要距离按固定比率衰减,就算每段路走得远,整条路的长度加起来也被一个等比级数控制住。
3.3 极限落到空间里,并且真的是不动点
柯西列只是故事的一半。如果空间不完备,这个序列可能没有极限,反例已经在前面看到。但定理假设 X 完备,于是存在 x∈X,使得 x_n→x。
接下来验证 x* 是不动点。因为 T 是压缩映射,所以连续。更具体地说,T 是 Lipschitz 连续的,Lipschitz 常数 λ。可以这样写:
d(Tx_n, Tx*) ≤ λ d(x_n, x*)。
由于 d(x_n,x*)→0,必有 d(Tx_n,Tx*)→0,也就是说 Tx_n→Tx*。
另一方面,根据迭代定义 x_{n+1}=Tx_n。序列 {x_{n+1}} 是 {x_n} 去掉第一项后的子列,当然也收敛到 x*。同一个序列如果收敛,极限唯一。因此 Tx* 和 x* 这两个极限必须相等,即 Tx*=x*。
这里有一个非常微妙但值得驻足的细节:我们之所以能说 Tx_n 收敛到 Tx*,是因为已经用到了压缩条件里的 Lipschitz 连续性。如果换成随机给的映射,即便序列收敛,极限也完全可能不是不动点。压缩条件看似只是用来控制迭代轨迹,实际上还悄悄保证了“极限能够穿过映射”,这是一箭双雕。
3.4 唯一性检验
唯一性的证明几乎是白送的。假设存在两个不动点 p 和 q,即 Tp=p,Tq=q。利用压缩条件:
d(p,q) = d(Tp,Tq) ≤ λ d(p,q)。
于是 (1-λ)d(p,q)≤0。因为 λ<1,所以 1-λ>0,只能有 d(p,q)=0。度量空间的正定性给出 p=q。
整个证明到此完整。如果把它浓缩成四句话:构造迭代序列;用等比级数和三角不等式证明它是柯西列;用完备性取极限;用压缩条件的连续性证明极限是不动点,再用同一条件证唯一性。四步环环相扣,没有一个条件可以删掉。
4. 证明自带的三样礼物:误差估计与收敛速度
4.1 先验误差估计的来龙去脉
证明柯西列时,我们已经得到了一个重要不等式:
d(x_m,x_n) ≤ d(x₁,x₀) · λⁿ/(1-λ)。
把 m 推向无穷,由于 d 关于两个变量连续,可得
d(x_n,x*) ≤ d(x₁,x₀) · λⁿ/(1-λ)。
这叫先验误差估计:还没算出 x_n,光凭初始距离和压缩常数就能预判第 n 步的最大误差。它的价值在于可以在迭代开始前规划计算量。如果你要求误差不超过 ε,只需要让
λⁿ/(1-λ) · d(x₁,x₀) ≤ ε,
取对数就能解出需要的迭代步数 n。当然这里需要知道 d(x₁,x₀) 和 λ,前者可以在算出 x₁ 后立刻得到,后者往往从映射的 Lipschitz 常数估计中获得。
从另一个角度看,这个公式还揭示了为什么 λ 越接近 1 越麻烦。当 λ=0.9 时,λⁿ 衰减很慢,可能需要很多次迭代才能把误差压下来;当 λ=0.1 时,一步就能让误差缩小十倍。所以实际应用里,很多人会先做变换,尽量构造出压缩常数小的映射。比如解方程时选取合适的松弛因子,本质上就是在优化 λ。
4.2 后验误差估计和停机准则
光有先验估计不够,因为实际计算中你很难保证第 n 步的误差真的达到预算。用观测到的相邻两项距离来估计误差更实用。设当前迭代到 x_n,想估计 d(x_n,x*)。
利用三角不等式和压缩条件:
d(x_n,x*) ≤ d(x_n,x_{n+1}) + d(x_{n+1},x*) ≤ d(x_n,x_{n+1}) + λ d(x_n,x*)。
把右边的 λ d(x_n,x*) 移到左边:
(1-λ)d(x_n,x*) ≤ d(x_n,x_{n+1}),
所以
d(x_n,x*) ≤ d(x_n,x_{n+1})/(1-λ)。
这个估计非常漂亮:只要算出相邻两项的距离,除以 (1-λ),就是当前误差的上界。换句话说,即使不知道真实解 x*,也能知道计算到哪一步该停了。如果你希望误差不超过 ε,只需要满足
d(x_n,x_{n+1}) ≤ (1-λ)ε。
这就是实际数值迭代中的停机准则。很多教科书只写先验估计,忽略了后验估计,但真正写代码时后验估计才是天天用的东西。我见过不少同学用先验估计卡步数,结果迭代了 100 步还在跑,因为他们不知道可以实时看相邻差。其实用相邻差作为停止条件,既简单又稳健。
4.3 收敛速度的直觉
由先验估计可以看出,误差大致按 λⁿ 衰减。这种收敛叫做线性收敛(或几何收敛),因为每迭代一步,误差上界乘一个固定比率 λ。相比之下,牛顿法在局部可以达到二次收敛,但那是建立在导数信息上的,要求苛刻得多。
线性收敛的实际含义是“误差里约有一位数在前进”。λ 是 0.1,大概每次迭代多一位有效数字;λ 是 0.316,大约两次迭代多一位有效数字;λ 如果到了 0.9,可能要二十多次才多一位有效数字。所以在算法设计里,人们总是试图把 λ 压小。比如求解线性方程组时,可以对方程做预处理,使得迭代矩阵的范数尽可能小于 1,这就是“预条件”思想的一个朴素来源。
当然,压缩映射定理给出的只是“充分条件”,不是“必要条件”。某些非压缩映射也可能有不动点,甚至可能收敛很快,只是那种情况没有统一理论保证。放到工程里,我们的原则是:尽量把系统设计成压缩的,这样稳定性就有保证。
5. 从黑板到方程:在微分方程与积分方程中看到压缩
5.1 常微分方程初值问题的皮卡-林德洛夫定理
压缩映射定理在微分方程中最经典的应用是证明初值问题解的存在唯一性。考虑
y'(t) = f(t, y(t)), y(t₀) = y₀。
如果 f 足够好,这个方程等价于积分方程:
y(t) = y₀ + ∫_{t₀}^{t} f(s, y(s)) ds。
把右边看成关于 y 的算子:
T(y)(t) = y₀ + ∫_{t₀}^{t} f(s, y(s)) ds。
在连续函数空间 C([t₀-δ, t₀+δ]) 上配 sup 范数,这个空间是完备的。设 f 关于第二个变量满足 Lipschitz 条件:
|f(s,u)-f(s,v)| ≤ L|u-v|。
那么对任意两个连续函数 y₁,y₂,差值为
T(y₁)(t)-T(y₂)(t) = ∫_{t₀}^{t} [f(s,y₁(s))-f(s,y₂(s))] ds。
取绝对值并放大:
|T(y₁)(t)-T(y₂)(t)| ≤ L ∫_{t₀}^{t} |y₁(s)-y₂(s)| ds ≤ L δ ||y₁-y₂||∞。
于是
||T(y₁)-T(y₂)||∞ ≤ L δ ||y₁-y₂||∞。
只要把区间半径 δ 取得足够小,让 Lδ<1,T 就是一个压缩映射。于是定理断定在小区间上存在唯一连续解,再通过延拓技术把解扩展到更大范围。这就是皮卡-林德洛夫定理的证明骨架。
这个证明妙在:微分方程原本是涉及导数的局部问题,被压缩映射定理变成了一个“找不动点”的积分问题。导数的高难度信息全部藏在 Lipschitz 条件里,剩下的交给距离估计。
5.2 Volterra 积分方程的全局压缩:加权范数技巧
上面的处理依赖 δ 足够小,只得到了局部解。如果 f 在全局满足 Lipschitz 条件,能不能直接得到整个区间上的压缩?答案是可以,但需要换一种度量。这就是加权范数(或叫指数范数)技巧,也是我希望每个学应用分析的人都掌握的手法。
考虑 Volterra 型积分方程
y(t) = g(t) + ∫_{a}^{t} K(t, s, y(s)) ds,
其中 K 对第三个变量满足 Lipschitz 条件:
|K(t,s,u)-K(t,s,v)| ≤ L|u-v|。
直接配 sup 范数得到常数 L(b-a),如果区间很长,可能大于 1,压不住。于是定义加权范数:
||y||λ = sup{t∈[a,b]} e^{-λ(t-a)} |y(t)|,
其中 λ>0 待定。这个范数和 sup 范数等价,保证空间仍然是完备的。设 T 为方程右端定义的积分算子,则
|T(y₁)(t)-T(y₂)(t)| ≤ L ∫_{a}^{t} |y₁(s)-y₂(s)| ds。
把右边改写为
L ∫_{a}^{t} e^{λ(s-a)} e^{-λ(s-a)} |y₁(s)-y₂(s)| ds ≤ L ||y₁-y₂||λ ∫{a}^{t} e^{λ(s-a)} ds ≤ L ||y₁-y₂||_λ · e^{λ(t-a)}/λ。
两边同乘 e^{-λ(t-a)},再对 t 取上确界:
||T(y₁)-T(y₂)||_λ ≤ (L/λ) ||y₁-y₂||_λ。
只要选 λ>L,压缩常数就是 L/λ<1。这样不需要限制区间长度,直接在完整区间上得到了压缩。加权范数相当于对不同位置做“惩罚”:越靠后的误差在范数中权重越高,从而抵消了积分累积造成的膨胀。这种手法在偏微分方程、概率论和数值分析里也会反复出现,建议背诵并理解。
5.3 构造性证明的意义
和其他只证存在性的定理相比,压缩映射定理给出的不动点是“算出来的”。每做一次迭代,就相当于对解做一次逼近。在很多实际方程里,连解的显式表达式都没有,但迭代格式可以写进代码,几步之后就能得到足够好的近似解。
我记得自己第一次在数值实验里用 Picard 迭代求解非线性常微分方程时,印象特别深。方程本身没有初等解,但取一个常数初值,反复代入积分公式,两次迭代之后曲线就已经和数值求出的精确解几乎重叠了。那一刻我才真正理解为什么巴拿赫定理被称作构造性不动点定理。它不但告诉你“有”,还告诉你“怎么找”。在数值计算里,很多迭代格式之所以能收敛,背后的理论底座就是压缩映射定理。
6. 常见误区、判断技巧与一点教学心得
6.1 三个高频误区
我在批改作业和答疑时,发现有三个误区出现频率特别高。
第一个误区是把压缩条件误写成 d(Tx,Ty)<d(x,y)。这个条件比真正的压缩弱得多,它只要求每次距离严格缩短,但没有统一比例。前面举过的例子 T(x)=x+1/(x+1) 已经说明,严格缩短可以发生在每一个点对身上,却不存在不动点。所以在应用时,一定要检查是否存在一个真正小于 1 的常数 λ,而不是停留在“似乎变小了”的直觉上。
第二个误区是以为映射一定要可微,用导数绝对值小于 1 来判断。这个办法对许多光滑函数有效,但不是本质。压缩映射只需要 Lipschitz,完全可以是不可导函数,比如 T(x)=|x|/2 在 x=0 处不可导,但它显然是一个压缩常数 1/2 的压缩映射。反过来,某个函数在各点导数绝对值都小于 1,也不代表它一定是压缩映射,因为导数的上确界可能等于 1,就像前面那个逐点缩短的例子。
第三个误区是忽略空间完备性。不少人在证明不动点存在时,辛辛苦苦构造出柯西列,然后直接说“所以收敛”,却没有检查极限是否在空间内。在 R 或 C 上习惯了闭区间,往往以为空间都天然完备。但有理数区间、开区间、连续函数空间若配错范数,都可能不完备。证明之前先确认空间完备,这是省时间的好习惯。
6.2 如何快速判断一个映射是不是压缩映射
如果是定义在凸区域上的可微函数或向量值映射,最常用的手段是中值定理或其多元版本。对一元可微函数,若 |f'(x)|≤λ<1 恒成立,则 f 的压缩常数就是 λ。对多元映射 F,若雅可比矩阵的某种范数在区域内一致小于 1,也能推出 Lipschitz 常数小于 1。但要注意,中值定理要求区域是凸的;如果区域不凸,即使逐点导数很小,也不能直接套用。
当映射不可导或者区域非凸时,就要回到定义,直接验证:
d(Tx,Ty) ≤ λ d(x,y)。
常见技巧包括:先平方差公式分解、再三角不等式放大;把差值写成积分形式再估计被积函数;利用已知函数的 Lipschitz 常数做组合,比如 Lipschitz 函数之和的常数为常数之和,Lipschitz 函数复合的常数为常数之积。这些技巧都指向同一件事:找一个尽量接近真实放大倍数的 λ,不要为了图方便放得太粗,否则会得出“不是压缩”的错误结论。
还有一个实用细节:证明压缩映射定理的误差估计时,需要知道 d(x₁,x₀)。如果你只是验证存在唯一性,这个值不需要提前计算;但如果要做数值计算,先算一步迭代得到 x₁,就能直接把初始距离代进误差公式,非常方便。
6.3 备课多年,我最想提醒的一件事
如果让我只挑一个最重要的提醒,那就是“证明里每一步都要回看条件”。很多同学背住了证明的框架,却不知道压缩条件在哪里发挥了作用。实际上,它至少出现了三次:第一次用来推导相邻距离的等比衰减,第二次用来证明极限穿过映射时保持不动点方程,第三次用来证明唯一性。完备性只出现在“取极限”那一步。把这些对应关系写在纸上,你对这个定理的理解就会从一个公式变成一个体系。
另一个我常对学生说的是:这个定理的证明思路,本身就是一套可复制的思想方法。遇到一个新问题,先构造迭代格式,再验证压缩性,最后套误差估计。不管问题来自数值分析、概率论还是机器学习,这套流程都能用。它教会我们的不是某个具体公式,而是“用距离控制误差、用迭代逼近答案”的思维方式。
我个人在实际备课中还有一个小习惯:每讲完这个定理,都让学生不看课本,从零开始写一遍证明。能独立写出来的人,才算真正掌握了完备性、柯西列、Lipschitz 连续这几个概念之间的协作方式。如果你也正在学这部分内容,不妨试试。写完之后你大概也会有我当年的感受:这个定理简单,但它值得你反复琢磨。