牛頓法的失效情形(Newton's method failure modes)
牛頓法很快,但快不等於安全。它的二次速度只是一個承諾,僅在單根的小鄰域內、起點合理、函數配合時才成立。一旦走出這些條件,牛頓法可能做出令人不安的事:飛向無窮、永遠在同兩個值之間彈跳,或慢到幾乎停滯。認識這些失效情形,正是玩具實作與穩健實作的分野。
經典的失效都源自步進公式 x_{n+1} = x_n - f(x_n) / f'(x_n)。(1) 糟糕的起始猜測:從錯誤的區域出發,切線把你指向遠離你想要的根——牛頓法可能收斂到「另一個」根,或乾脆發散;通往某個根的起點集合(吸引盆)可以呈現極度碎形的形狀。(2) 接近零的導數:若 f'(x_n) 很小,除以它會產生巨大的步長,遠遠衝過根(平坦處像彈弓)。(3) 循環:對某些函數迭代陷入週期迴圈——標準範例是 f(x) = x^3 - 2x + 2 從 x = 0 起步,永遠在 0 與 1 之間振盪。(4) 過衝與發散:對 f(x) = arctan(x) 從離 0 太遠處起步,每步落得比前一步更遠,迭代值飛散。(5) 重根:在 f' 也消失之處,二次速度崩塌為僅線性(見重根)。
解法同樣經典且值得知道。先夾住根並保留二分法後備,使糟糕的牛頓步被否決並換成安全的一步——這正是 Brent 法與「加保護的牛頓法」的核心。用線搜尋或阻尼(只取完整牛頓步的一部分)以防高維中的過衝。留意 f'(x_n) 接近零並拒絕除以它。教訓不是牛頓法不可靠,而是「純粹、無保護的」牛頓法不可靠——實務上你總是用保護措施把它包起來。
對 f(x) = x^3 - 2x + 2 從 x_0 = 0 用牛頓法,走到 x_1 = 1,再回到 x_2 = 0,再到 1——一個完美的二循環,永遠不靠近 -1.77 附近的真實根。而對 f(x) = arctan(x),從超過約 |x| = 1.39 處起步會使每個迭代值比前一個更大,於是方法發散,而非找到 0 處顯而易見的根。
循環、過衝與發散:純牛頓法需要保護措施。
這些並非罕見的病態——它們會咬上一般函數與一般的起始猜測。切勿交付無保護的牛頓法:保留夾根區間與二分法後備(Brent)、檢查極小的 f'、並對步長加阻尼。