Barbalat引理详解:从积分收敛到函数趋于零的证明与工程应用
翻到去年7月1日那版笔记时我还在反复琢磨同一件事Barbalat引理到底凭什么把“积分收敛”这种整体性质直接推到“函数本身趋于零”这种逐点性质。很多教材都是先给出引理再用它证自适应控制里的收敛性中间的“所以”一步带过。第一次读的时候我没有任何异议等到自己动手推导才意识到这里的水比看起来深不少。这篇博文就当作我那份笔记的完整展开把证明、原理、坑和工程用法一次说透。1. 积分收敛不代表函数趋于零先看反直觉在哪里先看引理最常见的表述Khalil在《Nonlinear Systems》里给过一版若函数 $\phi(t)$ 在 $[0,\infty)$ 上一致连续且极限 $\lim_{t\to\infty}\int_0^t \phi(\tau)d\tau$ 存在且有限则 $\lim_{t\to\infty}\phi(t)0$。注意这里没有要求 $\phi(t)$ 非负。$\phi(t)$ 可以是变号的$F(t)\int_0^t\phi(\tau)d\tau$ 只需要收敛到某个有限数即可。这个版本在稳定性分析里最实用因为工程中我们经常把 $\phi(t)$ 取成 $\dot V(t)$而 Lyapunov 函数的导数未必恒为非负。不少初学者会犯一个直觉错误既然积分收敛被积函数当然要趋于零。这句话在“函数在无穷远处保持正常波动”的直觉下是对的但严格说并不成立。最经典的反例是 $\phi(t)\sin(t^2)$$$\int_0^\infty \sin(t^2),dt$$这个积分是收敛的结论可以追溯到 Fresnel 积分但 $\sin(t^2)$ 在 $t\to\infty$ 时根本不收敛它一直在 $[-1,1]$ 之间振荡极限不存在。为什么会这样因为振荡频率越来越高正面积和负面积在高频下互相抵消积分总量有限但函数值始终不趋于零。这个例子说明积分收敛只能说明“面积”总量有限说明不了函数本身的衰减行为。另一个更直观的反例是所谓“梳子函数”在区间 $[n, n\frac{1}{n^2}]$ 上令函数值为 $1$其他地方为 $0$$n1,2,\dots$。每个“齿”的宽度只有 $\frac{1}{n^2}$高度为 $1$所以每个齿面积是 $\frac{1}{n^2}$总积分 $\sum_{n1}^\infty\frac{1}{n^2}\infty$但函数在无穷远处会无数次回到 $1$自然不趋于零。这两个反例的共同点是什么函数在“极限不趋于零”的同时可以把变化控制得极其剧烈——要么频率无限升高要么脉冲无限变窄。它们都不一致连续。Barbalat 引理加上的“一致连续”条件本质上就是排除了这两类病态行为既不允许无限高频振荡也不允许无限窄的尖脉冲。把这个逻辑翻译成大白话积分收敛意味着总“消耗”有限一致连续意味着函数不能像脉冲那样任意窄地跳变。于是想在无穷远处保持一个不为零的最小幅度就必须每隔一段距离产生一块至少固定大小的“面积”总面积必为无穷大矛盾。整个引理的证明就是把这个矛盾严格化。2. 它补上了时变系统收敛性分析的关键缺口在没接触自适应控制之前我对 Lyapunov 稳定性理论的理解停留在自治系统上构造一个正定的 $V(x)$证明 $\dot V(x)\le0$再用 LaSalle 不变集原理把状态拉回到 $\dot V0$ 的最大不变集里。这套方法在自治系统里非常好用但对时变系统就失效了。原因在于 LaSalle 不变集原理依赖轨线的极限集是系统的不变集这要求系统方程不显含时间。工程实际里几乎没有真正的自治系统参数辨识里的回归向量 $\phi(t)$ 随时间变化自适应控制里的参考输入 $r(t)$ 也在变化整个闭环系统是 $\dot xf(t,x)$ 的形式。对这类系统LaSalle 原理没有合适的表述版本。那能不能退回 LaSalle 之前只用 Lyapunov 函数的有界性能但收敛性不够。假设构造函数 $V(t,x)$ 满足 $V\ge0$ 且 $\dot V\le0$我们能得到的只是 $V(t,x(t))\le V(0,x(0))$状态有界。至于状态是否收敛到某个平衡点、误差是否趋于零单靠这个不等式什么都推不出来。Barbalat 引理恰好补上了这一步。它不要求系统自治只要求两个条件能验证$V(t)$ 的单调有界性给出 $\int_0^\infty -\dot V(\tau)d\tau\le V(0)\infty$相当于 $\dot V$ 的积分收敛再额外验证 $\dot V$ 一致连续。于是直接推出 $\dot V(t)\to0$。很多情况下 $\dot V$ 是某个误差信号的负二次型$\dot V\to0$ 就等价于误差本身趋于零。这就是自适应控制证明里的标准叙事闭环系统是时变的没法用 LaSalle但可以用 Barbalat。可以说这个引理把“时变系统的渐近收敛”从一个棘手问题变成了一个常规的分析流程。这里还要澄清一个容易混淆的点很多教材在证自适应收敛时会写“因为 $V$ 有下界且 $\dot V\le0$所以 $\dot V\to0$”这句话不能单独立论。单调有界给出的是 $V(t)$ 有极限不是 $\dot V(t)$ 有极限。从 $V$ 单调有界到 $\dot V\to0$中间必须经过 Barbalat 引理而且必须验证一致连续。后面我会用一个完整例子展示这条链是怎么走下来的。3. 完整证明用反证法把四个条件逐个用起来现在把证明推到最细。我把引理再写一遍设 $\phi(t)$ 在 $[0,\infty)$ 上一致连续且 $F(t)\int_0^t\phi(\tau)d\tau$ 当 $t\to\infty$ 时收敛到有限值则 $\phi(t)\to0$。证明采用反证法这是最顺的思路。如果 $\phi(t)$ 不趋于零一致连续会强迫函数在某个固定长度的区间上保持一个固定幅值进而这段区间上的积分有固定下界但积分收敛意味着“足够晚的区间”上积分必须任意小矛盾。3.1 反设极限不为零用序列把这句话量化假设 $\lim_{t\to\infty}\phi(t)0$ 不成立。按极限定义取反存在一个 $\varepsilon_00$使得对任意大的 $T$都能找到 $tT$ 满足 $|\phi(t)|\ge\varepsilon_0$。于是可以挑选一个严格递增且无界的序列 ${t_n}$使得每个 $t_n$ 都满足 $|\phi(t_n)|\ge\varepsilon_0$。为了后面方便把这里的幅值直接记成 $2\varepsilon$也就是$$|\phi(t_n)|\ge 2\varepsilon,\qquad \varepsilon0.$$为什么是 $2\varepsilon$ 而不是 $\varepsilon$因为接下来要利用一致连续性在 $t_n$ 附近的一个小区间上把函数值“锁”在某个正的下界之上。留出一倍的余量是为了让后面的不等式能严格得到 $|\phi(t)|\varepsilon$。如果一开始只取 $\varepsilon$一致连续的定义只能保证邻域内 $|\phi(t)-\phi(t_n)|\varepsilon$缩放一下就剩不下什么东西了。这种“取两倍余量”的技巧在分析证明里非常常见第一次见可能觉得多此一举自己推一遍就会发现它很关键。3.2 一致连续性给出“保号邻域”由 $\phi(t)$ 在 $[0,\infty)$ 上一致连续对上面这个 $\varepsilon0$存在 $\delta0$使得当 $|s-t|\delta$ 时有$$|\phi(s)-\phi(t)|\varepsilon.$$注意这个 $\delta$ 只依赖于 $\varepsilon$不依赖于具体的 $t$。这正是“一致”二字的意义。如果只有普通连续性$\delta$ 可能随着 $t$ 的不同而趋近于零后面就无法在所有 $t_n$ 处用同一个固定长度的区间。现在取任一个 $t_n$。对任意 $t\in[t_n,t_n\delta]$利用三角不等式$$|\phi(t)|\ge|\phi(t_n)|-|\phi(t)-\phi(t_n)|.$$因为 $|\phi(t_n)|\ge2\varepsilon$ 且 $|\phi(t)-\phi(t_n)|\varepsilon$得到$$|\phi(t)|\varepsilon.$$这里还牵涉到一个符号问题。如果只看绝对值得到的是 $|\phi(t)|\varepsilon$但积分里需要处理的是 $\phi(t)$ 而不是 $|\phi(t)|$。好在一致连续性保证了 $\phi(t)$ 与 $\phi(t_n)$ 的误差不超过 $\varepsilon$而 $\phi(t_n)$ 的绝对值至少是 $2\varepsilon$所以 $\phi(t)$ 在区间 $[t_n,t_n\delta]$ 上的符号与 $\phi(t_n)$ 完全一致$\phi(t_n)\ge2\varepsilon$ 时$\phi(t)\varepsilon0$$\phi(t_n)\le-2\varepsilon$ 时$\phi(t)-\varepsilon0$。也就是说$\phi(t)$ 在这个区间上保持定号。3.3 在积分上制造固定下界既然 $\phi(t)$ 在 $[t_n,t_n\delta]$ 上保持定号且绝对值大于 $\varepsilon$那么这段区间上的积分绝对值有固定下界$$\left|\int_{t_n}^{t_n\delta}\phi(t),dt\right|\int_{t_n}^{t_n\delta}|\phi(t)|,dt\varepsilon\delta.$$这是一个与 $n$ 无关的常数下界。只要 $t_n$ 取得足够大我们可以让这段区间落在正半轴的任意远端。积分收敛的条件马上要在这里产生矛盾。3.4 用柯西收敛准则收网$F(t)\int_0^t\phi(\tau)d\tau$ 在 $t\to\infty$ 时收敛等价于柯西收敛准则对任意 $\eta0$存在 $T_\eta$使得当 $t_2t_1T_\eta$ 时$$\left|\int_{t_1}^{t_2}\phi(\tau)d\tau\right|\eta.$$取 $\eta\varepsilon\delta$。既然 $t_n\to\infty$可以选一个足够大的 $n$使得 $t_nT_\eta$。令 $t_1t_n$$t_2t_n\delta$则这段区间上的积分绝对值必须小于 $\varepsilon\delta$。但第 3.3 步刚证明了它大于 $\varepsilon\delta$。矛盾。所以反设不成立$\phi(t)\to0$。这个证明的逻辑链非常干净一致连续负责把“函数值大”翻译成“某段固定长度区间上积分大”积分收敛负责保证“任意足够晚的固定长度区间上积分必须小”。同一个对象同时既大又小只能说明最初的假设错了。为了便于复习我把整个证明的骨架整理成一张表步骤依据得到什么反设 $\phi(t)\not\to0$极限定义取反存在 $t_n\to\infty$$邻域保幅一致连续性$t\in[t_n,t_n\delta]$ 时 $积分下界定号 幅值下界$\left矛盾积分收敛的柯西条件取足够大的 $t_n$同一个积分必须 $\varepsilon\delta$这个版本用的是反证法和柯西收敛准则不需要分开讨论 $\int_0^\infty\phi$ 是正还是负也不要求 $\phi(t)$ 非负适用面更广我非常推荐在学习和授课时用它。4. 证明里容易“一眼带过”的三个细节这个证明篇幅不长但如果只是把每一步抄下来很容易漏掉几个真正决定成败的细节。我复盘时发现有三个地方几乎每个初学者都会含糊。4.1 一致连续与连续的区别直接决定反例的构造普通连续性只保证在某个固定点附近函数变化小但 $\delta$ 可以随点变化。一致连续性要求存在一个全局统一的 $\delta$不管 $t$ 在哪都适用。以 $\sin(t^2)$ 为例它在每一点都连续但处处震荡的频率不断加快在距离固定点 $\delta$ 的范围内相位差 $2t\delta\delta^2$ 会随 $t$ 增大而无限增大走出相邻的波峰和波谷所以它不是一致连续的。Barbalat 引理要求一致连续正是在这一步排除了这类“连续但高频振荡”的反例。如果证明里只用了连续性而不是一致连续性第 3.2 步就站不住整个证明崩塌。4.2 为什么要留出 $2\varepsilon$ 的余量我前面提到过反设时用的是 $|\phi(t_n)|\ge2\varepsilon$而不是 $|\phi(t_n)|\ge\varepsilon$。这个选择不是写起来好看而是为了让下一步出现严格不等式。如果只取 $|\phi(t_n)|\ge\varepsilon$一致连续给出 $|\phi(t)-\phi(t_n)|\varepsilon$三角不等式只能推出 $|\phi(t)|0$。大于零当然也是下界但后续要构造的是一个与 $\varepsilon$ 和 $\delta$ 有关的固定积分下界 $\varepsilon\delta$而不是虚无缥缈的“某个正数”。取 $2\varepsilon$ 后$\phi(t_n)$ 的幅值扣除最大可能变化量 $\varepsilon$还剩 $\varepsilon$ 的余量所以能干脆地得到 $|\phi(t)|\varepsilon$。这种倍率设计在分析证明里很常见本质上是“给误差留预算”。4.3 用柯西收敛准则而不是直接算积分值另一个容易忽略的点是为什么一定是柯西收敛准则而不是直接说 $\int_0^\infty\phi(t)dt$ 等于某个有限数就完了直接说积分收敛能推出的是完整积分量有限但在反证里我们关心的是“从 $t_n$ 到 $t_n\delta$ 这一小段积分必须小”。积分整体收敛并不直接告诉你每一小段都小——比如 $\int_0^\infty\sin(t^2)dt$ 收敛但函数本身不趋于零这恰恰说明“整体收敛”推不出“尾部任意小段积分小”。真正提供“尾部任意晚段的积分可以任意小”这个性质的是柯西收敛准则。严格讲$\int_0^\infty\phi$ 收敛这一条件本身包含了柯西性所以证明里并没有额外引入假设只是换了一个更方便操作的等价描述。许多初学者在这一步想当然地认为“积分收敛所以被积函数趋于零”等于提前使用结论逻辑上是不成立的。如果看的是非负版本的 Barbalat 引理还有另一种证法直接对 $t_n$ 附近区间上的正积分求和推出总和趋于无穷与积分有限矛盾。但那个版本里区间 $[t_n,t_n\delta]$ 之间可能重叠你需要先抽出一个满足 $t_{n_{k1}}\ge t_{n_k}\delta$ 的子列否则积分求和会重复计数。柯西版本绕开了这个技术细节不需要抽子列这也是我推荐它作为主证法的原因。5. 工程应用自适应控制与参数辨识里的标准套路理论部分讲完现在说说实际怎么用。在控制类论文和工程文档里Barbalat 引理最常见的出场方式不是直接验证原始条件而是通过几个推论。5.1 两个高频推论推论一如果 $\phi(t)$ 可导且导数有界那么 $\phi(t)$ 一致连续。这个结论由中值定理直接得到存在 $\xi$ 位于 $s$ 和 $t$ 之间使得 $|\phi(s)-\phi(t)||\phi(\xi)||s-t|\le M|s-t|$取 $\delta\varepsilon/M$ 即可。应用中判断“$\dot V$ 一致连续”绝大多数情况都不是直接去抠一致连续的定义而是先求 $\ddot V$然后说明 $\ddot V$ 有界再由这个推论补一句“所以 $\dot V$ 一致连续”。推论二如果 $e(t)\in L_2\cap L_\infty$且 $\dot e(t)\in L_\infty$那么 $e(t)\to0$。这个是参数辨识和自适应控制里最常用的版本。它的证明本质就是 Barbalat令 $\phi(t)e^2(t)$由 $\int_0^\infty e^2(t)dt\infty$ 知 $\phi$ 的积分收敛由 $\dot e$ 有界且 $e$ 有界知 $\dot\phi2e\dot e$ 有界于是 $\phi$ 一致连续Barbalat 给出 $e^2\to0$。整个过程只需要检查信号的有界性和平方可积性完全避开了直接判断 $e(t)$ 的极限。5.2 标准应用模板把一本自适应控制教材里反复出现的证明套路抽象出来大概是六步构造 Lyapunov 候选函数 $V\ge0$通常取误差二次型加参数估计误差二次型求导并用参数更新律消去交叉项化简成 $\dot V\le -W(t)\le0$其中 $W(t)$ 是某个误差度量由 $V$ 单调递减且非负断言 $V$ 有界从而状态和参数估计误差有界利用系统方程和信号有界性证明 $\dot W$ 有界或等价地证明 $W$ 一致连续很多时候是求 $\ddot V$ 有界由 $\int_0^\infty W(t)dt\le V(0)\infty$ 加入一致连续性用 Barbalat 推出 $W(t)\to0$如果还有参数收敛的需求再额外加持续激励条件从 $W(t)\to0$ 推参数估计误差趋于零。很多初学者在第四步就卡住了明明 $\dot V\le0$ 已经给出了 $V$ 有界怎么还要证明 $\dot V$ 一致连续因为 $V$ 有界和 $\dot V$ 一致连续是两回事。没有一致连续$\dot V$ 完全可以在某些窄脉冲上保持一个负值而不被积分察觉比如我前面举的梳子函数。第四步本质上是在排除这类病态信号这一步省略了整个证明链就不完整。5.3 一个具体例子梯度法参数估计用一个最简单的一维参数辨识问题展示完整过程。设系统满足回归模型$$y(t)\theta^*\phi(t),$$其中 $\theta^*$ 是未知常数$\phi(t)$ 是已知的回归信号$y(t)$ 是可测输出。取参数估计值 $\hat\theta(t)$定义估计误差$$e(t)\hat\theta(t)\phi(t)-y(t)\tilde\theta(t)\phi(t),$$其中 $\tilde\theta\hat\theta-\theta^*$ 是参数估计误差。采用梯度更新律$$\dot{\hat\theta}-\gamma e(t)\phi(t),\qquad \gamma0.$$取 Lyapunov 函数 $V\frac{1}{2\gamma}\tilde\theta^2$沿轨线求导$$\dot V\frac{1}{\gamma}\tilde\theta\dot{\tilde\theta}\frac{1}{\gamma}\tilde\theta(-\gamma e\phi)-e^2\le0.$$于是 $V$ 单调不减不对单调不增且非负所以 $\tilde\theta$ 有界并且$$\int_0^\infty e^2(t)dtV(0)-V(\infty)\infty.$$这说明 $e(t)\in L_2$。再假设 $\phi(t)$ 和 $\dot\phi(t)$ 有界那么由 $e\tilde\theta\phi$ 知 $e$ 有界即 $e\in L_\infty$对 $e$ 求导$$\dot e\dot{\tilde\theta}\phi\tilde\theta\dot\phi-\gamma e\phi^2\tilde\theta\dot\phi,$$右边各项有界故 $\dot e\in L_\infty$因此 $e(t)$ 一致连续。现在对 $e^2$ 用前面推论二得到 $e(t)\to0$。注意$e(t)\to0$ 并不等于 $\tilde\theta(t)\to0$。由于 $e\tilde\theta\phi$即使 $e\to0$如果 $\phi(t)$ 本身也趋向于零那么 $\tilde\theta$ 可以不为零。要让参数估计真正收敛到真值需要加上持续激励条件存在 $T,\alpha0$ 使得对所有 $t$$$\int_t^{tT}\phi^2(\tau)d\tau\ge\alpha.$$这个条件保证回归信号 $\phi$ 不会“枯竭”$\tilde\theta$ 才有机会通过 $e(t)\tilde\theta(t)\phi(t)\to0$ 被约束到零。这个例子特别能说明 Barbalat 引理的能力边界它擅长证明误差信号收敛但能不能把收敛性“传递”给隐藏的参数取决于系统的激励条件不是引理本身能保证的。6. 边界条件与误用清单这些坑我见过很多人踩Barbalat 引理看起来只有两个条件但实际使用中很多人要么漏掉验证一致连续要么把结论用得过头。我把自己踩过和看别人踩过的坑整理成清单。6.1 误用一由 $\int_0^\infty e^2dt\infty$ 直接推出 $e\to0$这是最常见的一个错误也是初学时最容易犯的。很多人在仿真里看到误差平方积分收敛就直接下结论误差趋于零甚至论文里也只写一句“由于误差平方可积所以误差收敛”。严格说这需要额外的导数有界条件。我在 5.1 节写的推论二就是针对这种情况的标准解法先验证 $e$ 有界、$\dot e$ 有界然后才能由 $e^2\in L_1$ 推出 $e\to0$。实际调试中我习惯先画出 $e(t)$ 的波形如果它呈现高频小幅振荡、肉眼看似收敛但幅度不见底很可能就是缺少一致连续性条件Barbalat 引理用不了。6.2 误用二把“$V$ 单调有界”当成“$\dot V\to0$”这个错误更隐蔽。$V\ge0$$\dot V\le0$确实能推出 $V(t)$ 收敛但 $\dot V(t)\to0$ 需要额外条件。构造一个反例令 $\phi(t)-1$ 在区间 $[n,n\frac{1}{n^2}]$ 上其余时间为 $0$。这个函数不需要 $\phi$ 非负$\int_0^\infty\phi(t)dt-\sum\frac{1}{n^2}-\infty$积分收敛。如果令 $V(t)V(0)\int_0^t\phi(s)ds$那么 $V$ 单调递减且有下界但 $\phi(t)$ 会在某些时刻等于 $-1$并不趋于零。如果用 $\phi(t)$ 代替 $\dot V(t)$你就能看到“$V$ 单调有界且 $\dot V\le0$但 $\dot V$ 不收敛到零”的确凿例子。原因是 $\dot V$ 由一串越来越窄的负脉冲组成每个脉冲的宽度衰减得足够快总面积有限但脉冲高度不变。这正好对应控制系统里的“抖动”能量函数在缓慢下降但瞬时耗散率可以一直保持在一个非零的水平上。所以每次证明收敛性都要老老实实补上一致连续性那一步别觉得“显然”就能省掉。6.3 误用三验证一致连续性时把没有界当成有界在 5.3 的例子里我用到了“$\phi$ 有界且 $\dot\phi$ 有界”这个前提来证明 $\dot e$ 有界。实际应用中回归信号不一定天然有界它可能是系统状态的非线性函数如果状态有界性还没证明就先说 $\dot e$ 有界就是循环论证。正确顺序应该是先用 $V$ 的非增性得到状态有界再借助系统方程得到其他信号的有界性最后再验证一致连续。很多控制论文审稿人抓的就是这个细节。我在给一个系统做自适应仿真时就犯过这个错直接假设参考输入有界结果闭环状态发散回头看问题出在模型线性参数化的前提没满足回归信号里含有状态平方项不能只靠输入有界来兜底。6.4 边界情况这些条件能不能再放宽我遇到过几次“能不能把一致连续换成连续甚至逐点收敛”的疑问。列一个对照表把条件放宽后会发生什么说清楚想用的条件能否推出 $\phi(t)\to0$反例/原因$\phi$ 连续$\int_0^\infty\phi$ 收敛否$\phi(t)\sin(t^2)$$\phi$ 有界$\int_0^\infty\phi$ 收敛否梳子函数有界、积分有限、不收敛$\phi$ 可导且导数有界$\int_0^\infty\phi$ 收敛是导数有界蕴含一致连续$\phi$ 一致连续$\int_0^\infty\phi$ 收敛是Barbalat 原版结论其中“$\phi$ 可导且导数有界”这个条件只是“一致连续”的充分条件并不是必要条件。比如 $\phi(t)\sqrt{t}$ 在 $[0,\infty)$ 上一致连续但导数在 $0$ 附近无界。工程上为了省事通常用导数有界来验证一致连续但心里要清楚验证不了导数有界不代表一致连续不成立只是需要换一种方式去证。6.5 我的几条实战经验最后聊几条我在实际使用中总结的经验。第一优先把结论写成“误差平方”的形式再用 Barbalat。对 $e^2$ 用引理只需要验证 $\dot e$ 有界通常比直接分析 $\dot V$ 简单而且 $e^2\in L_1$ 是标准结果审稿人和读者都熟悉这个套路。第二判断一致连续时先试最省事的路径$\dot V$ 可导则检查 $\ddot V$ 是否有界。如果不能求导两次再退回定义或者找其他性质。很多自适应系统的 $\ddot V$ 表达式虽然长但每一项都有界这个工作量是值得的。第三不要在引理适用条件不满足时硬套。如果系统信号里存在不连续切换比如滑模控制里的 sign 函数$\dot V$ 可能根本不是连续函数Barbalat 引理的正规形式就用不了需要改用推广的版本或者直接对切换面做滑模可达性分析。第四参数估计里“误差收敛”和“参数收敛”是两件事。看到 $e(t)\to0$ 别急着宣布参数辨识成功先检查持续激励条件没有 PE 条件参数可以一直漂移而输出误差仍趋于零。这个问题我在实际项目里碰到过当时回归信号是衰减振荡误差很小但参数估计值和真值差了将近一倍。Barbalat 引理看起来简单但它把“积分收敛”和“逐点收敛”这两个看似接近实则相距遥远的性质用“一致连续”精准地焊接起来。每次用的时候我都会想起当时推完证明的那个晚上原来那一句“由 Barbalat 引理可得”背后藏着这么多需要较真的地方。