當普通規則不夠用時
你到目前為止算過的每一個定積分,都生活在一個整整齊齊的有限區間 [a, b] 上,而且函數在整段路程中都保持有限。於是微積分基本定理把答案以 F(b) - F(a) 的形式交給你。但有兩件事能打破這份整齊。區間可以伸到無窮遠——integral from 1 to infinity of something。或者函數可以在區間內部某處衝向無窮——比如 1/sqrt(x) 恰好在 x = 0 處。無論哪種情形,F(b) - F(a) 這個符號都不再真的說得通,因為根本沒有一個誠實的端點可以代進去。
帶有上述任一特徵的積分,叫做[[improper-integral|反常積分]](也叫廣義積分)。「反常」不是貶義——它只是提醒你:之前學的那個定義在這裡不能直接套用。於是我們使出微積分裡屢試不爽的那一招:用一個[[limit-at-infinity|極限]]悄悄逼近這個問題。
定義:先積到一堵牆,再把牆推開
把這個技巧說精確。要從 1 一直積到無窮遠,你並不能神奇地抵達無窮。你的做法是:先積到一堵可移動的牆 x = b——這是一個普通的、性質良好的定積分,你早就會算了。然後你問:當你把牆 b 一路滑向無窮遠時,那個數會怎樣。如果那個數安定到一個單獨的有限值 L,我們就說這個反常積分收斂到 L。如果它無止境地增長或者永遠安定不下來,我們就說它發散。
integral from a to infinity of f(x) dx = lim b->infinity ( integral from a to b of f(x) dx ) converges -> the limit is a finite number L diverges -> the limit is infinite, or does not exist
函數無界的那種情形做法完全一樣,只是從另一側靠近。如果 f 在 x = a 處爆掉,你就把牆起在離麻煩點稍微遠一點的地方——從 a + t 積到 b——然後讓 t -> 0,慢慢爬向那個壞點。哲學相同:永遠不要直接碰那個危險位置;通過極限去逼近它,看面積是否保持有限。
震撼時刻:1/x^2 收斂,1/x 發散
現在到了真正令人驚訝的部分。想象 x = 1 右邊的兩條曲線 y = 1/x 和 y = 1/x^2。兩者都永遠向零下降;兩者都圈住一條無限長的細面積。你的直覺大概會說:一個無限長的區域一定裝著無限的面積。你的直覺對了一半。這兩個積分的表現截然不同——而唯一能弄清楚的辦法,就是取極限。
- 收斂的情形:integral from 1 to b of 1/x^2 dx = [-1/x] from 1 to b = -1/b + 1 = 1 - 1/b。當 b -> infinity 時,1/b 這一項消失,所以極限是 1。1/x^2 下方一直到無窮遠的總面積恰好是 1——有限的!它收斂。
- 發散的情形:integral from 1 to b of 1/x dx = [ln x] from 1 to b = ln(b) - ln(1) = ln(b)。當 b -> infinity 時,ln(b) 永遠在往上爬——爬得慢,但沒有任何天花板。極限是無窮,所以 1/x 下方的面積無界。它發散。
於是兩條看起來幾乎一模一樣的曲線——都在向零消失——卻走向了相反的命運。決定勝負的因素是函數收縮得有*多快*。1/x^2 衰減得足夠快,它的尾部面積加起來是一個有限的總和;1/x 向零爬得就慢了那麼一絲絲,它無盡的尾巴便無限制地累積。收斂與發散的全部戲劇性,都活在那道刀刃般的分界上。
通往「把無窮多個東西加起來」的橋
再看一眼剛剛發生了什麼。你把*無窮*多的東西加了起來——面積一直伸展到永遠——並問:這個累計的總和會不會逼近一個有限的數。這恰恰就是下一條學習線在等著你的問題。把曲線下方那片光滑的面積換成一串一個接一個相加的離散數字,你就得到了一個[[infinite-series|無窮級數]]:像 1 + 1/4 + 1/9 + 1/16 + ... 這樣永不終止的和。
其中的邏輯可以原封不動地搬過去。一個級數當它的部分和(先是 1,然後 1 + 1/4,再是 1 + 1/4 + 1/9,……)逼近一個有限極限時收斂,否則發散——用的是完全相同的「收斂/發散」措辭,完全相同的極限思想。甚至有一條定理(積分判別法)用 1/x^2 的反常積分來證明和 1 + 1/4 + 1/9 + ... 收斂,又用 integral 1/x 的發散來證明那個著名的調和級數 1 + 1/2 + 1/3 + ... 發散。這兩個故事其實是同一個故事。
import math
# integrate 1/x^2 up to a moving wall b, watch it settle toward 1
for b in [10, 100, 10000, 10**8]:
print(b, 1 - 1/b) # -> 0.9, 0.99, 0.9999, ~1.0 (converges to 1)
# integrate 1/x up to the same walls, watch it climb forever
for b in [10, 100, 10000, 10**8]:
print(b, math.log(b)) # -> 2.3, 4.6, 9.2, 18.4 ... (no ceiling -> diverges)