求根與非線性方程

伴隨矩陣求根(companion-matrix root-finding)

數值程式庫如何一次找出多項式的「所有」根——比方說一個 5 次多項式的全部五個根,包括複根?不是靠跑五次牛頓法碰運氣。標準的訣竅出人意料又優雅:把多項式變成一個其「特徵值」恰好是該多項式之根的矩陣,再用成熟可靠的特徵值演算法一次找出它們全部。

每個首一多項式 p(x) = x^n + c_{n-1} x^{n-1} + ... + c_1 x + c_0 都有一個「伴隨矩陣」——一個由其係數特別建出的 n 乘 n 矩陣(次對角線放 1,最後一行或最上一列放係數的相反數)。它的定義性質是:這個矩陣的特徵多項式恰好就是 p(x)。因此伴隨矩陣的特徵值「就是」p 的根,不論實根或複根。要找根,你把伴隨矩陣交給 QR 演算法(LAPACK 中的主力特徵值求解器),它穩健地給出全部 n 個根。這正是數值軟體中廣用的 roots 函數的運作方式。另一種求全部根的迭代法——Durand-Kerner(Weierstrass)法——以巧妙的不動點更新同時精煉所有根的估計,而非用矩陣。

兩個誠實的要點作結。第一,它令人愉快地可靠,因為它把繁重工作卸給經過極度測試的 QR 特徵值機制,而非雜耍許多各有收斂困擾的獨立牛頓迭代。第二,有一個真實的條件數警告:多項式的根可能對其係數的微小變化異常敏感。Wilkinson 著名的例子——一個根在 1, 2, ..., 20 的 20 次多項式——當某個係數在第 10 位小數受擾動時,其根會大幅移動,所以經由係數形式可能病態。可以的話,直接處理多項式的根或因式形式,比從係數重建它更安全。

對 p(x) = x^2 - 3x + 2(根為 1 與 2),伴隨矩陣的兩列為 (0, -2) 與 (1, 3);其特徵值正是 1 與 2。像 roots([1, -3, 2]) 這樣的程式庫呼叫,正是建出這個矩陣並執行 QR 演算法,回傳兩個根——同樣的配方可擴展到帶複根的 50 次,全部一併給出。

多項式的根 = 伴隨矩陣的特徵值,由 QR 演算法求得。

當心條件數:多項式的根可能對其係數極度敏感(Wilkinson 多項式),所以即使特徵值求解本身向後穩定,從係數重建仍可能不適定。可以的話,優先處理因式或根的形式。

又稱
polynomial roots via eigenvaluescompanion matrix eigenvalue methodDurand-Kerner method伴隨矩陣特徵值求根