案發現場:除以零
在上一篇你學會了用分離變數來解一個可分離方程:把 dy/dx = f(x) g(y) 裡所有的 y 移到一邊、所有的 x 移到另一邊,再各自積分。而第一個動作,就是把兩邊同除以 g(y)。這個除法看似無害,卻暗藏一個假設——g(y) 不為零。只要 g(y) 真的等於零,你就剛好除了一個零,方法便會默默略過那些數值,從頭到尾都沒把它們記錄下來。
看看這個友善的例子 dy/dx = y。這裡 g(y) = y,所以被禁止的值是 y = 0。除以 y 得到 (1/y) dy = dx,積分後得 ln|y| = x + C,再化為 y = A e^x。這一族看起來很完整——但請注意它永遠生不出 y = 0,因為 A e^x 要等於零,只有 A = 0,而 A = e^C 嚴格為正(指數化出來的常數不可能是零)。然而把 y = 0 直接代回原方程:dy/dx = 0 且 y = 0,所以 0 = 0,完全成立。常函數 y = 0 是一個如假包換的解,卻被我們漂亮的公式丟進了垃圾桶。
丟掉的,是那些水平線
精彩之處在此:遺失的值並不是什麼奇形怪狀的曲線。當 g(y0) = 0 時,常函數 y(x) = y0 會讓左邊 dy/dx = 0、右邊 f(x) g(y0) = 0——兩邊皆為零,對每一個 x 都成立。所以 y = y0 是一條永遠靜止的水平解。這正是你先前見過的平衡解:在這些高度上,斜率場一片平坦,解一旦落在那裡就再也不動。分離變數的本質,使它只能找到那些會動的解——也就是 y 真的在變化的解——於是靜止不動的那些便溜走了。
從幾何上看,畫面相當鮮明。這些水平線把斜率場切成一條條橫向的長條,而公式生出的曲線就住在這些長條之內,緊貼著邊界卻永不跨越。邊界線本身——也就是那些平衡解——同樣是解,卻屬於另一個範疇。這正是除以 g(y) 會把它們抹掉的原因:你無法用一套專為追蹤「變化斜率」而設的方法,沿著一條斜率為零的線滑動。
dy/dx = y (1 - y) [the logistic equation]
g(y) = y(1 - y) = 0 -> y = 0 and y = 1
y = 1 ___________________ <- equilibrium (lost)
\ moving solutions live here
\_/\___ curves climb from 0 toward 1
y = 0 ___________________ <- equilibrium (lost)有時這種遺失真的會出問題
你或許會聳聳肩:誰會在乎一條水平線?確實,它常常是無害的——若你的初始條件讓你嚴格落在某條長條的內部,你就會一直待在裡面,遺失的平衡解完全不影響答案。但有時候,那條丟掉的線才是整個故事的關鍵。看看模擬族群的邏輯斯方程 dy/dx = y(1 - y)。若你草率地把通解寫成 y = 1/(1 + A e^(-x)) 而忘了 y = 0,你就丟掉了一個再真實不過的問題的答案:一個從零開始的族群會永遠停在零。滅絕本身就是一個平衡解,而你的公式看不見它。
這裡還藏著一個更深的警訊。遺失的常數解,與唯一性的失效密切相關。那個惡名昭彰的例子 y' = y^(2/3)、y(0) = 0,同時擁有平衡解 y = 0 和會動的解 y = (x/3)^3,兩者都穿過同一個起點——同一個初始條件竟生出兩個不同的解。你本來會丟掉的那條水平線,正是這場競爭中的其中一個答案。把它扔了,你可能永遠不會察覺:這個問題根本沒有一個唯一、定義良好的解。這比圖上少畫一個刻度,要嚴重得多。
遺失解就是奇解嗎?
這裡值得講清楚,因為有兩個概念在此擦身而過。你藉由檢查 g(y) = 0 而找回的常數解,多半其實是通解一族喬裝後的成員——往往是你公式中 A -> 無窮 或 A = 0 的極限情形,只是任何有限常數都觸及不到它。但還有一種更罕見、更怪異的東西:真正的奇解,它對任意常數的任何取值都不包含在通解之中,連極限都不行。這類解常以一條包絡線的姿態出現——整族曲線都緊貼著它,它卻不屬於那一族。
不論是哪一種,實務上的結論都一樣:永遠要親手檢查 g(y) = 0 的那些值。無論這條水平線最後是這一族的隱藏極限,還是一個真正獨立的奇解,你都只能靠把它代回原方程才能發現它——而這正是你一路培養至今的代入驗證習慣。公式只告訴你它算得出什麼;代入才告訴你真相。
修正之道:三拍的習慣
一旦成了反射動作,這帖藥幾乎不花你任何力氣。在你動手除以任何東西之前,先停一下、把危險點讀出來;照常積分;然後再繞回頭審查一遍。這樣做,分離變數便什麼也不會遺失——你只是親手把代數運算不得不跳過的那些解補回來而已。以下就是這個習慣,一拍一拍地走。
- 在除以 g(y) 之前,先解 g(y) = 0。每一個根 y0 都給出一個常數候選 y = y0——把它們寫下來,作為「可能被遺失的平衡解」清單。
- 接著放心地除以 g(y)、照常積分,得到那些會動的解一族(帶著任意常數的通解)。
- 逐一檢查每個常數候選:對某個常數取值(也許是極限),y = y0 是否已被那一族生出?若是,它已被涵蓋;若否,它就是一個你必須明確補回去的獨立解。
- 最後,若有初始條件,判斷究竟哪一條解真正穿過它——並留意是否有不只一條解通過的情形,那正是非唯一性的警訊。