重根(multiple root)
大多數根乾淨地穿越軸:曲線從上方下來,通過零,繼續到下方——這是單根。重根不同:曲線觸碰零後轉回而不穿越,或在通過時變平,貼著軸逗留。代數上,因式 (x - r) 在 r 附近出現不只一次,而這種「逗留」使根既更難偵測,也更難準確計算。
形式上,r 是重數 m 的根,若 f(r) = 0,且導數 f'(r)、f''(r)、...,一直到第 (m-1) 階全都消失,而第 m 階不為零。對多項式這就是 (x - r)^m 因式:x^2 = 0 在 0 處有雙重根(m = 2);(x - 1)^3 有三重根。對求根的後果是真實的。第一,偶重根處的變號夾根「失效」,因為 f 不變號——二分法與 regula falsi 根本無法起步。第二,更陰險的是,牛頓法在重根處「失去」它的二次速度:因為 f' 在那裡也消失,誤差遞迴變成 e_{n+1} 約等於 ((m - 1)/m) * e_n,僅為「線性」,且重數越高、減速越嚴重。
還有一個無法逃脫的精度天花板:重根本質上「病態」。雙重根附近 f 幾乎平坦,所以 f 中大小為 epsilon 的浮點雜訊,對應到 x 中約 sqrt(epsilon) 大小的不確定——對雙精度而言,你只能信任約「一半」的位數(大約 8 位而非 16 位)。補救之道是找出重數 m 並用修正的牛頓步 x_{n+1} = x_n - m * f(x_n)/f'(x_n)(恢復二次階),或對降階函數 f/f'(其根全為單根)施以牛頓法,或經由伴隨矩陣特徵值計算多項式的根,後者更從容地處理叢聚的根。
對 f(x) = (x - 1)^2(在 1 處雙重根)從 x_0 = 2 用牛頓法,得 1.5、1.25、1.125、1.0625、...——誤差每步只減半(線性),而非平方,因為 f'(1) = 0 也是。修正步 x_{n+1} = x_n - 2*f/f' 恢復位數加倍的行為。同時二分法甚至無法夾住這個根:f 始終非負,從不變號。
在重根處牛頓法減速為線性,精度被封在約半精度。
重根是病態的:即使是完美的演算法也只給出約一半的通常位數(sqrt(機器 epsilon))。而偶重根根本無法用變號夾住,所以不用導數的夾根法會完全錯過它。