ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

增广矩阵完全通关指南:从行变换到秩判据,解线性方程组不再难

增广矩阵完全通关指南:从行变换到秩判据,解线性方程组不再难 我第一次见到增广矩阵是在大一的线性代数课上。老师在黑板上写下一个三元一次方程组然后用一条竖线把系数和常数项隔开写成一个看起来像表格的东西。我当时的反应是这不就是把方程组重新抄了一遍吗后来才慢慢明白这条竖线远比“抄一遍”有意义它把解线性方程组这件事变成了一次标准化的表格操作。这篇笔记就来聊聊增广矩阵包括它怎么构造、怎么用来消元、怎么靠它判断方程组有没有解以及考试和实际计算里最容易踩的坑。适合正在学线代的大学生、考研复习的同学以及想把线性方程组彻底弄明白的自学者。1. 增广矩阵到底在解什么局1.1 一条竖线隔开的不只是数字先看一个最普通的线性方程组x y z 6 2x - y z 3 x 2y - z 2如果每次写方程都带着x、y、z和等号解方程组的时候会非常啰嗦。增广矩阵的做法很直接把系数按原来的位置排成左边一块把常数项排成右边一块中间用一条竖线隔开[1 1 1 | 6] [2 -1 1 | 3] [1 2 -1 | 2]这就是增广矩阵。左边是系数矩阵A右边是常数向量b整体记作(A|b)。那条竖线不是为了好看它是一条“分界线”提醒你左边是未知数的系数右边是等号右边的常数。这一列虽然也在矩阵里参与所有行变换但它在语义上和系数完全不同。我记笔记的时候习惯把竖线画粗一点就是为了提醒自己别在后面的消元里把两边的地位搞混。从形式上看增广矩阵就是把方程组的全部信息压缩成了一张表。每一行对应一个方程每一列对应一个未知数最后一列对应常数项。信息量一点没少但表达起来干净得多。更关键的是我们能在这张表上做统一的算术操作不必再反复抄写未知数。1.2 系数矩阵解决不了的问题有人会问为什么不能只用系数矩阵A比如上面那个方程组系数矩阵是[1 1 1] [2 -1 1] [1 2 -1]这个矩阵很对称、很好看但它丢掉了方程组的“输入条件”。同样是这个A右边常数如果是(1,1,1)或者(100,200,300)解出来的结果完全不同。只看A你根本不知道右边是什么。所以凡是涉及“解方程组”的问题必须把常数项一起纳入考虑这就是“增广”二字的来源——比A多了一列所以叫增广。还有一个更深层的原因判断方程组有解没有解本质上比较的是A和(A|b)之间的关系尤其是两者的秩。如果只用A你连无解和有解的区别都看不出来。这个点我在后面第3节会详细展开。简单说系数矩阵是方程组的“骨架”增广矩阵才是完整的“身体”解方程组时动手的对象一定是增广矩阵而不是只有系数的那个矩阵。1.3 什么时候必须用增广矩阵只要任务是通过消元解线性方程组就建议一上来直接写增广矩阵。具体场景包括手算高斯消元解三元、四元方程组考研数学线性代数部分的第一道大题通常是讨论含参方程组的解用矩阵方法判断向量组线性相关性、判断某个向量能不能由其他向量线性表示求矩阵的秩时如果涉及“增广后的秩”也必须用(A|b)的形式来分析学习线性变换时理解Axb的完整结构。我读书时的教训是很多同学写方程组时先写系数矩阵化简完系数矩阵再去补b结果要么漏掉右边要么每次都要回头对照原题效率很低。还不如一开始就把增广矩阵写好后面所有操作都在同一张表上进行。2. 初等行变换把方程组变成一张能摆弄的表2.1 三种合法操作及为什么只有这三种解方程组时哪些操作是“不改变解”的其实就是中学解方程组时常用的三件事交换两个方程的位置一个方程两边同时乘以非零常数一个方程加上另一个方程的若干倍。这三件事对应到增广矩阵上就是所谓的初等行变换交换两行记作R_i ↔ R_j某行乘以非零常数记作R_i ← kR_ik≠0某行加上另一行的倍数记作R_i ← R_i kR_j。为什么只允许这三种操作不能有别的因为它们本质上都是“方程组的合法变形”。交换两个方程的位置不会改变解方程两边同乘非零数相当于放大缩小天平的两端一个方程加另一个方程的倍数在方程处理中也是安全的。反过来如果你把某一列乘以2那就相当于强行把某个未知数的系数放大解出来的结果就变了。还有一个更严重的错误是把右边常数和左边系数混在一列做变换那相当于把等号右边的数当成了某个未知数的系数结果必然乱套。所以在增广矩阵上做的一切操作都只能是行变换这是铁律。我把这个规则类比成“整理账本”你可以把两行账目互换位置可以对整行乘以倍数可以把一行的若干倍加到另一行上但你不能把“花出去的钱”和“剩下来的钱”塞进同一列去加减。这两个东西性质不同硬塞在一起就成了一笔糊涂账。2.2 从增广矩阵到行阶梯形的消元手感下面用前面那个三元方程组走一遍消元过程。增广矩阵是[1 1 1 | 6] [2 -1 1 | 3] [1 2 -1 | 2]目标是把左边主对角线下方变成0。我的习惯是先看第一列。第一行第一列是1已经是一个天然的主元直接用这一行去消下面两行。第二步第二行减去2倍第一行第三行减去1倍第一行。R2 ← R2 - 2R1得到 [0 -3 -1 | -9]R3 ← R3 - R1得到 [0 1 -2 | -4]此时矩阵是[1 1 1 | 6] [0 -3 -1 | -9] [0 1 -2 | -4]第二列里第二行是-3第三行是1。为了让第二列下方是0也可以直接用第三行消第二行但更稳妥的做法是交换第二行和第三行让第二行第一列的主元用1来充当这样后面计算会轻松一些R2 ↔ R3[1 1 1 | 6] [0 1 -2 | -4] [0 -3 -1 | -9]然后第三行加上3倍第二行R3 ← R3 3R2 [0 0 -7 | -21]于是得到行阶梯形[1 1 1 | 6] [0 1 -2 | -4] [0 0 -7 | -21]这个形状的特征是每一行的首个非零元主元呈阶梯状向右下方排列主元下方的元素都是0。看到这个形状就可以回代了第三行是-7z -21所以z 3再代入第二行y - 2z -4得到y 2再代入第一行x y z 6得到x 1。解是(x, y, z) (1, 2, 3)。消元过程中我自己的习惯是每次变换后都重新抄一遍矩阵并在旁边写清楚这一步用了什么操作。比如写完“R2 ← R2 - 2R1”就画个箭头到下一行的新矩阵。考试时这样写步骤清晰也好回查万一某一步算错还能顺着标记找到问题在哪里。最怕那种从头到尾只写一个矩阵中间过程全在草稿纸上的人一旦结果不对根本没有办法检查。2.3 行最简形的价值与适用场景如果把行阶梯形再往前推一步把每个主元都化成1并把主元所在列的上方也消成0得到的就是行最简形也叫简化行阶梯形。以上面的矩阵为例[1 1 1 | 6] [0 1 -2 | -4] [0 0 -7 | -21]先把第三行除以-7得到[1 1 1 | 6] [0 1 -2 | -4] [0 0 1 | 3]再用第三行消第二行和第一行。第二行加上2倍第三行[0 1 0 | 2]第一行减去第三行[1 1 0 | 3]然后第一行减去第二行[1 0 0 | 1]最终得到[1 0 0 | 1] [0 1 0 | 2] [0 0 1 | 3]这个形态下解直接写在最右边一列x 1y 2z 3。不需要回代一眼就出答案。行最简形的价值在于“标准化”。手工解小规模方程组时回代更快但如果是用软件做大规模计算或者需要判断解的结构、写出通解时行最简形更直观。后面第4节介绍通解时我会继续用它来验证。3. 三种解的命运一眼从增广矩阵看穿3.1 行阶梯形的三种典型相貌解线性方程组结果无非三种唯一解、无穷多解、无解。增广矩阵化成行阶梯形后这三种情况各有各的“长相”。先看无解。行阶梯形里只要出现一行形如[0 0 ... 0 | c] 其中c≠0就说明方程组的某个方程变成了“0等于一个非零数”这显然是矛盾方程组无解。比如[1 1 -1 | 1] [0 1 3 | 1] [0 0 0 | 3]第三行表示0x 0y 0z 3没有任何一组x、y、z能满足所以整个方程组无解。再看唯一解。如果行阶梯形里非零行的行数恰好等于未知数的个数而且没有上面的矛盾行那就有唯一解。也就是说主元的个数等于n每个未知数都能被确定下来。最后是无穷多解。如果行阶梯形里没有矛盾行但非零行数小于未知数个数说明至少有一个未知数可以自由取值。比如3个未知数、2个有效方程的方程组有一个自由变量解就有无穷多个。我把这三种情况整理成一张速查表情况行阶梯形特征解的个数无解出现[0 ... 0 | c]且c≠00个唯一解非零行数 未知数个数无矛盾行1个无穷多解非零行数 未知数个数无矛盾行无穷多个这个表是我做题时反复对照的。只要行阶梯形画出来往表上一套解的类型马上就能判断。3.2 秩判据r(A)和r(A|b)谁大谁小“秩”这个概念在线代里无处不在用增广矩阵判断解的情况时更是离不开它。矩阵的秩就是行阶梯形里非零行的行数也就是主元的个数。用秩的语言来描述上面的三种情况就得到一个非常好用的判据设方程组Ax b有n个未知数A的秩记作r(A)增广矩阵(A|b)的秩记作r(A|b)。那么如果r(A) r(A|b)方程组无解如果r(A) r(A|b) n方程组有唯一解如果r(A) r(A|b) n方程组有无穷多解。为什么是这么比的关键在于r(A|b)大于r(A)说明右边多出的那一列给矩阵带来了一个“新的方向”而这个新方向是由常数项引入的它没法由各列系数组合出来。换句话说方程组内部出现了矛盾。我自己的理解是增广矩阵的秩比系数矩阵的秩多1就意味着方程之间互相打架你让我满足这个数又让我满足另一个对不上的数自然无解。用秩判据做题最大的好处是不用解出完整的解只要化简成行阶梯形数一下非零行行数就能完成判断。尤其在考研题里讨论含参方程组时需要快速分类秩判据是最高效的工具。3.3 自由度、自由变量和通解结构当方程组有无穷多解时我们除了判断“有无穷多解”还希望能把所有的解写出来。这就要引入自由变量的概念。如果n个未知数r(A) r(A|b) r那么自由变量的个数就是n - r。举个例子3个未知数秩等于2那么有1个自由变量。自由变量可以取任意值其余的主元变量由自由变量表示出来这样得到的表达式就是通解。具体计算时把行阶梯形化成行最简形主元列对应的变量留在左边自由变量移到右边作为参数。比如某个方程组的行最简形是[1 0 -4 | 0] [0 1 3 | 1] [0 0 0 | 0]3个未知数x、y、z秩是2自由变量是z。第一行表示x - 4z 0所以x 4z第二行表示y 3z 1所以y 1 - 3z。令z t通解就是x 4t y 1 - 3t z t这里的t可以是任意实数。写成向量形式就是(x, y, z) (0, 1, 0) t(4, -3, 1)这个写法其实是在说无穷多解可以看成“一个特解加上自由变量的一个方向”和空间里“过一个点的直线”是很像的。我把这个类比记在笔记旁边唯一解就像两个平面只交于一个点无穷多解就像两个平面交于一条直线无解就像三个平面互相之间没有公共交点。几何直观对理解秩和解的空间结构很有帮助。4. 完整实操从参数方程组到通解4.1 逐步消元与参数讨论下面用一个含参方程组完整走一遍流程。这个例子非常典型考研里很常见参数通常会躲在某个方程的右边讨论不同的a值对应什么解。x y - z 1 2x 3y z 3 3x 4y a先把增广矩阵写出来[1 1 -1 | 1] [2 3 1 | 3] [3 4 0 | a]第一步用第一行消第二行和第三行。R2 ← R2 - 2R1 [0 1 3 | 1]R3 ← R3 - 3R1 [0 1 3 | a - 3]此时矩阵是[1 1 -1 | 1] [0 1 3 | 1] [0 1 3 | a - 3]第二行和第三行长得非常像直接用第二行消第三行R3 ← R3 - R2 [0 0 0 | a - 4]于是得到行阶梯形[1 1 -1 | 1] [0 1 3 | 1] [0 0 0 | a - 4]观察矛盾行只有当最后一行左边全是0、右边也是0时方程才有解如果右边不是0就无解。所以出现两种情况。当a 4时最后一行是[0 0 0 | 0]没有矛盾非零行行数是2小于未知数个数3所以有无穷多解。当a ≠ 4时最后一行是[0 0 0 | a - 4]且a - 4 ≠ 0这是矛盾行方程组无解。这个例子没有“唯一解”的情况因为第三个方程本身就是前两个方程的线性组合形式只要右边匹配就冗余不匹配就矛盾。做题时要注意并不是每个参数题都会出现三种情况有的只有两种甚至一种。看到“无唯一解”也不要慌老老实实按消元后的矩阵分类讨论即可。4.2 用行最简形验证通解既然a 4时有无穷多解我们就把a 4代入并把行阶梯形继续化成行最简形写出完整的通解。a 4时[1 1 -1 | 1] [0 1 3 | 1] [0 0 0 | 0]用第二行消第一行让第一列和第二列变成只有主元R1 ← R1 - R2[1 0 -4 | 0] [0 1 3 | 1] [0 0 0 | 0]于是得到x - 4z 0 y 3z 1自由变量是z令z t则x 4t y 1 - 3t z t写回向量形式(x, y, z) (0, 1, 0) t(4, -3, 1)验证一下把t 0代入得到(x, y, z) (0, 1, 0)代入原方程第一个方程0 1 - 0 1成立 第二个方程0 3 0 3成立 第三个方程0 4 4成立。这说明(0, 1, 0)确实是一个特解。再把方向向量(4, -3, 1)代入齐次部分也就是方程组的左边验证是不是齐次方程Ax 0的解。这部分检验我在考试时也经常做只需要几秒钟但能避免因为行变换算错导致整个通解白写。4.3 记笔记的排版习惯与阶段检查学习增广矩阵笔记排版的清晰度直接影响计算准确率。我自己总结了一套习惯第一竖线一定要和等号对齐。写增广矩阵时右边常数项那一列要对齐竖线不要太靠左也不要太靠右。看上去是小事但对齐之后算错行的概率会明显下降。第二每一次行变换都要在矩阵旁边标注。比如“R2 ← R2 - 2R1”不要省略。这样回查的时候能快速定位是第几步出了问题。第三每完成一个阶段比如化成行阶梯形、化成行最简形停一下检查这一阶段有没有出现矛盾行以及非零行行数是多少。我见过太多同学一路埋头消元消到最后一抬头发现自己漏了一行或者把某一行写错了返工成本非常高。第四遇到参数不要一开始就分类讨论。先正常消元把参数逼到某一个位置通常是最后一行然后再根据参数的不同取值做分类。这样做最省力也不容易漏情况。5. 考场上最容易栽的坑和自查清单5.1 高频错误实录这几年我帮学弟学妹改过不少线代作业也看过很多考试错题增广矩阵相关的错误高度集中在这几个地方。第一个致命错误是做了列变换。有人在化简矩阵时顺手把某一列乘以2或者交换了两列然后整个解就崩了。记住增广矩阵只能做行变换任何列变换都不允许。如果要问为什么换个角度想交换两列等于交换两个未知数的位置如果你同时交换了未知数的名字那解出来的结果还要再换回去非常容易出错。更可怕的是把常数项那一列和其他列交换那就完全失去矩阵对应的方程组的意义了。第二个高频错误是漏掉增广矩阵的最后一列。有些同学习惯先写系数矩阵化简完再考虑b结果把b彻底忘了。或者在某一步重抄矩阵时把右边那一列抄丢了。我的建议是所有操作都在包括b列的完整增广矩阵上进行不要分成两段写。第三个错误是“无解判断”条件记反。无解的条件是r(A) r(A|b)不是r(A) r(A|b)。这里容易混的原因是直观上觉得“多了右边一列秩变大所以有解”但实际情况是如果增加的这一列带来的新方向无法由原系数列组合出来说明方程组内部矛盾反而无解。我建议把结论硬记下来再用几个小例子反复理解。第四个错误是用行列式判断解的情况时不加条件。行列式等于0只能说明系数矩阵不可逆对于方阵、A可逆的情况确实可以从det A ≠ 0推出唯一解可一旦det A 0可能无解也可能无穷多解单靠行列式分不出来。更麻烦的是增广矩阵不一定是方阵行列式根本不存在。所以遇到增量讨论时老老实实用秩判据别图省事。第五个错误是通解里参数重复命名。如果统一用t表示所有自由变量但本身又有两个自由变量就会导致两个不同的自由度被强行绑在一起解集就不对了。比如4个未知数、秩等于2时有2个自由变量应该分别用s和t表示写出类似(x1, x2, x3, x4) 特解 s(...) t(...)的形式。5.2 快速自查清单我把这些常见坑整理成一张自查清单每次做完增广矩阵相关的题目按这个顺序过一遍基本能拦截绝大部分错误检查项具体操作竖线位置确认增广矩阵最后一列是常数项竖线前后的列没有混用行变换合法性每一步都检查是否只用了行变换是否误把常数项当系数处理阶梯形状态画出最终行阶梯形数清楚非零行行数与未知数个数比较矛盾行检查是否存在[0 ... 0 | c]且c≠0秩判据写出r(A)和r(A|b)比较大小后再下结论通解验证把特解代回原方程看是否成立方向向量代入齐次方程看是否为0草稿标号确认每步行变换标注清晰便于回查这个清单看起来简单但实际做题时我见过太多人栽在“最后一步忘记比较秩”上。希望你也能养成这个流程化检查的习惯。6. 用工具验证别怕算错但要会查6.1 Python与Sympy快速验证手算难免出错尤其含参讨论时矩阵规模稍大就容易眼花。我自己的习惯是先用笔算一遍再用工具验证这样既练了手算能力又能及时发现自己哪里算错。Python里最常用的两个库是NumPy和SymPy。NumPy偏数值运算SymPy能做精确的符号计算还能直接给出行最简形。下面这段代码可以在几秒内验证一个增广矩阵的行最简形。import numpy as np from sympy import Matrix # 完整增广矩阵 augmented Matrix([ [1, 1, -1, 1], [2, 3, 1, 3], [3, 4, 0, 4], # 这里a就暂时填4来验证 ]) # 查看行最简形 print(augmented.rref()) # 用NumPy验证秩 A np.array([[1, 1, -1], [2, 3, 1], [3, 4, 0]]) b np.array([1, 3, 4]) Ab np.hstack([A, b.reshape(-1, 1)]) print(np.linalg.matrix_rank(A)) print(np.linalg.matrix_rank(Ab))输出rref结果后可以对照自己手算的行最简形看看哪里不一样。注意手算时如果只要求解不一定要化到行最简回代就可以了但用工具验证时rref是标准化的。还有一个常见需求是求方程组的解。对于方阵且系数行列式不为零的情况可以直接用numoy的solveA np.array([[1, 1, 1], [2, -1, 1], [1, 2, -1]]) b np.array([6, 3, 2]) x np.linalg.solve(A, b) print(x)会得到[1. 2. 3.]和手算结果一致。我习惯用工具做个“最终核对”尤其考试前的模拟练习会用这个方法筛掉一批低级错误。6.2 手算场景下的验证技巧如果考试时不能带电脑也可以用纯手算做验证。最简单的方法是把解代回原方程组。这个检查很笨但非常有效。比如上面例子中得到(x, y, z) (1, 2, 3)代回第一个方程1 2 3 6成立 第二个方程2 - 2 3 3成立 第三个方程1 4 - 3 2成立。大概20秒的检查基本能保证解是对的。对于参数题验证通解还有一个技巧取一个特殊的参数值比如t 0得到一个特解把它代回原方程再取t 1得到另一个解也代回原方程。如果这两个点都在解集里说明通解很可能是对的。这个方法不能百分之百保证通解方向正确但能帮助发现明显的笔误或符号错。另外如果方程组是方阵而且系数矩阵可逆也可以用行列式验证唯一解的存在性再用Cramer法则做交叉验证。但说实话对大部分初学者来说代回验证是性价比最高的方式。关于增广矩阵的一点个人体会学增广矩阵学到后面你会发现它本质上是一种“格式化的思维”。复杂方程组看起来混乱但一旦写成增广矩阵所有信息都被归置进一张表里接着就是机械而明确的消元操作。我在给学弟学妹讲题时经常说拿一张草稿纸竖线画直每一步标好符号这道题就已经做对了一半。最后再分享一个小技巧遇到“含参方程组有几个解”这类问题不要一上来就分类讨论先把增广矩阵化简到行阶梯形让参数尽量往后“走”参数一般只出现在最后几行然后再比较r(A)和r(A|b)。这样处理既不会漏掉参数的特殊取值也不会在分类时把自己绕晕。增广矩阵不算难难的是养成规范、流程化的习惯。把这个矩阵当作整理信息和执行消元的操作台你会发现线性方程组真的没那么可怕。
返回列表