线性代数 [ 行列式 ]

发布时间:2026/10/28 1:57:25
线性代数 [ 行列式 ] 线性代数行列式算出一个数这个数在描述什么我们先看一个很容易想象的变化把整个平面沿水平方向拉伸到原来的倍沿竖直方向拉伸到原来的倍。原来一个边长为的正方形现在变成宽、高的矩形。面积从变成也就是扩大到原来的倍。这个就是当前变换的行列式。前面几篇我们一直在追踪向量去了哪里。这一篇我们换一个问题当所有向量按照同一个线性规则变化时一个区域的面积或体积整体改变了多少倍内容接着上一篇《矩阵乘法与线性变换复合的联系》展开。这里继续使用固定的标准坐标系和列向量约定主要讨论实数方阵。矩阵表示一个变换表示它的行列式后者是一个数。先观察一个单位正方形为什么就够了两根基向量围出一个面积为 1 的区域前面已经讲过二维矩阵的两列分别记录经过变换后的坐标。现在我们把这两个标准基向量围成的单位正方形一起画出来。它的四个顶点依次是经过变换以后四个顶点变成大家注意第三个顶点。线性变换保持加法所以。因此变换后的图形由矩阵的两列作为相邻边围成通常是一个平行四边形也可能被压成线段或一个点。对于开头的拉伸第一列把横向的边拉到长度第二列把竖向的边拉到长度。两条边仍然垂直面积就是。图形变斜了面积一定改变吗我们再看上一篇出现过的水平剪切它让保持不动让​ 到达。单位正方形被推成平行四边形但底仍然是垂直高度也仍然是所以面积还是。这里就能看出一个容易混淆的地方行列式记录面积倍率不记录每一条边的长度倍率。剪切以后第二条边的长度变成了但面积没有改变。计算平行四边形的面积需要底乘垂直高度不能随意把两条相邻边的长度相乘。绕原点旋转时单位正方形的面积也仍为。所以行列式为的变换可以是旋转也可以是剪切当然也可以是什么都不改变的恒等变换。同一个行列式可以对应许多不同的空间变化。它把矩阵中的一部分几何信息提取成一个数并没有保留整个变换。先用代码验证这几个熟悉的例子下面使用 NumPy首次运行可安装依赖python3 -m pip install numpy。本篇代码块按顺序执行也可以直接运行文末的完整脚本。import numpy as np D np.array([[3, 0], [0, 2]]) S np.array([[1, 1], [0, 1]]) R np.array([[0, -1], [1, 0]]) for name, matrix in [(拉伸 D, D), (剪切 S, S), (旋转 R, R)]: value np.linalg.det(matrix) print(f{name}det{value:.1f}面积倍率{abs(value):.1f})输出结果拉伸 Ddet6.0面积倍率6.0 剪切 Sdet1.0面积倍率1.0 旋转 Rdet1.0面积倍率1.0np.linalg.det用来计算方阵的行列式它采用数值计算打印时保留一位小数便于观察这些简单例子。接口和计算方法见 NumPy 官方文档linalg.det。其他形状也按照相同的倍率变化我们观察单位正方形是因为它的初始面积刚好为容易直接读出倍率。这个倍率并不只对正方形有效。可以先想象把一个区域切成许多很小的正方形。线性变换对每一小块都使用同一套规则同样大小的小正方形即使位于不同位置变换后也只相差一个平移面积变化的比例相同。把这些小块加起来就能理解整个区域为什么也按相同倍率变化。对于有弯曲边界的普通区域可以把网格继续细分来逼近。这提供了直观理由更正式的说明见教材 Interactive Linear AlgebraDeterminants and Volumes。如果把区域记为普通面积的关系就是这里表示区域中的所有点经过变换后得到的区域。公式为什么加上绝对值因为行列式还有正负号我们接下来单独看这件事。面积不会是负数行列式为什么可以是负数正负号记录的是定向大家先沿着单位正方形的四个顶点走一圈这是逆时针方向。现在把整个平面关于轴反射原来的上方变成下方仍然按照原来的顶点顺序走得到的却是顺时针方向。正方形的普通面积仍为但这个有序方向发生了翻转所以。对非退化的二维变换也可以观察有序的两根基向量从第一根的像转到第二根的像取小于的转角逆时针对应正定向顺时针对应负定向。不能只看某一根箭头朝左还是朝右。因此我们把两部分信息分开读取行列式普通面积如何变化定向如何变化乘以保持定向乘以翻转定向变成图形退化无法保留原来的二维定向比如行列式为表示面积扩大到原来的倍同时定向翻转它不表示普通面积变成一个负数。从正数经过零再变成负数我们让竖直方向的缩放系数逐渐变化当时图形保持原样接近零时正方形越来越扁时它被压到轴当继续变成负数图形出现在轴的另一侧定向翻转。这一族变换的行列式就是。普通面积为而带定向的信息连续地从正值经过零变成负值。代码可以同时打印有符号的行列式和非负的普通面积for t in [1, 0, -1]: T np.diag([1, t]) height abs(T[1, 1]) print(ft{t:2d}det{np.linalg.det(T):4.1f}普通面积{1 * height:.1f})输出结果t 1det 1.0普通面积1.0 t 0det 0.0普通面积0.0 t-1det-1.0普通面积1.0这里的高度取绝对值因为高度作为长度不会为负。负号提供的另一层信息由行列式保存下来。行列式为零是整个平面都消失了吗也不是。把整个平面压到一条直线上输出仍然可以有长度只是没有二维面积了。再看一个稍微不同的矩阵它的所有输出都落在直线上所以面积同样变成零。两列分别为和它们线性相关无法围出有面积的平行四边形。这就和前面的《线性组合·张成的空间与基》连起来了两列张不成整个二维空间变换就会丢失至少一个独立方向。零行列式也包括所有输出都成为零向量的极端情况。二阶行列式为什么是 ad-bc把斜边推平再看底和高现在再回头看计算公式。设是矩阵的两列也是单位正方形变换后的两条相邻边。我们要算的就是它们围成的有向面积。先假设。对图形再做一次竖直剪切这次剪切保持横坐标不变把每条竖直截线上的点整体上下移动。每个竖直截段的长度不变所以面积不变定向也保持不变。它会把两条边分别变成第一条边现在已经落在水平轴上。用带符号的底和高度相乘有向面积就是如果只求普通面积取这个结果的绝对值即可。当时可以直接以竖直的第一条边观察有向面积结果为同样符合这个公式。因此二阶行列式为这里的减法保存了两条边共同决定的定向信息。如果只机械地记住两组乘积相减就很难判断结果为负或者为零时图形到底发生了什么。用一个数值例子把公式和面积对应起来取它的两列是和所以单位正方形中与原点相对的顶点会到达。按照公式我们也可以从图中直接检查外接矩形的面积为减去四块三角形的面积就得到里面的平行四边形面积。这张图中的结果为正说明这个例子保持定向普通面积与行列式都是。如果交换矩阵的两列围成的几何区域没有改变但两条边的有序关系反过来了行列式就会变成。不只检查单位正方形再变换一个三角形下面的代码先计算再分别变换一个正方形和一个三角形。这里用顶点的鞋带公式计算普通多边形面积np.roll用于让每个顶点和下一个顶点配对。def polygon_area(points): x, y points[:, 0], points[:, 1] return abs(np.dot(x, np.roll(y, -1)) - np.dot(y, np.roll(x, -1))) / 2 A np.array([[3, 1], [1, 2]]) square np.array([[0, 0], [1, 0], [1, 1], [0, 1]]) triangle np.array([[-2, 0], [-1, 0], [-2, 2]]) print(手算 ad-bc, A[0, 0] * A[1, 1] - A[0, 1] * A[1, 0]) print(fNumPy 行列式{np.linalg.det(A):.1f}) for name, points in [(正方形, square), (三角形, triangle)]: transformed (A points.T).T before polygon_area(points) after polygon_area(transformed) print(f{name}{before:.1f} → {after:.1f}倍率{after / before:.1f})输出结果手算 ad-bc 5 NumPy 行列式5.0 正方形1.0 → 5.0倍率5.0 三角形1.0 → 5.0倍率5.0points的每一行保存一个顶点所以先用.T把顶点转成列让左乘再转回原来的排列。这与上一篇“每一列一个向量”的乘法约定一致。原来的三角形底为、高为面积也是。两种形状经过同一个矩阵变换后面积都变成。代码检查的是这两个具体例子一般性的面积关系来自前面介绍的统一缩放性质。到了三维行列式描述的是什么单位正方形换成单位立方体在三维空间三个标准基向量围成一个体积为的单位立方体。经过线性变换以后三根相邻棱分别变成矩阵的三列它们通常围出一个平行六面体。如果三维区域记为对应的体积关系是例如三列分别是、、。前两条边在平面内围出面积为的底面第三条边到这个平面的垂直高度为因此体积为。第三条棱的长度并不等于高度。它还包含一个沿方向的分量这个分量让立体变斜却不增加它离底面的垂直距离。右图又接着做了一个把坐标设为零的变换所有输出都落到平面上三维体积变为零但它们在平面内仍然可以围出非零面积。判断“有没有被压扁”要明确自己正在测量的是二维面积还是三维体积。三维的负号仍然表示定向翻转三维的标准定向由右手规则约定。旋转保持这个定向关于一个坐标平面的反射会翻转定向。比如再把坐标取反反射前后平行六面体的普通体积都是行列式则从变成。一旦行列式为零三个列向量线性相关整个三维空间就会被送入一个平面、一条直线或原点。把这三种情况放在一起运行M3 np.array([[2, 1, 0], [0, 1, 1], [0, 0, 3]]) F3 np.diag([-1, 1, 1]) P3 np.diag([1, 1, 0]) for name, matrix in [(原变换, M3), (再反射, F3 M3), (再压到平面, P3 M3)]: value np.linalg.det(matrix) print(f{name}det{value:.1f}单位立方体像的体积{abs(value):.1f})输出结果原变换det6.0单位立方体像的体积6.0 再反射det-6.0单位立方体像的体积6.0 再压到平面det0.0单位立方体像的体积0.0三阶公式怎样计算设沿第一行展开就得到竖线​​ 表示计算里面那个方阵的行列式。每一项先删除当前元素所在的行、列再计算剩余的二阶行列式第一行的符号按排列。正式规则见 Interactive Linear AlgebraCofactor Expansions。代入刚才的​就得到。对于这个上三角矩阵结果也就是三个对角元素的乘积一般矩阵不能只乘主对角线。练习手算时可以用这个公式检查符号。实际处理较大矩阵时直接使用成熟的数值库NumPy 的det使用 LU 分解计算并不是照着三阶展开式不断递归。为什么复合变换的行列式要把两个数相乘连续缩放倍率自然相乘上一篇已经知道表示先执行再执行。现在假设让面积扩大到原来的倍又让面积扩大到它接收到的面积的倍那么最后就扩大到最初的倍。把定向也算进去如果保持定向而翻转定向整个过程翻转一次所以结果为负如果两步都翻转就翻转两次结果重新为正。这对应下面的性质对同阶方阵成立如果其中一步把空间压到更低维后续线性变换无法重新增加独立方向整体行列式仍为零也与乘法关系一致。把面积倍率和乘法顺序一起验证继续使用的矩阵再接上把横坐标取反把纵坐标扩大到原来的两倍。因此先后的整个过程面积扩大到原来的倍并且定向翻转B np.diag([-1, 2]) combined B A print(先 A 后 B 的矩阵\n, combined, sep) print(fdet(A){np.linalg.det(A):.1f}det(B){np.linalg.det(B):.1f}) print(fdet(BA){np.linalg.det(combined):.1f}) print(与两个行列式的乘积接近, np.isclose(np.linalg.det(combined), np.linalg.det(B) * np.linalg.det(A))) print(fdet(AB){np.linalg.det(A B):.1f}) print(AB 与 BA 是相同矩阵, np.array_equal(A B, B A))输出结果先 A 后 B 的矩阵 [[-3 -1] [ 2 4]] det(A)5.0det(B)-2.0 det(BA)-10.0 与两个行列式的乘积接近 True det(AB)-10.0 AB 与 BA 是相同矩阵 False这里最后两行要放在一起看。两个普通数相乘可以交换所以同阶方阵总有但矩阵本身仍然可能满足。行列式相同只能说明面积或体积的有向缩放相同不能说明每一个输入向量都去了同一个位置。这和前面“剪切与旋转都可以有行列式”是同一个道理。写程序时行列式很小就一定被压扁了吗在精确的数学关系中方阵的行列式为零等价于列向量线性相关也等价于对应变换不可逆。这里要求的是恰好为零。但数值计算中不能只拿行列式的绝对大小来判断。例如两个方向都缩小到原来的面积缩小到原来的。所以数值确实非常小但两个独立方向都还在变换也存在逆矩阵。先看一个实际结果tiny 1e-8 * np.eye(2) tiny_det np.linalg.det(tiny) print(f行列式{tiny_det:.1e}) print(默认 isclose 是否认为接近 0, np.isclose(tiny_det, 0)) print(数值秩, np.linalg.matrix_rank(tiny))输出结果行列式1.0e-16 默认 isclose 是否认为接近 0 True 数值秩 2True表示这个数落在isclose当前容差允许的范围内并不证明这个矩阵在数学上不可逆。NumPy 的 isclose 文档也明确提醒比较远小于的数时默认绝对容差未必适合。这里的“秩”可以先理解为保留下来的独立方向数后面会专门讲。判断浮点矩阵是否数值降秩时np.linalg.matrix_rank会依据奇异值和容差进行判断容差还需要结合数据尺度和误差选择见 NumPy 官方文档matrix_rank。所以几何上面积很小与某个独立方向已经完全丢失是两件不同的事。这也是为什么要把公式、图像和实际数值计算放在一起理解。看到一个行列式可以先读出哪些信息大家可以按照三个问题来读这个数绝对值是多少决定面积或体积的倍率符号是什么决定是否翻转定向是否为零决定是否丢失了满维空间。再检查几个容易混淆的地方二维向量整体放大到原来的倍面积倍率是多少是。两个方向都扩大两倍所以三维的​ 则对应体积倍率。行列式等于是不是每个向量都没有变化不是。前面的剪切、旋转都提供了反例。非方阵能不能直接套用这里的行列式普通行列式定义在方阵上。不同维度空间之间的变换需要另外讨论它保留了哪些方向以及怎样衡量面积或体积。接下来我们会继续追问一个没有把空间压扁的变换能不能倒着做回去如果已经压扁了哪些输入会混到一起所有输出又落在什么空间里这些问题会把我们带到逆矩阵、列空间、秩与零空间。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询