矩阵计算核心:Jordan形、QR分解与广义逆的工程应用 简介一份矩阵论期末考试参考答案内容围绕特征值、特征向量、若尔当标准形、史密斯标准形、QR分解、正交投影与矩阵幂运算等核心考点展开适合本科高年级及研究生期末复习或考研数学进阶学习。文档包含四道解答题均给出完整推导过程第一题计算给定矩阵的若尔当标准形并构造相似变换矩阵第二题对四个向量作施密特正交化并完成QR分解第三题证明矩阵一范数与无穷范数之间的不等式关系第四题借助矩阵指数求解非齐次线性微分方程组初值问题。整个资源为一份PDF文档压缩包大小约284KB内容排版规整、步骤清晰便于对照演算和查漏补缺。目前已有六百一十九人学习尤其适合需要系统掌握矩阵分解、标准形与矩阵函数应用的备考者。1. 矩阵论期末参考答案五类题型背后的计算链矩阵论期末考试里Jordan标准形、QR分解、矩阵范数、非齐次微分方程组和Moore-Penrose广义逆这五类题型几乎年年出现但参考答案里每一步都藏着符号、顺序和约分上的坑。这份资源是一套完整的5题参考答案覆盖了从λI−A的Smith标准形到广义逆的经典计算链每一题都给出了中间矩阵和最终结果。适合正在备考的工科生也适合工作中需要手推矩阵分解的从业者。它解决的核心问题是当你面对一个具体的矩阵如何一步步得到Jordan块、正交因子和最小范数解而不是只停留在概念层面。2. Jordan标准形从Smith标准形到P矩阵的完整计算链2.1 Smith标准形的操作顺序与不变因子第一题的目标是把矩阵A化为Jordan标准形J同时求出变换矩阵P。这里的核心入口并不是直接算特征向量而是先对λI−A做Smith标准形。很多人在这一步容易把行变换和列变换混着用结果得到一个形式上很乱、但没法读出不变因子的矩阵。正确做法是把λI−A作为多项式矩阵反复使用初等行变换和初等列变换目标是把它化为对角形式diag(d1(λ), d2(λ), d3(λ))并且要求d1(λ) | d2(λ) | d3(λ)也就是整除链必须成立。参考答案中给出的约化过程本质上是先把第一列和第二列里的常数项消掉再把第一行和第二行里的多项式项消掉最后得到一个对角阵。中间出现过的(−λ)(−λ²5λ−5)这类乘积形式是在做行变换时把公因子提取出来但最终必须回到标准形式。这个题里最终结果是diag(1, 1, (λ−2)³)所以不变因子就是{1, 1, (λ−2)³}初等因子只有{(λ−2)³}。这里有一个很容易困惑的点为什么不变因子里有一个三次方而不是三个(λ−2)因为不变因子之间必须满足整除关系1|1|(λ−2)³是合法的而1|(λ−2)|(λ−2)²虽然也满足整除但初等因子会变成三个一次因式对应的Jordan块就完全不一样了。所以要养成一个习惯写出不变因子后先检查整除链再拆初等因子。import sympy as sp lam sp.symbols(lam) A sp.Matrix([[5, 5, -2], [-2, -1, -1], [-1, -1, 2]]) M lam * sp.eye(3) - A # 如果sympy版本支持可以直接调用Smith标准形 from sympy.matrices.normalforms import smith_normal_form S smith_normal_form(M, domainsp.QQ[lam]) print(Smith标准形:, S.tolist())这段代码的作用是自动完成多项式矩阵的Smith标准形计算。domainsp.QQ[lam]意味着系数域是有理数多项式环这样除法不会丢精度。如果你用的sympy版本没有smith_normal_form可以手动做行变换和列变换但最终结果应该一致。验证的标准是对角元依次为1, 1, (λ−2)³且满足整除关系。从初等因子(λ−2)³可以直接读出Jordan块一个3阶Jordan块主对角线全为2超对角线全为1。所以J [[2,1,0],[0,2,1],[0,0,2]]。注意Jordan块里主对角线是特征值2超对角线是1不是次对角线。这一步如果写反后面的P矩阵整体都会跟着错。2.2 反推Jordan链为什么先求P3而不是P1得到J之后下一步是求P。这里P按列分块为[P1, P2, P3]满足AP PJ等价于三个方程AP1 2P1 AP2 P1 2P2 AP3 P2 2P3移项后得到广义特征向量链(A−2I)P1 0 (A−2I)P2 P1 (A−2I)P3 P2这个方程组看起来是从P1开始解但实际操作时必须反着来。从前往后解的典型困境是先解(A−2I)P1 0得到一个特征向量然后解(A−2I)P2 P1发现这个非齐次方程组可能无解——因为你随便选的特征向量不一定落在(A−2I)的值域里。正确顺序是先找P3让P3满足(A−2I)²P3 0但(A−2I)P3 ≠ 0然后令P2 (A−2I)P3P1 (A−2I)P2。这样得到的P1一定是特征向量而且链的长度正好是3。参考答案里给出的P3 [1,0,0]^TP2 [3,−2,−1]^TP1 [1,−1,−1]^T。你可以验证P1同时满足(A−2I)P1 0这意味着P1确实是特征值2对应的特征向量。三个向量线性无关所以P可逆。import numpy as np A np.array([[5, 5, -2], [-2, -1, -1], [-1, -1, 2]], dtypefloat) A2 A - 2 * np.eye(3) P3 np.array([1, 0, 0], dtypefloat) P2 A2 P3 P1 A2 P2 print(P1 , P1) print(P2 , P2) print(P3 , P3) P np.column_stack([P1, P2, P3]) J np.linalg.inv(P) A P print(Jordan形:\n, np.round(J, 6))这段代码验证了Jordan链的反推顺序。A2就是A−2I。P3先给定然后逐级向前乘得到P2和P1。最终np.linalg.inv(P) A P应该得到上三角Jordan形。注意这里P的列顺序是[P1, P2, P3]对应J的超对角线在右上方。如果列顺序变成[P3, P2, P1]得到的J会变成下三角形式的Jordan块虽然相似但不符合通常约定。2.3 用sympy验证对角化结果手算完成后强烈建议用符号计算做一次交叉验证。因为浮点数计算会有舍入误差Jordan形里的1可能显示成0.999999或1.000001。用sympy的Rational类型可以避免这个问题。import sympy as sp A sp.Matrix([[5, 5, -2], [-2, -1, -1], [-1, -1, 2]]) P sp.Matrix([[1, 3, 1], [-1, -2, 0], [-1, -1, 0]]) J_sym P.inv() * A * P print(J_sym)这里P的行是按[P1, P2, P3]作为列向量拼接的也就是P的第一列是P1。输出应该是[[2,1,0],[0,2,1],[0,0,2]]。如果输出里出现分数或非零的额外元素说明P的某一列不满足Jordan链方程需要检查到底是P2还是P3错了。我通常的做法是再额外检查一下AP vs PJ两边逐列对比这样定位错误更快。3. QR分解与范数不等式正交化细节与双重求和证明3.1 Gram-Schmidt正交化中每个系数怎么算第二题给的矩阵A是一个4×4的Vandermonde型矩阵列向量依次为[1,1,1,1]^T、[1,2,4,8]^T、[1,3,9,27]^T、[1,4,16,64]^T。QR分解用修改的Gram-Schmidt过程完成。这里最容易错的是内积和模长的计算尤其当β2带了分数因子后后续投影系数会被放大。整个过程的顺序是先正交化得β1到β4再单位化得γ1到γ4。β1 α1 [1,1,1,1]^T。β2 α2 − (⟨α2,β1⟩/⟨β1,β1⟩)β1。其中⟨α2,β1⟩ 1248 15⟨β1,β1⟩ 4所以投影系数是15/4β2 [−11/4, −7/4, 1/4, 17/4]^T。参考答案把它写成1/4[−11,−7,1,17]^T这是关键习惯——先提取公因子再继续算否则β3会变成带大分母的复杂分数。β3的计算需要减去在β1和β2两个方向上的投影。这里要用到⟨β2,β2⟩它是460/16115/4而⟨α3,β2⟩这里是关键因为β2带1/4因子所以内积是原内积的1/4。算完投影后得到β3 21/15[82,−21,−112,51]^T参考答案里的写法是21/15注意这个分数可以约成7/5但保留21/15是为了后续R矩阵里和模长表达式对齐。实际做题时建议先约分减少后续乘除的数值压力。import numpy as np A np.array([ [1, 1, 1, 1], [1, 2, 3, 4], [1, 4, 9, 16], [1, 8, 27, 64] ], dtypefloat) Q, R np.linalg.qr(A) print(Q:\n, Q) print(R:\n, np.round(R, 6))用numpy直接验证Q的第一列应该是[0.5,0.5,0.5,0.5]^TR的对角元素依次是2、√460/2、21/15·√22310、3/97·√194非对角元素对应参考答案里的上三角矩阵。numpy的QR分解默认用Householder变换符号约定和Gram-Schmidt略有不同但R的上三角结构和模长数值应该一致。如果发现某一列的符号反了不影响正交性但对不齐参考答案时需要自己调整符号。3.2 R矩阵的填法与分数约分R矩阵在QR分解中扮演的角色是坐标变换的系数记录。具体来说A QR而Q的列是单位正交向量γ1到γ4所以R Q^T AR的(i,j)元素等于γi^T αj。这意味着R是一个上三角矩阵对角线元素是γi与αi的内积而γi是βi的单位化所以R[i][i] |βi|。非对角线元素R[i][j]是γi与αj的内积这个值在Gram-Schmidt过程中已经出现过了。参考答案里R矩阵的第一行是[2, 15/2, 8, 85/2]这些值是怎么来的第一行是γ1与αj的内积γ1 [1/2,1/2,1/2,1/2]^T所以R[0][0] (1111)/2 2R[0][1] (1234)/2 5不是15/2。这里需要特别注意R矩阵和手工算的β系数之间不是直接相等因为γ1和β1差一个模长因子2。R[0][1]应该是γ1^T α2 15/2也就是5。参考答案里写的是15/2所以是7.5对应α2 [1,2,4,8]^T的内积(1248)15除以2正确。填R矩阵时最常见的错误是把Gram-Schmidt里的投影系数直接填进去。投影系数是⟨αj,βi⟩/⟨βi,βi⟩而R的非对角元是γi^T αj ⟨βi,αj⟩/|βi|两者差一个|βi|因子。所以必须回到定义不要照抄中间量。一个实用的自查方法是验证A的第一列等于Q第一列乘R[0][0]即α1 γ1·2这显然成立。3.3 范数不等式的双重求和证明第三题不是计算题而是证明题1/n·‖A‖₁ ≤ ‖A‖∞ ≤ n·‖A‖₁。这里‖A‖₁是列绝对值求和的最大值‖A‖∞是行绝对值求和的最大值。很多同学只记住了定义但不知道这两个范数之间的桥是全体元素绝对值之和∑|aij|。证明核心分三步。第一步‖A‖₁ ≤ ∑|aij| ≤ n·‖A‖∞。左边成立是因为列和的最大值不可能超过所有列的和右边是因为每一行的绝对值和不大于n·‖A‖∞所以全体元素之和不大于∑(行和) ≤ n²·‖A‖∞这里要小心实际上∑|aij| ≤ n·‖A‖∞是按行求和每一行有n个元素每个元素不超过‖A‖∞所以∑|aij| ≤ n²‖A‖∞这不是想要的界。正确的证法应该是‖A‖₁ max_j ∑|aij|全体元素和∑|aij| ∑_j(∑_i|aij|) ≤ n·max_j(∑_i|aij|) n‖A‖₁同时全体元素和也可以按行拆∑|aij| ∑_i(∑_j|aij|) ≤ n·max_i(∑_j|aij|) n‖A‖∞。所以实际上应该先建立两个方向的夹逼‖A‖₁ ≤ ∑|aij| ≤ n‖A‖₁以及‖A‖∞ ≤ ∑|aij| ≤ n‖A‖∞。然后结合这两个不等式得到1/n·‖A‖₁ ≤ ‖A‖∞以及‖A‖∞ ≤ n·‖A‖₁。因为它们的中间量都是∑|aij|但上下界系数不同需要通过这个公共的中间量来传递。import numpy as np rng np.random.default_rng(1) passed True for _ in range(1000): A rng.normal(size(5, 5)) n A.shape[0] n1 np.linalg.norm(A, 1) ninf np.linalg.norm(A, np.inf) if not ((1/n) * n1 ninf n * n1): passed False break print(1000个随机矩阵全部通过:, passed)这段代码随机生成1000个5×5矩阵逐个验证不等式。注意np.linalg.norm(A, 1)是列范数np.linalg.norm(A, np.inf)是行范数命名刚好和数学记号相反容易记混。如果把参数写反验证结果会直接失败。这也是一个值得记录的点编程接口的命名习惯和教材不同用之前先查文档。4. 非齐次方程组与广义逆两个必考计算模型4.1 用矩阵指数求解微分方程组第四题是非齐次线性微分方程组dx/dt Ax f(t)其中A是上三角Jordan块结构特征值全为1。求解的关键是利用矩阵指数和积分因子。做法是先把方程改写成d/dt[e^{−tA}x(t)] e^{−tA}f(t)然后两边从0到t积分。左边积出来是e^{−tA}x(t) − x(0)右边是对向量函数逐分量积分。这个技巧在教材里叫积分因子法本质上是把矩阵指数当成积分因子把导数算子变成对e^{−tA}x(t)的普通导数。其中最重要的一步是计算e^{tA}。因为A的特征值全为1所以(A−I)³ 0Hamilton-Cayley定理这说明e^{tA}的Taylor展开在二次项处截断e^{tA} e^t · [I t(A−I) (t²/2)(A−I)²]这是整道题的核心。如果特征值不是1而是λ就要把e^{tA}写成e^{λt}e^{t(A−λI)}再展开。参考答案里e^{tA}展开到二次项得到上三角矩阵[[1, t, tt²/2], [0, 1, t], [0, 0, 1]]乘以e^t。import sympy as sp t sp.symbols(t) A sp.Matrix([[1, 1, 1], [0, 1, 1], [0, 0, 1]]) I3 sp.eye(3) N A - I3 print((A-I)^2:, (N**2).tolist()) print((A-I)^3:, (N**3).tolist()) etA sp.exp(t) * (I3 t * N t**2 / 2 * N**2) print(e^(tA):, etA.tolist())输出里(A−I)²不是零矩阵而(A−I)³是零矩阵说明截断到二次项是正确的。如果特征值不是1N的幂次不会消失就不能这样截断。这是这个方法成立的前提。积分那一步需要特别小心。参考答案里积分结果是[(1/2t² − t)e^t积分, −te^t积分, e^t积分]。注意这里积分的是e^{−tA}f(t)而f(t) [0,0,e^{2t}]^T所以被积函数的前两个分量都含e^t因子。积分下限是0上限是t所以常数项是代入t0后的值的相反数。4.2 Moore-Penrose广义逆的满秩分解法第五题给出了一个4×4奇异矩阵A要求Moore-Penrose广义逆G并用G求线性方程组Axb的最小范数解。这里A的秩是3所以不能直接求逆。参考答案用的方法是满秩分解把A分解成B和C的乘积其中B是4×3列满秩C是3×4行满秩。满秩分解的构造方式是先对A做初等行变换找出三个线性无关的行在参考答案里是第1、2、3行需要看分解情况。然后B取这三个行对应的列组合C取A中线性无关的行。具体到这道题A [[1,1,0,0],[0,1,1,0],[0,0,1,1],[1,0,0,1]]秩为3。初等行变换后可以看出第1、2、3列线性无关第4列是前3列的线性组合所以B取前三列C是变换后的行阶梯矩阵的非零行。参考答案给出的分解是B [[1,1,0],[0,1,1],[0,0,1],[1,0,0]]注意这里B是4×3行是4行列是3列C [[1,0,0,1],[0,1,0,−1],[0,0,1,1]]。Moore-Penrose广义逆的满秩分解公式是G C^T(C C^T)^{-1}(B^T B)^{-1}B^T这个公式的结构有规律可循C在左边B在右边中间夹着两个逆矩阵。C C^T是3×3矩阵B^T B也是3×3矩阵只要B列满秩、C行满秩这两个矩阵就一定可逆。import numpy as np A np.array([ [1, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 1], [1, 0, 0, 1] ], dtypefloat) G np.linalg.pinv(A) print(pinv结果:\n, G) B np.array([[1, 1, 0], [0, 1, 1], [0, 0, 1], [1, 0, 0]], dtypefloat) C np.array([[1, 0, 0, 1], [0, 1, 0, -1], [0, 0, 1, 1]], dtypefloat) G2 C.T np.linalg.inv(C C.T) np.linalg.inv(B.T B) B.T print(满秩分解结果:\n, G2)用numpy的pinv直接算再和满秩分解公式对比。两者结果应该完全一致都是1/8乘以一个4×4矩阵。numpy的pinv基于SVD数值上稳定但不会告诉你结构。满秩分解的好处是能看清G的内部结构以及后续判断解存在的条件。4.3 解存在的条件与最小范数解的结构Axb有解的充要条件是AGbb也就是(I−AG)b0。注意这里不是检查G的某一行而是检查b是否落在A的列空间里。参考答案计算得到I−AG是一个秩1矩阵等于1/4乘以[1,−1,1,−1]^T[1,−1,1,−1]/4准确说是(I−AG)b 0等价于[1,−1,1,−1]b 0即a−bc−d0。当条件满足时通解是x Gb (I−GA)z其中z是任意向量。这里(I−GA)是零空间投影矩阵作用是把任意z投影到A的零空间。最小范数解同时也是最小二乘解是x₀ Gb它的范数在所有解里最小。b np.array([1, 2, 3, 2], dtypefloat) cond np.array([1, -1, 1, -1]) b print(解存在条件:, cond) # 0 x0 G b print(最小范数解:, x0) print(残差:, A x0 - b)这里b[1,2,3,2]满足1−23−20所以方程组有解。残差接近0说明Gb确实是一个解。如果条件不满足比如b[1,0,0,0]则Axb无解Gb只能给出最小二乘意义下的近似解。做题时第一步就要验条件否则后面的通解表达式全是错的。5. 避坑符号、顺序、约分与截断的四个翻车点5.1 现象Jordan链解到一半无解按照P1、P2、P3的顺序从前往后解先求得一个特征向量P1但代入(A−2I)P2 P1后发现非齐次方程组无解。原因P1虽然满足(A−2I)P10但它不一定落在A−2I的值域里。Jordan链的入口应该是链尾的P3即满足(A−2I)²P30但(A−2I)P3≠0的向量。从这个向量出发P2和P1都是被唯一确定的。解决无论题目给出的Jordan块是几阶都从最高阶广义特征向量开始反推。如果Jordan块是k阶就先求解(A−λI)ᵏx0且(A−λI)^{k−1}x≠0再逐级向前乘。5.2 现象QR分解中β2带着分数因子导致后续系数膨胀Gram-Schmidt过程里β2算出来是1/4[−11,−7,1,17]^T如果不在进入下一步之前约分直接在β3的计算里用带1/4的β2做内积那么⟨α3,β2⟩和⟨β2,β2⟩都会出现16倍的分母后面的β3和β4会越来越难算。原因修改的Gram-Schmidt要求每步都对当前正交化向量做归一化或至少提取公因子。如果不约分内积计算会携带多余的分母最终R矩阵的数值也对不齐。解决每得到一个βi先提取公因子写成最简形式再进入下一步。尤其是在Vandermonde矩阵这类数值尺度差异大的矩阵上这个习惯能显著降低手算出错率。5.3 现象矩阵指数展开少了一项计算e^{tA}时只展开到一次项e^t[I t(A−I)]得到的结果代入积分后最终解的分量对不上参考答案里的2e^{2t}。原因虽然(A−I)³0但(A−I)²不是零矩阵所以Taylor展开必须保留到二次项。少一项t²/2(A−I)²矩阵指数上三角矩阵的右上角元素就会缺失t²/2部分导致积分结果错误。解决先算出(A−I)²确认它非零后再决定截断阶数。更稳妥的做法是计算(A−I)的幂次序列从0次开始逐个检查直到出现零矩阵为止。5.4 现象Moore-Penrose广义逆中乘法顺序颠倒把公式误写为(B^T B)^{-1}B^T C^T(C C^T)^{-1}这样算出来矩阵维度都不匹配或者结果根本不是G。原因满秩分解ABC中B在左、C在右所以广义逆公式里左侧因子必须对应C的转置右侧因子必须对应B的转置。公式G C^T(C C^T)^{-1}(B^T B)^{-1}B^T的顺序不是随意定的它来自对四个Penrose条件的验证。解决记忆口诀是先C后B。写出G之后立刻验证AGAA和GAGG这两条用数值矩阵乘一遍如果不满足就说明顺序或逆矩阵的配对错了。5.5 现象解存在性条件符号搞反判断Axb有解的条件时把(I−AG)b0等价地改写成了(GA−I)b0得到abcd0之类的错误条件。原因A和G不一定可交换AG和GA是完全不同的投影矩阵。AG是列空间投影(I−AG)b0才是b在列空间里的条件。换成GA就变成了零空间投影含义完全不同。解决每次写出条件前先明确AG是m×m还是n×n。这里的A是4×4G也是4×4AG作用在b上所以条件是(I−AG)b0这个结论可以直接从AGAA推导出来。6. 拿结果前先做数值复核一套五步自查习惯完成手算后我习惯用一整套数值交叉验证来兜底。第一步验证Jordan分解计算P^{-1}AP和J对比允许的误差在1e−6以内。第二步验证QR分解检查Q^TQ是否接近单位矩阵R是否严格上三角A−QR的F范数是否接近0。第三步验证范数不等式随机生成100个矩阵用numpy的范数函数跑一遍确认不等式没有破界。第四步验证微分方程解把x(t)代入原方程分别计算dx/dt和Axf(t)对比差值。第五步验证广义逆检查AGAA、GAGG、AG和GA的对称性这四条是Moore-Penrose逆的充要条件比看单个矩阵元素快得多。import numpy as np # 以Jordan分解为例 A np.array([[5, 5, -2], [-2, -1, -1], [-1, -1, 2]], dtypefloat) P np.array([[1, 3, 1], [-1, -2, 0], [-1, -1, 0]], dtypefloat) J np.linalg.inv(P) A P print(Jordan验证误差:, np.max(np.abs(J - np.array([[2,1,0],[0,2,1],[0,0,2]]))))这套流程的关键在于分步输出中间结果不要只看最后一个结论。如果Jordan分解验证误差大先打印P的每一列是否满足链方程如果QR分解对不上先检查Q的列是否单位正交再检查R的对角元素。从那以后我每次拿到类似的矩阵计算题都强制走一遍特征多项式→整除链→Jordan链→数值验证的完整流程哪怕参考答案已经写得很清楚也会自己跑一遍数值核对。矩阵计算里符号和顺序的错误太隐蔽了只有数值验证能兜住。希望帮到你。本文还有配套的精品资源点击获取