特徵多項式的病態性
你在線性代數學過,方陣 A 的特徵值(eigenvalue)就是其特徵多項式 p(lambda) = det(A - lambda I) 的根。於是用數值方法求特徵值,最直接的想法就是:把那個行列式展開成多項式,再求它的根。但這個想法是個陷阱。先組出多項式、再求根,是電腦上計算特徵值最糟糕的做法之一,而理解箇中原因,正是通往所有正規特徵值演算法的門檻。
問題在於:多項式的根對其係數的微小變動可能極度敏感,即使原矩陣的特徵值本身相當溫和也一樣。維爾金森(Wilkinson)著名的例子是根落在 1, 2, 3, ..., 20 的多項式。把 lambda^19 的係數擾動約 2^(-23)(第七位小數的改變),有些根就會移動好幾個單位,甚至分裂成共軛複數對。因此從「矩陣到係數到根」的過程,中間經過一個極度病態(ill-conditioned)的環節:組係數或存係數時的微小捨入誤差,在求根時被災難性地放大。
誠實的結論是:絕對不要靠建立並求解特徵多項式來找特徵值;即使矩陣本身良態(well-conditioned),這條管線在數值上也是不穩定的。實務上每一個特徵值求解器都直接在矩陣上、透過正交變換運作(QR 演算法、冪法、克雷洛夫法)。這個教訓可以推廣:一個精確的數學恆等式(特徵值=多項式的根)可能是個糟糕的計算配方。有趣的是,反方向反而成立:要可靠地求多項式的根,軟體常常會組出它的伴隨矩陣(companion matrix),然後計算那個矩陣的特徵值。
取 A 為 2x2 矩陣,列為 (1, 1000) 與 (0, 1),它的特徵值都是 1。現在把左下角的元素從 0 擾動為極小的 1e-6。特徵多項式變成 lambda^2 - 2 lambda + (1 - 0.001),根為 1 +/- sqrt(0.001) ~= 1.0316 與 0.9684——元素只變了 1e-6,特徵值卻變了約 0.03。那個很大的非對角元素(這是非正規矩陣)讓特徵值變敏感,而再經過係數這條路只會雪上加霜。
矩陣的微小擾動可能讓特徵值大幅移動;再繞道多項式係數只會加劇這種破壞。
這講的是演算法的不穩定,而非特徵值無意義:對稱矩陣的特徵值是完全良態的,但組出它的特徵多項式再求根仍會喪失精度。即使底層問題很好,走多項式這條路依然糟糕。