简介:这份「矩阵论期末考试参考答案」面向高校矩阵论与线性代数课程的期末复习者和备考学生,聚焦特征值、特征向量、Smith标准形、Jordan标准形、QR分解、正交投影及矩阵幂运算等核心考点,提供可对照的参考解答。压缩包共1个PDF文件,大小约284KB,内容紧凑,适合在电脑或移动端查阅,也便于打印后配合演算。目前已有619人学习。解答过程覆盖Jordan标准形中变换矩阵P与P⁻¹AP=J的构造、Gram-Schmidt正交化求QR分解、矩阵范数不等式证明以及非齐次微分方程组求解等典型题型,可用于核对答案、梳理证明步骤、理解相似变换与正交化流程,适合考前查漏补缺和建立矩阵理论解题框架。
1. 从一道矩阵题说起:矩阵论到底在算什么
“矩阵”这个词,大多数人第一次见是在本科线性代数课上——一堆数字排成方阵,加减乘有规矩,考完就原样还给了老师。到了矩阵论这门课,题目突然变了味道:不再问你行列式等于几,而是问你这台“矩阵机器”内部由哪些零件组成、哪个零件拆得下来、拆完还能不能转。打个比方,线性代数教你怎么操作这台机器,矩阵论让你看它的结构图纸。一份期末参考答案里,特征值、Jordan 标准形、QR 分解、伪逆、矩阵范数挤在同一页纸上,看着像五个互不相干的名词,其实指向同一件事:把一个矩阵拆开看清楚,再按需要重新拼回去。这条主线捋顺了,那些符号就不再是拦路虎。
2. 特征值与 Jordan 标准形:矩阵的骨架和它的例外
把一个矩阵想成一台加工机器,输入一根箭头,输出另一根箭头。绝大多数箭头进去之后方向会被拧歪、长度会被改变,看起来杂乱无章;但总有那么几个特殊方向,进去什么样、出来还是同一个方向,只是长度被拉长或压短了。这几个方向就是特征向量,拉长的倍数就是特征值。矩阵论里所有“把矩阵拆开”的动作,起点都是找出这批特殊方向——找到了,就等于摸到了这台机器的骨架。
2.1 特征值到底在测量什么
课本上写的是解方程 det(λI − A) = 0,这叫特征方程,左边那个 λI − A 叫特征矩阵。很多人的困惑不在解法,而在“为什么是 det = 0”。通俗地说,λI − A 这个矩阵如果可逆,那么 (λI − A)x = 0 只有零解,就找不到非零的特征向量;只有当它退化、行列式为零时,才会有非零解冒出来。所以求特征值本质上是在找“让 λI − A 失去可逆性”的那些 λ。
特征值有个容易被忽略的性质:它是变换本身的固有属性,不随坐标系改变。你把矩阵做一次相似变换 P⁻¹AP,等于换了一套基底去描述同一个变换,特征多项式一点不变。这就是为什么可以先化简再求值——只要化简用的是相似变换,答案就是同一个。等比数列求和这类问题,矩阵的高次幂,微分方程组的解,背后都靠特征值撑着。
打个比方,一个二阶对角矩阵 diag(2, 3),它的特征值一眼就能读出来是 2 和 3,特征向量分别是两根坐标轴方向的箭头。这种矩阵是“最省事”的形态:作用在任意向量上,只是把横坐标放大两倍、纵坐标放大三倍。而对角化这件事,说穿了就是在问:我能不能找到另一套基底,让这个变换在这套基底下也变成这么省事的样子。
2.2 从 Smith 标准形到 Jordan 标准形:一条拆解链
不是所有矩阵都能对角化。举个最小的例子,二阶矩阵 [[2, 1], [0, 2]],特征值是 2(二重),但真正线性无关的特征向量只有一个,凑不齐两根轴。这时候对角化失败,得换一个更宽容的“标准形”——Jordan 标准形。它的样子是:主对角线上排特征值,紧贴对角线上方的那条超对角线放 1(或者不放),其余全零。每一个这样的方块叫一个 Jordan 块。
那怎么知道该放几个块、每块多大?这就要绕道 λ-矩阵了。把 λI − A 看成一个元素是多项式的矩阵,对它做初等变换——交换两行、某行乘非零常数、把一行的多项式倍加到另一行——可以把它化成对角形 diag(d₁(λ), d₂(λ), …, d_r(λ), 0, …, 0),其中每个 d 都是首一多项式,而且 d₁ 整除 d₂、d₂ 整除 d₃,一路整除下去。这个对角形叫 Smith 标准形,那些 d 叫不变因子。
拿到不变因子,再把它们分解成不可约多项式的幂,得到的就是初等因子。每个形如 (λ − λ₀)^k 的初等因子,对应一个 k 阶、特征值为 λ₀ 的 Jordan 块。一份参考答案里出现过这样的链条:λI − A 经过一串初等变换化成 diag(1, 1, (λ − 2)³),于是不变因子是 1、1、(λ − 2)³,初等因子只有 (λ − 2)³ 一个,最终 Jordan 形就是一个三阶块,对角线上三个 2,超对角线上两个 1。
用一张表把这两个“标准形”摆在一起看,区别就清楚多了:
| 对比项 | Smith 标准形 | Jordan 标准形 |
|---|---|---|
| 处理对象 | λ-矩阵 λI − A | 数字矩阵 A |
| 使用变换 | λ-矩阵的初等行列变换 | 相似变换 P⁻¹AP |
| 结果形态 | 对角,元素是多项式 | 块对角,块内超对角线为 1 |
| 回答的问题 | 不变因子、初等因子分别是什么 | 这个变换在某组基下长什么样 |
| 唯一性 | 相差非零常数倍 | 相差 Jordan 块的排列顺序 |
提示:Smith 标准形只是中间产物,它的价值在于把“有几个块、每块多大”这件事算清楚;真正要写进答案的,是 Jordan 标准形。
2.3 相似变换矩阵 P:广义特征向量链怎么串
知道了 Jordan 形 J,还差一个 P,使得 P⁻¹AP = J,或者等价地写成 AP = PJ。这个等式按列拆开,就变成了一串递推关系。假设 J 是一个以 2 为特征值的三阶块,把 P 写成三列 [P₁, P₂, P₃],AP = PJ 逐列展开后得到:
- AP₁ = 2P₁,也就是 (A − 2I)P₁ = 0,P₁ 是普通特征向量;
- AP₂ = P₁ + 2P₂,也就是 (A − 2I)P₂ = P₁;
- AP₃ = P₂ + 2P₃,也就是 (A − 2I)P₃ = P₂。
这三列组成一条“链”,P₁ 是链头,P₃ 是链尾。链上每一列都不是特征向量(除了 P₁),它们叫广义特征向量。链的长度等于 Jordan 块的阶数,不同的链对应不同的块。
这里有一个手算时特别容易翻车的细节:递推方向是反的。你不能随便找一个特征向量当 P₁ 就往下解,因为 (A − 2I)x = P₁ 未必有解——P₁ 必须落在 (A − 2I) 的值域里才行。稳妥的做法是从链尾往链头找:先看 (A − 2I)³ 的零空间,在里面挑一个不属于 (A − 2I)² 零空间的向量当 P₃,然后依次算出 P₂ = (A − 2I)P₃、P₁ = (A − 2I)P₂。这样每一层都自动落在下一层需要的位置上,不会中途卡死。
拿一份参考答案里的三阶矩阵来验证,矩阵是 [[5, 5, −2], [−2, −1, 1], [−1, −1, 2]],它的特征值全是 2,几何重数只有 1。用代码把相似变换跑一遍:
import numpy as np # 待分解的矩阵 A = np.array([[5., 5., -2.], [-2., -1., 1.], [-1., -1., 2.]]) # 按广义特征向量链排好的变换矩阵,三列分别对应链头到链尾 P = np.array([[1., 3., 1.], [-1., -2., 0.], [-1., -1., 0.]]) J = np.linalg.inv(P) @ A @ P # 相似变换 P⁻¹AP print(np.round(J, 8)) # 输出对角为 2、超对角为 1 的三阶 Jordan 块代码里 np.linalg.inv(P) 求逆,@ 是矩阵乘法,np.round 只是把浮点误差抹掉。跑出来的结果应该是一个对角线上全是 2、超对角线上全是 1、其余为零的矩阵。如果结果不对,八成是 P 的三列顺序排错了,或者某一列没有落在正确的零空间里。
有了 J,矩阵的高次幂和矩阵指数就好算了:A^k = PJ^kP⁻¹,e^{tA} = Pe^{tJ}P⁻¹。而 J^k 和 e^{tJ} 只需要对每个 Jordan 块单独处理,块内那个“1”带来的影响是有限的几项,不会无限增长。这也是 Jordan 标准形在理论推导里地位这么高的原因——它把一个大矩阵的幂运算,拆成了若干个几阶小块的幂运算。
3. QR 分解:把歪斜的坐标轴一根根扶正
生活里描述一个位置,最舒服的方式是“往东走三米、往北走四米”,因为东和北互相垂直,两个方向的位移互不干扰,各算各的就行。如果两根轴夹角是 60 度,那你想往东走三米,实际还得往北补一段,坐标之间互相纠缠。QR 分解干的事,就是把一组夹角乱七八糟的向量,换成一组成员互相垂直、长度归一的新向量,让后面的计算彻底解耦。
3.1 为什么非要“正交”
正交基的好处体现在三个地方。第一是求坐标:在一般基底 {α₁, α₂, …, αₙ} 下,要把一个向量表示成它们的线性组合,得解一个 n 元线性方程组;而在正交基下,第 i 个系数直接用内积 ⟨v, γᵢ⟩ 就能算出来,一次乘加搞定。第二是误差控制:用非正交基做数值计算,误差会沿着基向量之间的“夹角”被反复放大,夹角越小放大越狠;正交基的夹角是 90 度,没有任何放大通道。第三是保长度:正交变换(旋转、反射)不改变向量的长度和内积,这让很多算法可以放心地在变换后的空间里做判断,结论搬回原空间依然成立。
这三点加起来,就解释了为什么数值线性代数里到处是正交矩阵的身影。求特征值用 QR 迭代,最小二乘用 QR 分解,奇异值分解的两侧也是正交矩阵。它们不是偏爱“垂直”这个几何美感,而是垂直带来的数值稳定性在工程上太值钱了。
3.2 Gram-Schmidt:一次扶正一根轴
正交化的思路很朴素:手里有一组线性无关的向量 α₁、α₂、α₃、α₄,先让 α₁ 原样站着当第一根轴;再让 α₂ 减去它在第一根轴上的投影,剩下的部分自然就垂直于第一根轴了;再让 α₃ 减去它在前面两根轴上的投影,剩下的部分垂直于这两根;依此类推。写成公式就是:
- β₁ = α₁
- β₂ = α₂ − (⟨α₂, β₁⟩ / ⟨β₁, β₁⟩) β₁
- β₃ = α₃ − (⟨α₃, β₁⟩ / ⟨β₁, β₁⟩) β₁ − (⟨α₃, β₂⟩ / ⟨β₂, β₂⟩) β₂
- β₄ = α₄ − 前面三项投影之和
这一步做完,得到的是正交但长度任意的向量组 {βᵢ}。再补一步“单位化”:γᵢ = βᵢ / |βᵢ|,把每根轴的长度都压到 1。两件事别混为一谈——正交化保证夹角是 90 度,单位化保证长度是 1,缺一个都不叫标准正交基。
一份参考答案里的例子用的是 Vandermonde 型矩阵,四列是 [[1, 1, 1, 1], [1, 2, 3, 4], [1, 4, 9, 16], [1, 8, 27, 64]] 的转置。这个矩阵的条件数极大,列向量之间几乎线性相关,手算时每一步的投影系数都是又长又怪的分数,比如第二个投影系数算出来是 15/4,第三个是 436/115。算到后面分子分母能长到四位数,一不留神就抄错。
import numpy as np # Vandermonde 型矩阵,列向量几乎线性相关,用来演示正交化 A = np.array([[1., 1., 1., 1.], [1., 2., 4., 8.], [1., 3., 9., 27.], [1., 4., 16., 64.]]) # reduced 模式返回薄 QR:Q 是 4x4,R 是 4x4 上三角 Q, R = np.linalg.qr(A, mode='reduced') print(np.round(Q.T @ Q, 10)) # 应为单位矩阵,验证 Q 的列标准正交 print(np.round(Q @ R - A, 10)) # 应接近零矩阵,验证 A = QRmode='reduced' 表示只保留有效维度,对满秩方阵来说和 complete 没差别;Q.T @ Q 是转置乘自身,用来检查正交性;Q @ R - A 是在验证分解是否还原了原矩阵。跑出来的第一个输出应该是单位矩阵,第二个应该全是零附近的浮点数。
注意:手算用的经典 Gram-Schmidt 在数值上并不稳定,正交性会随着列数增加迅速丢失。工业级实现用的是 Householder 反射或改进的 MGS,numpy.linalg.qr 内部走的就是 Householder。手算答案可以照 Gram-Schmidt 写,写程序就别自己实现经典版了。
3.3 A = QR 里,Q 和 R 各自负责什么
把上面的过程写成矩阵形式,就是 A = QR。Q 的列是标准正交基 γ₁ 到 γₙ,满足 QᵀQ = I;R 是上三角矩阵,第 j 列记录的是“第 j 个原始向量在这组新基底下需要多少分量”。之所以是上三角,是因为 Gram-Schmidt 逐列处理,第 j 列只会用到前 j 根正交轴,后面那些轴还没造出来,系数自然是零。
R 的对角元有一个很直白的含义:它等于对应的 βⱼ 的模长 |βⱼ|。所以如果某一列原始向量和前面的列几乎线性相关,对应的对角元就会非常小,这在数值上是个危险信号,提示你矩阵接近奇异。
| 方法 | 做法 | 数值稳定性 | 适用场合 |
|---|---|---|---|
| 经典 Gram-Schmidt | 逐列减去全部已有投影 | 一般,列数多时正交性丢失 | 手算、教学演示 |
| 改进 Gram-Schmidt | 每算出一根新轴就立刻用它修正后面所有列 | 较好 | 一般工程实现 |
| Householder 反射 | 用一组反射矩阵把矩阵逐步打成上三角 | 好 | 库函数默认选择 |
| Givens 旋转 | 用平面旋转逐个消去下三角元素 | 好,且可并行 | 稀疏矩阵、并行计算 |
这四种做法算出来的 Q 和 R 在精确算术下是同一组,在浮点运算下就分出高下了。这也是为什么同一道题手算和程序跑出来的数字会在小数点后好几位开始分叉,不是谁算错了,是路径不同。
4. 伪逆与矩阵范数:逆不存在时的替代方案
方阵可逆是个很奢侈的条件。现实里的矩阵经常是长方形的:方程个数多于未知数(超定),或者少于未知数(欠定),甚至行与行之间还线性相关。这时候 A⁻¹ 根本不存在,但问题还得解。矩阵论给出的答案是两条腿走路:一条是伪逆,找一个“最像逆”的矩阵;另一条是范数,给“像不像”“大不大”定一个可以比较的尺子。
4.1 矩阵范数:给矩阵量尺寸的几种尺子
向量的长度有三种必须满足的性质:非负且只有零向量长度为零、数乘时长度按比例缩放、三角不等式。矩阵范数在此基础上多加一条:‖AB‖ ≤ ‖A‖‖B‖,叫相容性。没有这一条,两个矩阵相乘之后长度可能爆掉,范数就没法用来估计误差了。
常用的几种里,1-范数取的是“列绝对值和的最大值”,∞-范数取的是“行绝对值和的最大值”,2-范数等于最大奇异值,Frobenius 范数则是把所有元素平方求和再开根号。
| 范数 | 定义 | 几何含义 | 计算量 |
|---|---|---|---|
| ‖A‖₁ | 各列元素绝对值之和的最大值 | 对输入向量“最大列冲击”的放大幅度 | 小 |
| ‖A‖∞ | 各行元素绝对值之和的最大值 | 对输出向量“最大行累积”的上界 | 小 |
| ‖A‖₂ | 最大奇异值 | 谱意义下的最大拉伸倍数 | 中 |
| ‖A‖_F | 全部元素平方和开根 | 把矩阵拉直当向量看长度 | 小 |
一份参考答案里证明过这样一组不等式:对 n 阶方阵,‖A‖₁ ≤ n‖A‖∞,同时 ‖A‖∞ ≤ n‖A‖₁。证明的核心是引入一个中间量 S,等于矩阵所有元素绝对值之和。一方面,每一列的和不超过 S,所以列和的最大值也不超过 S;另一方面,S 又可以看成 n 个行和相加,自然不超过 n 倍的最大行和。两边一夹,不等式就出来了。这个“先找一个夹在中间的粗放上界,再两头收紧”的套路,在矩阵分析里反复出现。
4.2 Moore-Penrose 伪逆:没有逆时的“替身”
伪逆 G 要满足四个条件,业内叫 Penrose 条件:AGA = A、GAG = G、(AG)ᵀ = AG、(GA)ᵀ = GA。前两条说它在 A 能起作用的空间里和 A 互为“左右手”,后两条说它产生的两个投影矩阵都是对称的。满足这四条且唯一的矩阵,就是 Moore-Penrose 伪逆,记作 A⁺。
直接按定义求很难,实操走的是满秩分解:把 A 拆成 A = BC,其中 B 列满秩、C 行满秩,秩都等于 A 的秩 r。这时伪逆有闭式:
G = Cᵀ(CCᵀ)⁻¹(BᵀB)⁻¹Bᵀ
这个式子的直观解释是:Cᵀ(CCᵀ)⁻¹ 负责在行空间里做一次“投影加还原”,(BᵀB)⁻¹Bᵀ 负责在列空间里做同样的事,中间两个可逆的小矩阵保证了运算能落地。当 A 本身就是可逆方阵时,B = A、C = I,公式退化回 A⁻¹,伪逆和逆在此重合。
import numpy as np # 行和为 2 的四阶方阵,行向量线性相关,不满秩 A = np.array([[1., 1., 0., 0.], [0., 1., 1., 0.], [0., 0., 1., 1.], [1., 0., 0., 1.]]) G = np.linalg.pinv(A) # 默认按奇异值分解计算伪逆 print(np.round(A @ G @ A - A, 8)) # Penrose 条件一:AGA = A print(np.round(G @ A @ G - G, 8)) # Penrose 条件二:GAG = Gnp.linalg.pinv 内部走的是奇异值分解,把小的奇异值截断掉,比手写满秩分解更稳。两个输出都应该是零矩阵,验证的是四条 Penrose 条件里最核心的两条。如果哪一条明显不为零,说明数值截断的阈值设得不合适,可以调 rcond 参数。
4.3 相容条件与最小范数解
有了伪逆,线性方程组 Ax = b 的处理就有了统一框架。有解的条件是 b 落在 A 的列空间里,用伪逆写出来就是 AGb = b,等价地 (I − AG)b = 0。这个条件一旦成立,通解可以写成 x = Gb + (I − GA)z,其中 z 是任意向量,(I − GA) 是个投影矩阵,负责把所有“零空间方向”的自由度都放进来。
如果方程组不相容(超定、又拟合不上),那就退而求其次,找让 ‖Ax − b‖ 最小的 x,这个最小二乘解就是 Gb。如果方程组相容但有无穷多解(欠定),Gb 恰好是所有解里欧几里得范数最小的那个,所以它叫最小范数解。一份参考答案里的四阶例子,把 A 做初等行变换后能看出前三列线性无关、第四列可以被前面表示,最终算出的相容条件是 a − b + c − d = 0。这个条件的形状很有意思:它只跟右端向量的四个分量有关,跟 A 的具体数值无关,因为约束来自行空间的正交补。
| 矩阵形态 | 秩的情况 | A⁺ 的形态 | 解的性质 |
|---|---|---|---|
| 方阵可逆 | 满秩 | 就是 A⁻¹ | 唯一解 |
| 列满秩(超定) | r = n | 左逆 (AᵀA)⁻¹Aᵀ | 最小二乘解,可能残差非零 |
| 行满秩(欠定) | r = m | 右逆 Aᵀ(AAᵀ)⁻¹ | 最小范数解,无穷多解中的最短者 |
| 一般情形 | r < min(m, n) | 满秩分解公式 | 先判相容,再取最小范数解 |
提示:伪逆不等于逆。只有当矩阵本身可逆时,两者才重合;对长方形矩阵谈“逆”是没有意义的,能谈的只有伪逆给出的某种最优近似。
5. 常见误区与易混概念:几组最容易踩坑的相近名词
矩阵论这门课的坑,多半不在计算量,而在名词长得太像。两个概念只差一个字,用错地方整道题的方向就偏了。下面这几组,是手算时最容易犹豫的地方。
5.1 概念层面:三组长得像、用起来完全不同的东西
第一组:代数重数与几何重数。易混点在于两个都叫“重数”,都跟特征值有关。混淆的原因是特征多项式给出一个数字,零空间的维数给出另一个数字,初学时容易默认它们相等。区分的方法很简单:代数重数是 λ 在特征多项式里作为根的次数,几何重数是 λI − A 的零空间维数,也就是真正能凑出的线性无关特征向量个数,在数值上几乎不可能相等。
第二组:Smith 标准形与 Jordan 标准形。易混点在于两者都是“标准形”,都跟 λ 有关。混淆的原因是教材里它们经常连着出现,中间只隔了几行推导。区分看处理对象:Smith 标准形是对 λ-矩阵做初等变换得到的对角形,元素是多项式;Jordan 标准形是对数字矩阵做相似变换得到的块对角形,元素是数。前者是过程,后者是结果。
第三组:伪逆与逆。易混点在于符号只差一个上标,公式长得也像。混淆的原因是方阵可逆时两者确实重合,导致很多人以为伪逆只是逆的另一种写法。区分看适用范围:逆要求方阵且行列式非零,伪逆对任意矩阵都有定义,而且伪逆一定存在、一定唯一。遇到长方形矩阵还去求逆,就等于在问一个没有答案的问题。
5.2 计算层面:两个数字一抄错就全盘皆输的地方
第四组:1-范数取列和,∞-范数取行和。易混点在于这两个下标看起来像是“行”和“列”的编号。混淆的原因是很多人凭直觉记成“1 对应第一行”“∞ 对应所有列”,结果正好记反。区分可以记一个口诀:1 是竖着数(列),∞ 是横着数(行)。验证办法是拿一个 2×3 的长方形矩阵试一下,两个范数量纲都不一样,一试就露馅。
第五组:广义特征向量链从哪一头开始。易混点在于递推式 (A − λI)P₂ = P₁ 看上去应该从 P₁ 往后推。混淆的原因是方程写出来就是“后一个由前一个决定”的样子,顺着读很自然。区分看可解性:从链头往后推,会碰到 (A − λI)x = P₁ 无解的死胡同;从链尾往前推,每一步都保证有解。链尾的选法是先看 (A − λI)^k 的零空间,挑一个不在 (A − λI)^{k−1} 零空间里的向量。
注意:这五组里,前两组属于“想清楚就不会错”,后三组属于“手一滑就错”。考试时前者靠理解,后者靠固定流程——每次动笔前先把定义在草稿纸上写一遍,比事后检查省时间。
6. 矩阵指数的用法与边界:一道微分方程组题的取舍
最后一章落到一个具体场景上:解线性微分方程组 dx/dt = Ax + f(t),给定初值 x(0)。这类题在矩阵论里几乎必考,标准套路是把矩阵指数 e^{tA} 算出来,再用积分因子法把非齐次项吸收进去。问题在于,e^{tA} 有无数种算法,选错一种就会在考场上耗掉半小时。
一份参考答案里的例子,系数矩阵是上三角的 [[1, 1, 1], [0, 1, 1], [0, 0, 1]],非齐次项只有第三行有一个 e^{2t},初值是 [1, 1, 1]。这个矩阵的特征值全是 1,拆成 A = I + N 之后,N 是严格上三角,N³ 直接等于零矩阵。这一步是关键:幂零矩阵的指数级数在有限项之后就截断了,e^{tA} = e^t(I + tN + t²N²/2),三项搞定,不需要求任何特征向量。
import numpy as np A = np.array([[1., 1., 1.], [0., 1., 1.], [0., 0., 1.]]) N = A - np.eye(3) # 幂零部分 print(np.allclose(N @ N @ N, 0)) # 验证 N 的三次方为零矩阵 t = 0.5 # 幂零意味着级数在二次项之后截断,只需算到 t²/2 项 M = np.eye(3) + t * N + (t**2 / 2) * (N @ N) expm_tA = np.exp(t) * M print(np.round(expm_tA, 6))np.allclose 用来在浮点意义下判断是否等于零,直接写 == 会因为舍入误差永远判假;np.eye(3) 是单位矩阵,用来把 A 拆成“数量部分 + 幂零部分”;最后的 np.exp(t) 是把标量因子提出来。整套流程对一般方阵不成立,只对“特征值高度重合、且能拆成对角部分加幂零部分”的矩阵有效。
真正需要判断的地方在这里:
| 场景 | 推荐做法 | 不建议的做法 | 原因 |
|---|---|---|---|
| 矩阵小、特征值重合度高 | 拆成 λI + N 用幂零截断 | 逐项展开无穷级数 | 级数有限项就停,手算可控 |
| 一般小矩阵、需要解析式 | 先求 Jordan 形,再用 Pe^{tJ}P⁻¹ | 直接对 A 展开级数 | 无穷项无法收敛到闭式 |
| 数值求解、矩阵较大 | 用库里的矩阵指数函数或数值积分 | 手动求特征分解 | 特征分解本身可能数值不稳 |
| 只需要某个时刻的值 | 常微分方程数值解法 | 求出整个 e^{tA} 再代入 | 算整个矩阵再取一列是浪费 |
| 矩阵接近奇异、条件数大 | 先做平衡化或缩放 | 直接调用伪逆公式 | 条件数会放大误差 |
反过来,有些场合这些工具就不该上。规模超过几十阶的数值问题,手推 Jordan 形是自找麻烦,因为 Jordan 形在浮点运算下根本不连续——矩阵元素微小的扰动会让一个块裂成好几个块。这时候该用的是 Schur 分解,它同样是酉相似变换下的上三角形,但数值上稳定得多。同样,超定最小二乘别去碰正规方程 (AᵀA)⁻¹Aᵀb,因为 AᵀA 的条件数是 A 的平方,本来能算的题会算成一片噪声,直接上 QR 或 SVD 才靠谱。
我的习惯是每次拿到矩阵先问三句话:它满秩吗?特征值重不重?题目要的是解析解还是数值解?这三个问题的答案直接决定了该走 Jordan 那条路还是 QR 那条路。有一回赶时间,对着一道特征值三重根的题硬求特征向量,算了四十分钟发现零空间只有一维,整页草稿作废;从那以后我每次动笔前都先算一遍 rank(λI − A),确认几何重数够不够对角化,再决定往哪个方向使劲。那份完整的参考答案里,每一问都保留了中间的变换步骤和选取依据,卡住的时候对照着看,比自己从头推一遍快得多。希望帮到你。
本文还有配套的精品资源,点击获取