实直线上的拓扑语言
上一章处理级数时,我们不断说“从某一项以后”“尾部落进指定误差范围”。数列里只有指标 n 往后走,这种话还不太容易说乱。下一章讨论函数极限,输入 x 却能从左右两边、用许多方式靠近同一个点;“在 a 附近”到底算什么,不能再靠图像印象蒙混过去。
这一章先不谈函数值,而是给实直线上的集合配一套局部语言:站在一个点上,能不能找到完全留在集合里的小范围?无论把范围缩多小,集合是不是仍会冒出来?集合在哪些位置漏掉了本该贴住的点?邻域、内点、边界、聚点和闭包都在回答这些问题。它们看似是一串新名词,其实都在替“靠近”做同一件事:把它变成可以逐项检查的断言。
本章的世界固定为实直线 R,所有补集也相对于 R 而言。到末尾我们会看到,闭有界集合为什么能把无限多的局部选择压缩成有限个;连续函数在紧集上的全局结论要留到后面再证明。眼下先把集合本身看明白。
先说清楚集合在哪个世界里
设 A,B⊂R。A⊂B 表示 A 的每个元素也属于 B;两个集合相等,要同时验证 A⊂B 和 B⊂A。我们会反复使用
A∪B={x:x∈A 或 x∈B},
A∩B={x:x∈A 且 x∈B},
Ac=R∖A={x∈R:x∈/A}.
补集的参照范围不能省略。在 mathbbR 中,(0,1)c=(−∞,0]∪[1,∞);若我们的世界换成 ,同一集合 的补集便变为 。以后“开”“闭”也总相对于正在讨论的空间,这里先把空间固定住很必要。
还会用到两条对账式:
(A∪B)c=Ac∩Bc,
(A∩B)c=Ac∪Bc.
第一式表示,一个点同时不在 A 和 B 中,才会不在它们的并中;第二式表示,只要漏出二者之一,便会漏出交集。后面从开集转换到闭集时,这两条式子会直接派上用场。
邻域:把“附近”做成能缩放的窗口
取 x0∈R 与 ε>0。以 x0 为中心、半径为 的开球,也叫 的 邻域,定义为
B(x0,ε)={x∈R:∣x−x
这就是数轴上一小段开区间。半径不是固定的:只要它为正,我们就能继续缩小观察范围。若一个集合 N 包含某个 B(x0,ε),也说 N 是 x0 的邻域;计算时最常用的仍是标准开球。
邻域语言把“足够靠近”变成数轴上的开区间。
有时必须把中心点删掉。x0 的删心 ε 邻域是
B∗(x0,ε)={x∈R:0<
这个 0< 不是装饰。它要求我们只看靠近 x0 的其他点,不能让中心点自己充当证据。聚点和函数极限都会靠它排除一种常见偷懒:只检查点值,而不检查点附近。
内点、内部与外点
若存在 ε>0 使得
B(x0,ε)⊂A,
便称 x0 为 A 的内点。也就是说,站在 x0 处能找到一个小窗口,里面没有一个点掉到 A 外。所有内点组成 A 的内部:
int(A)={x∈R:∃ε>0, B(x,ε)⊂A}.
例如 x0∈(4,7) 时,x0−4 与 7 都是正数。取
ε=21min{x0−4,7−x
便有 B(x0,ε)⊂(4,7)。因此开区间中每一点都是内点。反过来,4 不是 (4,7) 的内点:任意半径的邻域都含有小于 的数。
若 x0 是 Ac 的内点,则称 x0 是 A 的外点。外点的全体记作 。它不表示“看上去离集合挺远”,而是要求有一个完整小窗口避开 。
内点的量词是“存在一个半径”;边界和聚点的量词会是“任意半径”。能找到一次安全窗口,就说明局部完全在里面;每次缩小仍会碰到某种现象,才说明那个现象无法避开。
开集与闭集不是日常语的反义词
若 A 的每个点都是内点,即
A=int(A),
就称 A 是开集。把量词摊开:
∀x∈A, ∃ε>0,B(x,ε)⊂A.
开集的意思是,已经收进来的每一点周围都有一点余量。开区间 (a,b) 是开集,整条实线 mathbbR 也是开集。
若 Ac 是开集,就称 A 是闭集。方括号只是在区间情形中常见的表面现象;闭集真正要求的是:每个集合外的点都能找到一个小窗口完全避开集合。
空集 ∅ 与 mathbbR 都既开又闭。空集开,是因为“空集中的每一点都是内点”没有反例;它闭,是因为补集 mathbbR 开。(0,1] 则既不开也不闭:1∈ 却不是内点,所以它不开;,但每个邻域都碰到正数,所以它漏掉了一个贴近位置,因而不闭。
空心端点表示端点不属于集合,实心端点表示端点属于集合。
开并、闭交,以及无限操作会在哪里失手
任意多个开集的并仍是开集。设 {Gλ}λ∈Λ 是一族开集,令
G=λ∈Λ⋃Gλ.
任取 x∈G,它至少落在某个 Gλ0 中。这个集合开,故存在 B(x,ε。每个 都有这样的窗口,所以 开。
取补集并使用前面的对账式,得到配套结论:任意多个闭集的交仍闭。有限次操作还有两条镜像结论:有限个开集的交开,有限个闭集的并闭。这里的“有限”不能偷掉。
例题:无限相交和无限并各少了一点什么
令
Gn=(−n1,n
每个 Gn 都开,但
n=1⋂∞Gn={0}.
因为 0 落在每个 Gn 中;任意 x=0 可取 n>,于是 ,从而 。而单点集 不是开集:任何以 为中心的邻域都含有非零点。无限相交把原本的“余量”一点点挤没了。
再令
Fn=[−1+n1,1−
每个 Fn 闭,而
n=2⋃∞Fn=(−1,1).
若 x∈(−1,1),则 1−∣x∣>0;取 n>1/(1−,有 ,故 。端点 从未属于任何 ,并集因此不闭。
“任意并开、任意交闭”可以直接使用;“任意交开、任意并闭”则不成立。面对无限多个集合时,先问自己:反复取交会不会把空间压成没有余量的点?反复取并会不会逼近一个从未纳入的端点?
集合到底在哪里漏风:聚点、边界与闭包
开性关心的是“已经在集合里的点有没有余量”。闭性关心的是另一种失败:集合外是否存在一个位置,虽然没被收进来,却无论怎样缩小窗口都碰得到集合。要把这件事说准,必须把三个相近的问题拆开。
聚点不让中心点自己作证
点 x0 是 A 的聚点,如果对每个 ε>0,都有
B∗(x0,ε)∩A=∅.
x0 本身可以在 A 中,也可以不在;聚点问的是,删去中心以后,是否还有 A 的点不断逼近。
设
P={n1:n∈N}.
点 0 不属于 P,却是 P 的聚点。给定 ε>0,取 n>1/ε,便有 ,所以 。 正是集合漏掉、但怎样都躲不开的位置。
另一方面,每个 1/n 都不是 P 的聚点。对 n≥2,取
rn=3n(n+1)1.
它小于 1/n 与相邻项 1/(n+1) 的距离,也小于与 1/(n−1) 的距离;故 B(1/n,r 没有别的 中点。 的情形取半径 即可。
若 x0∈A 且存在 ε>0 满足
B(x0,ε)∩A={x0},
则 x0 是 A 的孤立点。孤立点和聚点不是简单反义词:前者是集合中的一个点,且附近没有同伴;后者可能根本不属于集合。P 中每个 1/n 是孤立点,0 是聚点,正好把差别摊开了。
边界点同时看得见里面和外面
点 x0 是 A 的边界点,如果每个 ε>0 都满足
B(x0,ε)∩A=∅且B(x
边界点的窗口里永远有集合内和集合外两类点。它不要求中心点属于集合。(0,1) 的 0,1 是边界点;[0,1] 的 0,1 也是边界点。端点是否被收进来会改变开闭性,却不会让它离开内外交界处。
同一个点可以有多个身份,例如闭区间端点既是边界点,也是聚点。
闭包把所有贴住的位置收进来
集合 A 的闭包记为 A。最稳妥的判别是
x∈A⟺∀ε>0, B(x,ε)∩A
这里不删中心点,所以 A 的每个点自动在闭包里;若 x∈/A,上式恰好说明 x 是 A 的聚点。因此在实直线上
A=A∪{A 的所有聚点}.
还有两条高频计算式:
A=A∪∂A,
∂A=A∖int(A)=A∩
后一条正好说出边界为什么同时贴着内外。每一个实数恰好属于三类之一:A 的内点、边界点或外点;没有第四种无法归类的位置。
闭包把集合可能“贴近但漏掉”的位置补上。
例题:区间、孤立点和外部一起算
设
A=(−2,1)∪{3}.
不要把 3 当成“太小可以忽略的例外”。
(−2,1) 中每一点都可留出到两个端点的正距离,因此是内点;3 的任意邻域都含有不属于 A 的点,所以不是内点。故 int(A)。
这道题带出一个实用判断:集合不闭,未必只是“漏了端点”;它漏的是某个集合外的点,而这个点的每个小窗口都碰到集合。端点、被挖掉的点、数列的极限位置是最常见的漏法。
闭集的真正判别:别漏掉极限位置
闭集可以从补集的开性定义,也可以用聚点判别:
A 是闭集⟺A 包含它的每一个聚点.
若 A 闭,Ac 开。任取 x∈Ac,开性给出完全包含在 Ac 的邻域,所以 不可能是 的聚点;所有聚点只能在 中。反过来,若 已含有全部聚点,任取 ,它不是聚点,故有一个删心邻域不碰 。中心 也不在 ,把它放回去后,整个邻域仍不碰 。于是每个补集点都是内点, 开, 闭。
别据此误会“闭集一定有聚点”。有限集合没有聚点,却是闭集。例如 {2,5} 的补集在每个不属于这两点的位置都能留出一个小窗口;它没有漏掉任何会被自身其他点逼近的位置。
例题:被挖掉的点比端点更能说明问题
令
C=(0,2)∖{1}=(0,1)∪(1,2).
1 不是端点,却是最显眼的“漏风处”。它的每个邻域都含 1 左右的 C 中点,也含中心点 1∈/C。因此
int(C)=C,
C=[0,2],
∂C={0,1,2}.
C 是开集,因为它是两个开区间的并;却不是闭集,因为 0,1,2 都是它漏掉的聚点。洞在图像上再小,邻域语言都不会把它抹掉。
稠密不等于铺满,更不等于没有边界
有理数集 Q 是最能反驳图像直觉的例子。任意非退化开区间中既有有理数,也有无理数。因此对每个实数 x 的任意邻域,都同时能碰到 Q 与 Qc,从而
int(Q)=∅,
Q=R,
∂Q=R.
Q 在每个区间里都有点,称为在实线中稠密;但它从不含完整的小区间,所以没有内点。稠密只说“哪里都能碰到”,不说“哪里都铺满”。这也解释了,有理数的稠密性不能填补 2 的缺口,更不能让 Q 变成闭集。
用邻域检查集合:一套可复用的顺序
求内部、闭包、边界与开闭性时,最容易犯的错是先凭端点符号猜答案,再补理由。更稳的顺序如下。
先找内部。对集合中的一般点,写出它到最近限制位置的距离,取严格更小的正半径。端点、挖掉的位置和孤立点需要单独检查。
再找闭包。问“这个点的每个邻域是否都碰到原集合”。集合中的点自动在闭包中;集合外候选通常来自端点、洞、数列的极限位置,或稠密集合附近的所有点。
通过 ∂A= 得到边界,并任选一个边界候选回到邻域定义复查,确认窗口确实同时碰到内外两侧。
例题:两列点从两边挤向同一个缺口
考虑
E={2+n+1(−1)n:n∈N
偶数项为 2+1/(2k+1),从右侧趋向 2;奇数项为 2−1/(2k),从左侧趋向 2。所以 是 的聚点。每个列出的点却是孤立点:它和相邻的点有正距离,取小于最近距离一半的半径即可避开其他点。因此
int(E)=∅,
E=E∪{2},
∂E=E∪{2}.
这里 E 的每一点都是边界点,因为它本身在每个邻域中,而同一邻域也一定含有不属于 E 的实数。E 不闭的唯一原因是 2 还在门外;添上 2 后,新的集合就闭了。
开覆盖:局部窗口怎样覆盖整个集合
此前我们给一个点找邻域。紧性反问:如果别人给了大量开窗口,已经盖住整个集合,能否只挑有限个窗口仍盖住它?
一族开集 U 是 K⊂R 的开覆盖,如果
K⊂U∈U⋃U.
若能从 U 选出有限多个成员 U1,…,Um,使得
K⊂U1∪⋯∪Um,
就称它们为有限子覆盖。有限子覆盖中的窗口必须来自原来的那一族,不能临时另造一个大区间把问题盖掉。
紧性把“已经被开集覆盖”转化为“有限个开集就够了”。
集合 K⊂R 称为紧集,若它的每一个开覆盖都有有限子覆盖。在实直线上,这个抽象定义有一个可以直接检查的版本:
K 紧⟺K 闭且有界.
这就是实直线上的 Heine--Borel 定理。它同时排除两种故障:有界阻止集合逃向无穷远,闭阻止集合在有限位置无限逼近却永远少一个点。少掉任何一项,都可能有开覆盖无法缩成有限份。
例题:为什么 (0,1) 的覆盖不能收尾
对每个 n∈N,令
Un=(n1,2).
这族开集覆盖 (0,1)。给定 x∈(0,1),取 n>1/x,便有 1/n<,即 。
但从中任取有限多个,设所选下标最大为 N,这些区间的并就是 UN=(1/N,2)。点 1/(2N) 属于 ,却不在这个有限并中。因此该开覆盖没有有限子覆盖。
问题不在窗口不够大,而在它们只能一轮轮靠近 0,却从未把 0 附近所有正数一次性盖住。(0,1) 有界却不闭,漏掉的端点正好给了这个反例可乘之机。
若集合闭但无界,另一种故障出现。{(−n,n):n∈N} 覆盖 mathbbR,任取有限多个区间的并却仍有界,盖不住全实线。闭与有界必须同时出现。
在实直线上,判断一个集合紧不紧,通常不必直接和任意开覆盖搏斗:检查它是否闭、是否有界即可。不过这条等价属于实直线;以后换到更一般的空间,仍要回到开覆盖定义本身。
Heine-Borel 定理把抽象的有限子覆盖性质,变成实直线上可检查的闭且有界。
有界无限集合不能一直散开:Bolzano--Weierstrass 定理
Heine--Borel 定理有一条特别适合数列的后果:
每个有界无限的实数集合至少有一个聚点。
这就是 Bolzano--Weierstrass 定理的集合表述。它并不是“有界集合一定收敛”——集合没有顺序,谈不上整体收敛;它说的是,无限多个点若被困在一个有限区间内,就不可能彼此永久保持固定距离,总会在某处越挤越紧。
证明的想法正好显示紧性的作用。若有界集合 S 没有聚点,每个 x∈S 都能找到一个只含 x、不含其他 S 中点的开邻域。没有聚点还说明 S 已经包含全部聚点,所以它闭;加上有界,S 紧。由紧性,这些“每个点一扇门”的邻域可缩成有限子覆盖。每扇门只含一个 中点,于是 只能有限,矛盾。
对数列而言,常用版本是
每个有界实数数列都含有收敛子列。
若数列只取有限多个值,至少有一个值出现无限次,从那些下标中抽出常值子列即可。若它取到无限多个值,值域是有界无限集,定理给出聚点 p;从越来越小的邻域中依次选取下标越来越大的项,就能得到趋向 p 的子列。
这和“原数列收敛”差得很远。an=(−1)n 有界,却在 −1 与 1 之间来回跳,原数列不收敛;偶数项子列恒为 1,奇数项子列恒为 。定理承诺的是至少有一条稳定分支,不是整条数列会自动安静下来。
练习:把窗口判断落实到计算
练习 1
设
A=[−1,2).
求 int(A)、A 和 ∂A,并判断 A 是否开、是否闭。
区间内部的点可留出到两端的正距离;−1 虽属于 A,但每个邻域都含有小于 −1 的数。因此
int(A)=(−1,2).闭包须补进任意邻域都会碰到 A 的点 ,故
练习 2
设
B=(0,3)∖{2}.
找出它的内部、闭包和边界。它是开集、闭集,还是二者都不是?
因为 B=(0,2)∪(2,3),它是两个开区间的并,所以
int(B)=B.点 的每个邻域都碰到 ,而没有其他新点需要补进,因此
练习 3
在实线中讨论有理数集 Q。证明它既不开也不闭,并求它的内部、闭包和边界。
任意非退化开区间都含有有理数和无理数。于是对任意 x∈R 和任意 ε>0,B(x,ε) 都与 Q 及 相交。因此
练习 4
证明下面开集族覆盖 (0,1),却没有有限子覆盖:
U={(n1,2):n∈N}.
并说明这个例子具体缺少 Heine--Borel 条件中的哪一项。
对 x∈(0,1),选自然数 n>1/x,则 1/n<x<2,因此 ,覆盖成立。
练习 5
设
an=(−1)n+n1.
找出两个不同的收敛子列及其极限,并解释这与 Bolzano--Weierstrass 定理一致,却不说明原数列收敛。
偶数下标给出
a2k=1+2k1⟶1,奇数下标给出
从集合的“附近”走向函数的“趋近”
这一章把容易混在一起的话拆开了:内点问能否找到完全在里面的窗口;边界点问每个窗口是否同时看见内外;聚点问删掉中心后集合是否还会逼近这里;闭包收集一切无法避开的贴近位置。闭集不漏自己的聚点,有界集合不向无穷远逃走,二者合起来才让开覆盖可以有限化。
下一章的函数极限会把同一套窗口搬到定义域上。写
0<∣x−a∣<δ
时,左侧正要求 x 落进 a 的删心邻域;它排除了用 f(a) 冒充附近函数值的做法。更重要的是,若 a 根本不是定义域的聚点,删心邻域可能没有任何可检验的输入,极限定义就会变得空洞。现在建立的拓扑语言,正是 ε--δ 定义所站的地基。