§20-1  連續的定義

「輸入變一點點、輸出也只變一點點」這句話要怎麼寫成定義?如果把它讀成「把鄰近的點送到鄰近的點」,哪裡會出錯?而定義域本身的形狀,會不會改變一個點連不連續?

在一個點上連續

洗澡的時候把水龍頭往回轉一格,水溫跟著降一點;再轉一格,再降一點。可是牆上的電燈開關不是這樣——手指推過某個位置的前後,房間從全暗變成全亮,中間沒有任何過渡。

兩種裝置的差別聽起來很清楚,可是「跟著變一點」這句話還不能拿來驗算:多少算一點?誰先決定?如果由我們自己說了算,那把標準放寬到房間亮不亮都算「差一點」,電燈開關也能矇混過關。

可行的辦法是把主導權讓給提出要求的那一方:先讓對方指定輸出可以容忍的範圍,我們再回頭指定輸入要限制在多小的範圍內。每一次都答得出來,才算數。水龍頭答得出來——對方要求水溫誤差不超過半度,我們就說旋鈕轉動不超過某個角度;電燈開關答不出來——只要對方要求亮度誤差小於半個房間,無論把手指的活動範圍縮得多小,只要跨過那個位置就整個垮掉。

U V a f(a) f 後找 先給

這張圖在說定義的次序:紅色那一圈是對方開出的要求,藍色那一圈是我們的回應。回應必須讓 U 裡(且在定義域內)的每一個點都被送進 V。次序不能顛倒——先挑好 U 再看 V 夠不夠大,等於自己出題自己答。

20.1  DEFINITION
Let f have domain D(f) ⊆ ℝᵖ and values in ℝ^q, and let a ∈ D(f).
f is continuous at a in case for every neighborhood V of f(a) there is a neighborhood U of a, depending on V, such that f(x) ∈ V whenever x ∈ U ∩ D(f).
If A ⊆ D(f) and f is continuous at every point of A, then f is continuous on A.
對方交出 f(a) 的一個 neighborhood V,我們得交出 a 的一個 neighborhood U,使得 U 裡凡是屬於定義域的點,函數值都落在 V 內。U 可以(也通常必須)跟著 V 換。連續是一個點上的性質;說「在 A 上連續」只是把這件事在 A 的每一點各驗一次。
正例:f(x) = x 在 a = 2 連續——對方給 V = (1.9, 2.1),我們就交出同一個區間當 U,裡面每個點的值就是自己,當然落在 V 內。反例:f(x) = 0(x ≤ 0)、f(x) = 1(x > 0)在 a = 0 不連續——對方給 V = (−0.5, 0.5),而任何含 0 的 U 都撈得到正數,那裡的值是 1,跳出 V 外。

定義裡有兩處容易讀漏,先各講一句。第一,U 寫成「跟著 V 走」,意思是每換一個 V 就重新找一次 U;能不能找到才是重點,找到的是哪一個並不重要。第二,條件只檢查 U ∩ D(f)——定義域以外的點一概不看。這一條在定義域有缺口時會直接改變答案,例 2 就是現場。

「把鄰近的點送到鄰近的點」這個說法要小心:它容易被讀成「U 的像也是 f(a) 的一個 neighborhood」,而這是錯的。看 f(x) = |x| 在 a = 0:它在這一點確實連續(對方要求誤差小於 ε,我們回答 U = (−ε, ε) 即可),可是 U 的像是 [0, ε),缺了負的那一半,§9-3 的 9.7 說 neighborhood 得藏著一個含該點的 open set,而 [0, ε) 裡任何含 0 的 open set 都會探到負數去。定義管的是像被 V 裝得下,不是像撐得滿 V。
例 1常數函數
有沒有哪個函數,一個 U 就可以應付所有的 V?
  1. 令 D(f) = ℝ,並且對每個 x 都定義 f(x) = c。取任意一點 a,則 f(a) = c。
  2. 對方交出 f(a) = c 的任意一個 neighborhood V。依定義 V 已經含著 c。
  3. 我們回答 U = ℝ。這時 U ∩ D(f) = ℝ,而其中每一點的函數值都是 c ∈ V。驗證通過,而且完全沒有用到 V 長什麼樣。
