可对角化与特征值4.4 可对角化的情况
三种表达方式
变量替换 :把「原来的变量」换成「好的变量」,逐个击破坐标变换 :y ( t ) = C r ( t ) \mathbf{y}(t) = C\mathbf{r}(t) y ( t ) = C r ( t ) ,其中 C C C 是变换矩阵乘方计算 :A t = P D t P − 1 A^t = PD^tP^{-1} A t = P D t P − 1 用矩阵语言表达坐标变换
原问题 r ( t ) = A r ( t − 1 ) \mathbf{r}(t) = A\mathbf{r}(t-1) r ( t ) = A r ( t − 1 ) 令 y ( t ) = C r ( t ) \mathbf{y}(t) = C\mathbf{r}(t) y ( t ) = C r ( t ) ,则变成 y ( t ) = C A C − 1 y ( t − 1 ) \mathbf{y}(t) = C A C^{-1}\mathbf{y}(t-1) y ( t ) = C A C − 1 y ( t − 1 ) 如果 C A C − 1 = D C A C^{-1} = D C A C − 1 = D 是对角矩阵,问题就归结为 4.3 的标量情形 还原时用 r ( t ) = C − 1 y ( t ) \mathbf{r}(t) = C^{-1}\mathbf{y}(t) r ( t ) = C − 1 y ( t ) 为什么不能用初等变换
通过初等行/列变换确实能把 A A A 变成 d i a g \mathrm{diag} d i a g 形式 但初等变换是在 A A A 的左右两边分别 乘以可逆矩阵 C C C 和 P P P ,得到 C A P = D CAP = D C A P = D 而这里的变量替换要求:左边的 r ( t ) \mathbf{r}(t) r ( t ) 和右边的 r ( t − 1 ) \mathbf{r}(t-1) r ( t − 1 ) 必须经过同一个 P P P 变换 即 r ( t ) = P y ( t ) \mathbf{r}(t) = P\mathbf{y}(t) r ( t ) = P y ( t ) 在递推式两边同时生效 所以初等变换在这里不适用 —— 这是第 2 章里「无所不能」的初等变换在本章失效的原因 4.5 特征值、特征向量
特征值的两种理解第一种:伸缩倍率。
A p = λ p A\mathbf{p} = \lambda\mathbf{p} A p = λ p 意味着沿 p \mathbf{p} p 这个方向,映射只做伸缩。λ > 1 \lambda > 1 λ > 1 伸长,∣ λ ∣ < 1 |\lambda| < 1 ∣ λ ∣ < 1 缩短,λ < 0 \lambda < 0 λ < 0 伸缩加翻转。
第二种:系统失控的判据。
第 4 章的真正目标是判断 r ( t ) = A r ( t − 1 ) \mathbf{r}(t) = A\mathbf{r}(t-1) r ( t ) = A r ( t − 1 ) 会不会失控。如果 A A A 可对角化成 A = P D P − 1 A = PDP^{-1} A = P D P − 1 ,那么
A t = P D t P − 1 A^t = P D^t P^{-1} A t = P D t P − 1
失控与否完全由 D D D 的对角元素决定,也就是由 A A A 的特征值决定 :
存在 ∣ λ ∣ > 1 |\lambda| > 1 ∣ λ ∣ > 1 → 失控
所有 ∣ λ ∣ < 1 |\lambda| < 1 ∣ λ ∣ < 1 → 不失控
所有 ∣ λ ∣ ≤ 1 |\lambda| \le 1 ∣ λ ∣ ≤ 1 但有 ∣ λ ∣ = 1 |\lambda| = 1 ∣ λ ∣ = 1 → 仅凭特征值无法判断
这个判据是全书最有实用价值的结论之一:不用算完整的 A t A^t A t ,只要算出特征值。
为什么特征值是「固有的」书中明确指出:D D D 的对角元素本质是特征方程的解 ,是矩阵本身的固有性质,没有任何人为操作的余地。
这解释了为什么变量替换得到的 D D D 的对角元素是确定的 —— 你换基底、换变量方式都不会改变它们。换句话说,特征值是矩阵的不变量 。
用 Ruby 验证def mat_mul_v (a, v ) a.each_index.map { |i | a[i].each_index.sum { |j | a[i][j] * v[j] } } end a = [[2.0 , 1.0 ], [1.0 , 2.0 ]] [3.0 , 1.0 ].each do |lam | v = [1.0 , -(2.0 - lam)] r = mat_mul_v(a, v) ratio = r.map { |x | x / v[0 ] } puts "lambda=#{lam} v=#{v} A*v=#{r.map { |x | x.round(6 ) } } 比值=#{ratio.map { |x | x.round(6 ) } }" end
输出:
lambda=3.0 v=[1.0, 1.0] A*v=[3.0, 3.0] 比值=[3.0, 3.0] lambda=1.0 v=[1.0, -1.0] A*v=[1.0, -1.0] 比值=[1.0, -1.0]
「比值」那两列就是验证:A p A\mathbf{p} A p 的每个分量除以 p \mathbf{p} p 的对应分量,两个都等于 λ \lambda λ ,说明 p \mathbf{p} p 确实是特征向量,λ \lambda λ 确实是伸缩倍率。
顺带验证幂矩阵:
def mat_mul (a, b ) n = a.size m = b[0 ].size k = b.size n.times.map { |i | m.times.map { |j | k.times.sum { |t | a[i][t] * b[t][j] } } } end def mat_pow (a, e ) r = a.size res = Array .new(r) { |i | Array .new(r) { |j | i == j ? 1.0 : 0.0 } } base = a while e > 0 res = mat_mul(res, base) if e & 1 == 1 base = mat_mul(base, base) e >>= 1 end res end a = [[2.0 , 1.0 ], [1.0 , 2.0 ]] p3 = mat_pow(a, 3 ) puts "A^3 = #{p3.each_index.map { |i | p3[i].map { |v | v.round(6 ) } }}"
A 3 = P D 3 P − 1 A^3 = P D^3 P^{-1} A 3 = P D 3 P − 1 这个公式可以用来交叉验证求出的 P P P 和 D D D 是否正确。
从特征值到 Jordan 标准型特征值判据有个漏洞:∣ λ ∣ = 1 |\lambda| = 1 ∣ λ ∣ = 1 的情况,仅凭特征值无法判断 。
原因是当 A A A 不可对角化时,A t A^t A t 里有 t t t 这个因子出现。一个 λ = 1 \lambda = 1 λ = 1 的 Jordan 块,其 t t t 次方带上 t t t 的增长,t t t 无限增大时还是会发散。
这就是下一节(4.7 不可对角化的情况)要解决的问题:用 Jordan 标准型补上这个缺口 。