5.2 特徵值、特徵多項式與 Cayley–Hamilton 定理#
學習目標#
- 定義特徵值、特徵向量與特徵多項式,理解它們為何出現(求不變方向)。
- 敘述並證明 Cayley–Hamilton 定理,理解凱萊 1858 年的觀察與 Hamilton 1853 年四元數工作的淵源。
- 掌握可逆性的特徵值刻劃,以及對角化的條件。
- 能用 SymPy 計算
charpoly、eigenvals、eigenvects並驗證 Cayley–Hamilton 定理。
歷史背景#
5.2.1 兩個獨立的源頭#
特徵值的歷史比矩陣更早,而且有兩個互不相干的源頭:
- 微分方程與天體力學:1774 年,Euler(歐拉)在研究剛體旋轉時,實質上計算了慣量矩陣的主軸——即求特徵方向。19 世紀初 Lagrange 在研究行星軌道攝動時,也遇到「線性變換何時有穩定方向」的問題。
- 二次型與主軸定理:1826 年 Cauchy 在研究二次曲面標準化時,證明了對稱矩陣有實特徵值且可正交對角化(譜定理的先聲)。
「eigenvalue」一詞來自德文 eigen(自身的),由 Hilbert 在 1904 年的積分方程工作中推廣(Eigenwert)。
5.2.2 Hamilton 1853 與凱萊 1858#
- 1853 年,William Rowan Hamilton 在《Lectures on Quaternions》中證明了一個特例:四元數(可視為 \(2\times2\) 複矩陣的子集)滿足其自身的特徵方程。
- 1858 年,Cayley 在《A Memoir on the Theory of Matrices》中,對 \(2\times2\) 矩陣驗證了同一現象,並寫下「I have not thought it necessary to undertake the labour of a formal proof」(我認為不必費力給出正式證明)——對 \(3\times3\) 的情形他也是驗算而非證明。
- 1878 年,Frobenius 給出了第一個一般性的嚴格證明,並把它放進更宏大的矩陣理論中(見 5.4 節)。
技術驅動力很清楚:矩陣冪 \(A^n\) 的快速計算。若 \(A\) 滿足一個 \(n\) 次多項式 \(p(A)=0\) ,那麼所有 \(A^k\) ( \(k \ge n\) )都可化為 \(I, A, \dots, A^{n-1}\) 的線性組合——這在數值線性代數(Google PageRank 的冪迭代、Markov 鏈)中至今仍是核心思想。
數學理論#
5.2.3 特徵值與特徵向量#
定義 5.2.1。設 \(A \in M_n(F)\) , \(\lambda \in F\) 。若存在非零向量 \(\mathbf{v} \in F^n\) 使
則稱 \(\lambda\) 為 \(A\) 的特徵值, \(\mathbf{v}\) 為對應的特徵向量。
幾何意義: \(A\) 把 \(\mathbf{v}\) 的方向保持不變(只伸縮 \(\lambda\) 倍)——特徵向量就是變換的「不變方向」。若 \(F = \mathbb{C}\) ,則特徵值必存在;但實矩陣可能沒有實特徵值(如旋轉矩陣)。
定義 5.2.2(特徵多項式)。
這是 \(t\) 的 \(n\) 次首一多項式,其根恰為 \(A\) 在代數閉包 \(\bar{F}\) 中的特徵值。
推導: \(A\mathbf{v} = \lambda\mathbf{v}\) 且 \(\mathbf{v} \neq 0\) \(\iff\) \((\lambda I - A)\mathbf{v} = 0\) 有非零解 \(\iff\) \(\det(\lambda I - A) = 0\) 。
兩個不變量:由 Vieta 公式,
其中 \(\operatorname{tr}(A) = \sum_i a_{ii}\) 是跡。
定義 5.2.3。特徵值 \(\lambda\) 作為 \(\chi_A\) 的根的重數稱為代數重數;特徵空間 \(E_\lambda = \ker(A - \lambda I)\) 的維度稱為幾何重數。
定理 5.2.4。幾何重數 \(\le\) 代數重數。等號何時成立,正是 5.3 節若爾當標準形的主題。
5.2.4 Cayley–Hamilton 定理#
定理 5.2.5(Cayley–Hamilton,1858/證明 1878)。設 \(A \in M_n(F)\) , \(\chi_A(t) = t^n + c_{n-1}t^{n-1} + \cdots + c_0\) 。則
證明(對任意體 \(F\) ,透過稠密性論證):
- 先證 \(A\) 是可對角化矩陣(有 \(n\) 個線性無關特徵向量 \(\mathbf{v}_1, \dots, \mathbf{v}_n\) )的情形:此時 \(A = PDP^{-1}\) , \(D = \operatorname{diag}(\lambda_1, \dots, \lambda_n)\) 。對每個 \(i\) , \(\chi_A(\lambda_i) = 0\) ,故 \(\chi_A(D)\) 的第 \(i\) 個對角元 \(\chi_A(\lambda_i) = 0\) ,即 \(\chi_A(D) = O\) 。因此
-
一般情形:把 \(F\) 嵌入 \(\mathbb{C}\) (或 \(F(t)\) 的分式體),用 \(A + \epsilon I\) 這類可對角化矩陣的稠密逼近取極限;或者改用下述「伴隨矩陣」法:
-
伴隨法(Frobenius 式)。 \(tI - A\) 在多項式矩陣環 \(M_n(F[t])\) 中有伴隨 \(\operatorname{adj}(tI - A)\) ,滿足
把 \(\operatorname{adj}(tI-A)\) 寫成 \(B_0 + B_1 t + \cdots + B_{n-1}t^{n-1}\) (各 \(B_k \in M_n(F)\) ),比較兩邊 \(t^k\) 的係數:
依次以 \(A\) 左乘並相加,右邊望遠鏡式消去,得 \(\chi_A(A) = O\) 。 \(\blacksquare\)
重要警告: \(\chi_A(A) = 0\) 是「代入矩陣」而非「代入數字」;且不能用「 \(\det(\chi_A(A)) = \det(0) = 0\) 所以 \(\chi_A(A)=0\) 」這種錯誤推理。
5.2.5 推論與應用#
定理 5.2.6(可逆性刻劃)。以下等價( \(A \in M_n(F)\) , \(F\) 體): 1. \(A\) 可逆; 2. \(\det(A) \neq 0\) ; 3. \(0\) 不是 \(A\) 的特徵值; 4. \(A\mathbf{x} = \mathbf{0}\) 只有零解; 5. \(\chi_A\) 的常數項 \(c_0 = (-1)^n \det(A) \neq 0\) 。
應用一:計算高次冪。對 \(A = \begin{pmatrix} 1 & 1 \\ 0 & 2\end{pmatrix}\) , \(\chi_A(t) = t^2 - 3t + 2\) ,故 \(A^2 = 3A - 2I\) 。反覆代入:任何 \(A^k = \alpha_k A + \beta_k I\) ——把 \(n\times n\) 矩陣的 \(n^2\) 個自由度壓到 \(n\) 個。
應用二:Fibonacci 數列。 \(F_{n+1} = F_n + F_{n-1}\) 可寫成 \(\begin{pmatrix}F_{n+1}\\F_n\end{pmatrix} = A \begin{pmatrix}F_n \\ F_{n-1}\end{pmatrix}\) , \(A = \begin{pmatrix} 1 & 1 \\ 1 & 0\end{pmatrix}\) 。其特徵值是 \(\varphi = \frac{1+\sqrt5}{2}\) (黃金比例)與 \(\frac{1-\sqrt5}{2}\) ,由 Cayley–Hamilton 與對角化可得 Binet 公式:
應用三:對角化。
定理 5.2.7。 \(A\) 可對角化(即 \(A = PDP^{-1}\) , \(D\) 對角) \(\iff\) 所有特徵值的幾何重數等於代數重數 \(\iff\) \(A\) 有 \(n\) 個線性無關的特徵向量。
此時 \(D\) 的對角元是特徵值, \(P\) 的第 \(i\) 行(欄)是特徵向量。若 \(A\) 可對角化, \(A^k = P D^k P^{-1}\) ——計算 \(k\) 次冪只需 \(O(n^3 + n k)\) ,這是數值與圖論(計算路徑數)的標準技巧。不可對角化時的標準形就是 5.3 節的若爾當形。
定理 5.2.8(譜定理,特例)。實對稱矩陣 \(A = A^T\) 的特徵值皆為實數,且存在正交矩陣 \(Q\) ( \(Q^TQ = I\) )使 \(Q^T A Q\) 為對角矩陣。
SymPy 實作#
範例 1:特徵多項式與特徵值#
import sympy as sp
A = sp.Matrix([[2, 1], [1, 2]])
cp = A.charpoly(sp.Symbol('t'))
print("特徵多項式:", cp.as_expr()) # t**2 - 4*t + 3
print("eigenvals:", A.eigenvals()) # {1: 1, 3: 1}
print("eigenvects:")
for lam, mult, vecs in A.eigenvects():
print(f" λ={lam}, 代數重數={mult}, 特徵向量={vecs}")
print("trace =", A.trace(), "= 特徵值之和 =", sum(A.eigenvals()))
print("det =", A.det(), "= 特徵值之積 =", sp.prod(A.eigenvals()))
輸出:
特徵多項式: t**2 - 4*t + 3
eigenvals: {1: 1, 3: 1}
eigenvects:
λ=1, 代數重數=1, 特徵向量=[Matrix([[-1],[1]])]
λ=3, 代數重數=1, 特徵向量=[[Matrix([[1],[1]])]]
trace = 4 = 特徵值之和 = 4
det = 3 = 特徵值之積 = 3
範例 2:驗證 Cayley–Hamilton 定理#
import sympy as sp
t = sp.Symbol('t')
def poly_eval_matrix(f, A):
"""把多項式 f 代入矩陣:f(A)(Horner 法,從最高次係數開始)"""
result = sp.zeros(A.rows)
for c in sp.Poly(f, t).all_coeffs():
result = result * A + c * sp.eye(A.rows)
return result
for A in [sp.Matrix([[1, 1], [0, 2]]),
sp.Matrix([[0, -1], [1, 0]]),
sp.Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 10]])]:
cp = A.charpoly(t).as_expr()
result = poly_eval_matrix(cp, A) # 把矩陣代入多項式
print("A =", A.tolist(), " chi_A(A) =", result, " 零矩陣?", result == sp.zeros(A.rows))
輸出:
A = [[1, 1], [0, 2]] chi_A(A) = Matrix([[0, 0], [0, 0]]) 零矩陣? True
A = [[0, -1], [1, 0]] chi_A(A) = Matrix([[0, 0], [0, 0]]) 零矩陣? True
A = [[1, 2, 3], [4, 5, 6], [7, 8, 10]] chi_A(A) = Matrix([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) 零矩陣? True
注意第二個矩陣是 \(90°\) 旋轉矩陣,沒有實特徵值(特徵值 \(\pm i\) ),但 Cayley–Hamilton 依然成立: \(A^2 + I = O\) 。
範例 3:用 Cayley–Hamilton 快速算冪與 Fibonacci#
import sympy as sp
A = sp.Matrix([[1, 1], [1, 0]]) # Fibonacci 矩陣
t = sp.Symbol('t')
cp = A.charpoly(t).as_expr()
print("chi_A =", cp) # t**2 - t - 1
print("A^2 =", A**2, "\n = A + I ?", A**2 == A + sp.eye(2))
# Binet 公式驗證
phi = (1 + sp.sqrt(5)) / 2
F = lambda n: (phi**n - (1 - phi)**n) / sp.sqrt(5)
print([sp.simplify(F(n)) for n in range(1, 8)]) # [1, 1, 2, 3, 5, 8, 13]
# A 的 100 次冪的 (0,0) 元是 F_101
print((A**100)[0, 0] == F(101))
輸出:
chi_A = t**2 - t - 1
A^2 = Matrix([[2, 1], [1, 1]])
= A + I ? True
[1, 1, 2, 3, 5, 8, 13]
True
由 \(A^2 = A + I\) ,任何 \(A^k\) 都是 \(A\) 與 \(I\) 的整係數組合: \(A^k = F_k A + F_{k-1} I\) ——這本身就是 Cayley–Hamilton 的直接應用。
範例 4:幾何重數 vs 代數重數(預告若爾當形)#
import sympy as sp
A = sp.Matrix([[1, 1], [0, 1]]) # Jordan 塊!
print("eigenvals:", A.eigenvals()) # {1: 2},代數重數 2
print("eigenvects:", A.eigenvects()) # 特徵空間維度只有 1
print("可對角化?", A.is_diagonalizable()) # False
print("diagonalize 嘗試:", A.diagonalize()) # 會報錯
輸出(diagonalize 那行會拋出 MatrixNonInvertibleError,故程式碼中可加 try/except):
eigenvals: {1: 2}
eigenvects: [(1, 2, [Matrix([[1],[0]])])]
可對角化? False
幾何重數 \(1 <\) 代數重數 \(2\) :這個矩陣不可對角化。它的正確標準形是若爾當塊——見 5.3 節。
習題#
- 手算並用 SymPy 驗證 \(A = \begin{pmatrix} 4 & 1 \\ 2 & 3\end{pmatrix}\) 的特徵多項式、特徵值與跡、行列式的關係。
- 證明:矩陣 \(A\) 與其轉置 \(A^T\) 有相同的特徵多項式。
- 證明:相似矩陣( \(B = PAP^{-1}\) )有相同的特徵多項式——這說明特徵多項式是線性映射(而非矩陣)的不變量。
- 用 Cayley–Hamilton 計算 \(\begin{pmatrix} 3 & 1 \\ 0 & 3\end{pmatrix}^{5}\) ,並用 SymPy 的
A**5驗證。 - 證明:若 \(\lambda\) 是 \(A\) 的特徵值,則 \(\lambda^k\) 是 \(A^k\) 的特徵值。反之是否成立?
- 用
eigenvects找出 \(A = \begin{pmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 3 \end{pmatrix}\) 的特徵空間,說明代數重數 \(2\) 的特徵值可以有 \(2\) 維特徵空間(可對角化),與 範例 4 對照。 - 證明定理 5.2.6 的五個等價條件。
- (挑戰)用伴隨矩陣法完整寫出 \(n = 2\) 時 Cayley–Hamilton 定理的證明。
SymPy 要點回顧#
| 語法 | 意義 |
|---|---|
A.charpoly(t) | 特徵多項式(回傳 PurePoly 物件,as_expr() 轉表達式) |
A.eigenvals() | 字典 {特徵值: 代數重數} |
A.eigenvects() | 串列 [(λ, 代數重數, [特徵向量...]), ...] |
A.trace()、A.det() | 跡、行列式 |
poly_eval_matrix(f, A)(自訂,見範例 2) | 把矩陣代入多項式(驗證 Cayley–Hamilton;Poly.eval 不接受矩陣) |
A.is_diagonalizable() | 判斷是否可對角化 |
A.diagonalize() | 回傳 (P, D) 使 \(A = PDP^{-1}\) (不可對角化時報錯) |
下一節:不可對角化的矩陣該怎麼辦?若爾當標準形,見 5.3 節。