常數函數在每一點連續,而且 U 完全不必跟著 V 調整——因為輸出根本不動,誤差恆為零。這個省力並不是常數函數的專利:只要函數在 a 附近的定義域上取值都相同,同一招就管用,接下來的例 2 正是這種情形。
f(x) = c V 整條線都在紅色帶內

這張圖在說例 1 為什麼一步就過關:紅色虛線之間是對方要求的範圍 V,而藍線整條都躺在裡面。水平方向要取多寬都行,這正是「U 可以取整個空間」的畫面。

例 2定義域說了算
函數在某點附近「跳一階」,一定就不連續嗎?
  1. 令 g 的定義域是 (0, 1] ∪ (2, 3],並定義
    g(x) = 1(0 < x ≤ 1)、g(x) = 2(2 < x ≤ 3)。
  2. 取 a = 1。這一點的兩側看起來一邊是 1、一邊是 2,像是要跳。可是把 U = (0.5, 1.5) 交出去之後,U ∩ D(g) = (0.5, 1]——區間 (1, 1.5) 整段不在定義域裡,一個點都撈不到。
  3. 於是 U ∩ D(g) 上的值全是 1 = g(1),不管對方的 V 多小都落在裡面。g 在 1 連續。同樣地取 a = 3、U = (2.5, 3.5),交集是 (2.5, 3],值全是 2。
  4. 那個「跳」發生在 x = 2 附近——可是 2 ∉ D(g),而連續是某一點上的性質,沒有這個點就沒有這個問題。g 在它定義域的每一點都連續。
同一張圖,換一個定義域,答案就換。判斷連續之前先問「這個點屬於定義域嗎」「它附近的定義域長什麼樣」——定義裡的 U ∩ D(f) 三個字元,管的就是這件事。
01 23 g = 1 g = 2 這段不在定義域裡

這張圖在說例 2 為什麼沒有跳躍可言:兩段之間隔著一整段紅色的空白,那裡沒有任何定義域的點。站在 x = 1 往右看,看得到的下一個定義域的點在 2 之後——距離至少 1,把 U 的半徑取得比它小就完全碰不到。

同一句話,用反像講一次

20.1 說的是「U 裡屬於定義域的點都被送進 V」。這句話還可以換一種講法:把送進 V 的點全部收集起來,看看這個集合的形狀。§2-3 的 2.12 早就給了這個集合一個名字:反像

f⁻¹(V) = {x ∈ D(f) : f(x) ∈ V}。

注意反像天生就住在定義域裡。20.1 的條件正是 U ∩ D(f) ⊆ f⁻¹(V)——一個包含關係。下面這條定理說,只要肯把 U 換一個,包含關係可以升級成等號。

20.4  THEOREM
Continuity of f at a point a ∈ D(f) amounts to this: to each neighborhood V of f(a) there corresponds a neighborhood V₁ of a for which
  V₁ ∩ D(f) = f⁻¹(V).
連續等於說:每一個對輸出的要求 V,都可以被 a 附近的一個 neighborhood 恰好切出來。與 20.1 的差別只在把包含改成等號,而這一步不必付任何代價。
正例:f(x) = x 在 a = 2、V = (1.9, 2.1) 時,f⁻¹(V) = (1.9, 2.1),取 V₁ = (1.9, 2.1) 就得到等號。反例:把等號換成「V₁ ∩ D(f) ⊇ f⁻¹(V)」條件會失效——取 V₁ = ℝ 對任何函數都成立,包括在該點不連續的那些。等號裡真正有內容的是 ⊆ 那一半。
PROOF

兩個方向分開走。逆向(有這樣的 V₁ 就連續)幾乎是照抄定義;正向(連續就找得到 V₁)要動一點手腳,因為 20.1 交出的 U 一般切不出等號。

證明計畫 · 由所求想起
逆向:所求是 20.1 要的那個 neighborhood,而 V₁ 本身就合格,直接取它。
正向:所求是把 20.1 給的包含關係補成等號。缺的那一半是「反像裡有些點可能落在 U 外面」,那就把反像整個併進來——聯集只會讓集合變大,而變大不會弄丟 neighborhood 的資格。

Proof.  Suppose first that such a V₁ exists for the given V. Take U = V₁. If x ∈ U ∩ D(f), then x ∈ f⁻¹(V) by the stated equation, so f(x) ∈ V. Since V was arbitrary, f is continuous at a.
這一步的所求:從等式讀出 20.1 要的那句話。等式的左邊恰好就是 20.1 要檢查的那個集合 U ∩ D(f),右邊 f⁻¹(V) 依 2.12 的定義就是「函數值落在 V 裡的那些點」。所以等號一旦成立,「U 裡屬於定義域的點都被送進 V」是自動的——這個方向不需要任何構造。
Conversely, suppose f is continuous at a and let V be a neighborhood of f(a). By 20.1 there is a neighborhood U of a with f(x) ∈ V for all x ∈ U ∩ D(f); that is, U ∩ D(f) ⊆ f⁻¹(V). Put V₁ = U ∪ f⁻¹(V).
這一步的所求:一個切得出等號的 neighborhood。先看 20.1 給的 U 差在哪:它保證 U ∩ D(f) 全落在反像裡,但反像可能還有別的點,那些點離 a 也許很遠。既然缺的就是它們,把 f⁻¹(V) 整個併上去即可。拿例 1 的常數函數對照:那裡 f⁻¹(V) = ℝ,而 U = ℝ,聯集還是 ℝ,等式兩邊都是 ℝ。
Then V₁ contains U, hence is a neighborhood of a. Moreover
  V₁ ∩ D(f) = (U ∩ D(f)) ∪ f⁻¹(V) = f⁻¹(V),
because f⁻¹(V) ⊆ D(f) and U ∩ D(f) ⊆ f⁻¹(V).
這一步的所求:驗收剛造出來的集合。兩件事要查。第一,V₁ 還是不是 a 的 neighborhood——9.7 只要求它藏著一個含 a 的 open set,而 U 本來就藏著一個,聯集只會把它保留下來。第二,交集算對了沒有:分配律把 V₁ ∩ D(f) 拆成兩塊,第二塊因為反像本來就在定義域內而原封不動,第一塊由前一步已經被第二塊裝著,於是聯集就是 f⁻¹(V)。
連續可以整句翻譯成集合的等式:輸出端的每一個要求,都在輸入端被一個 neighborhood 恰好切出來。∎
a U f ⁻¹(V) D(f) 聯集之後右邊那截也算進來

這張圖在說正向那一步補的是什麼:藍框是 20.1 交出的 U,紅框是反像。U 在定義域內的部分整個躺在紅框裡(這是連續給的),可是紅框往右還伸出一截,那一截 U 沒收進來,等號因此不成立。把紅框整個併進藍框就補平了,而 a 周圍那一小塊原封不動,neighborhood 的資格不受影響。

—— 第一階段到此結束 ——

本篇把「輸入變一點、輸出也只變一點」寫成了可以驗證的定義(20.1):先給 V、再找 U,而且只檢查定義域內的點。兩個例子分別示範了最省力的情形(常數函數)與最容易誤判的情形(定義域有缺口)。20.4 把同一句話翻譯成集合的等式。下一篇 §20-2 換掉鄰域這件外套,改用可以直接動手算的 ε 與 δ,以及數列。先起來走幾步、喝口水再回來。