笔记3-《程序员的数学3:线性代数》行列式与扩大率  

目录
  1. 行列式与扩大率
  2. 用 Ruby 验证
  3. 行列式为零意味着什么

行列式与扩大率

  • 1.3 行列式与扩大率

    • 行列式的几何意义:面积扩大率

      • 矩阵 A=(0.50.500.5)A = \begin{pmatrix} 0.5 & 0.5 \\ 0 & 0.5 \end{pmatrix} 对应的变换让面积变成原来的 0.5×0.5=0.250.5 \times 0.5 = 0.25 倍
      • 矩阵 B=(0.300.50.5)B = \begin{pmatrix} 0.3 & 0 \\ 0.5 & 0.5 \end{pmatrix} 对应的变换让面积变成原来的 0.3×0.5=0.390.3 \times 0.5 = 0.39 倍
      • 面积扩大率与原图形的位置和形状都无关
      • 这样的面积扩大率就称为该矩阵的行列式(determinant),记为 det⁡A=0.75\det A = 0.75 或 ∣A∣=0.75|A| = 0.75
      • 对于 3 阶方阵,行列式表示体积扩大率
      • 图形被压扁的情况下,体积扩大率为 0
    • 体积扩大率这个说法有什么用

      • 多重积分的换元法中行列式起关键作用,关键词是雅可比矩阵(Jacobian)
      • 「密度」问题:概率密度函数随随机变量变化而变化时也依靠行列式
        • 空间的延伸会带来密度的下降
      • 行列式可以用来检测是否产生了退化
        • 压扁对应行列式为 0
        • 求出行列式就能判断对应的线性变换是否压扁
        • 而压扁意味着不存在逆矩阵 —— 第 2 章会重点谈这件事
    • 「压缩扁平化」的严格说法

      • 指把不同的点映射到同一点,即存在 a′≠a\mathbf{a}' \neq \mathbf{a} 使得 Aa′=AaA\mathbf{a}' = A\mathbf{a}
    • 复矩阵与方阵

      • 复矩阵的行列式一般是复数,「体积扩大率」的直观解释变得勉强
        • 复平面上可以绕过行列式为 0 的点到达其镜像点(行列式为负)
      • 非方阵没有行列式的定义
  • 行列式的性质

    • 简单性质

      • det⁡I=1\det I = 1:保持不变,变化率当然是 1
      • det⁡(AB)=(det⁡A)(det⁡B)\det(AB) = (\det A)(\det B):先做映射 BB 造成 det⁡B\det B 的变化,再做映射 AA 造成 det⁡A\det A 的变化
    • 行列式的展开式

      • 2 阶:ad−bcad - bc
      • 3 阶:按第一行展开,三项两正一负交替
      • 4 阶以上:按第一行(或任意一行)展开,每一项是一个 (n−1)(n-1) 阶行列式
  • 计算方法

    • 用「某行的倍数加到另一行」的初等变换,行列式不变
      • 把某一行乘以 −4-4 加到第 2 列上,行列式不变
      • 用这个方法可以把矩阵变成上三角或对角矩阵
    • 交换两行,行列式变号
    • 某一行乘以 kk,行列式也乘以 kk
    • 对角矩阵的行列式就是对角线元素的乘积
    • 若对角线上有 0 元素,展开时那一列全变 0,可直接判断行列式为 0

用 Ruby 验证

行列式的定义式和这些性质都可以直接算:

# 2 阶行列式:ad - bc
def det2(m)
m[0][0] * m[1][1] - m[0][1] * m[1][0]
end

# 3 阶行列式:按第一行展开
def det3(m)
m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) \
- m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]) \
+ m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0])
end

# 验证 det(AB) = det(A) * det(B)
def mul(x, y)
n = x.size
n.times.map { |i| n.times.map { |j| n.times.sum { |k| x[i][k] * y[k][j] } } }
end

a = [[1, 2], [3, 4]]
b = [[5, 6], [7, 8]]

puts "det(A) = #{det2(a)}" # det(A) = -2
puts "det(B) = #{det2(b)}" # det(B) = -2
puts "det(AB) = #{det2(mul(a, b))}" # det(AB) = 4
puts "det(A)*det(B) = #{det2(a) * det2(b)}" # det(A)*det(B) = 4

m3 = [[2, 0, 1], [1, 3, 2], [1, 1, 0]]
puts "det3 = #{det3(m3)}" # det3 = -6

行列式为零意味着什么

  • det⁡A=0\det A = 0 对应「压扁」,也就是把不同的点映射到同一点

  • 存在 a′≠a\mathbf{a}' \neq \mathbf{a} 使 Aa′=AaA\mathbf{a}' = A\mathbf{a}

  • 换个说法:存在非零向量 v\mathbf{v} 使 Av=0A\mathbf{v} = \mathbf{0}

    • 这个 v\mathbf{v} 组成的集合叫 KerA\mathrm{Ker} A,叫核
  • 后果是:Ax=yA\mathbf{x} = \mathbf{y} 要么无解,要么有无穷多解,不可能有唯一解

  • 所以「有没有逆矩阵」这件事,完全由行列式决定:

    • det⁡A≠0\det A \neq 0 → 可逆,A−1A^{-1} 存在,解唯一
    • det⁡A=0\det A = 0 → 不可逆(奇异矩阵),解不唯一或不存在

这就是为什么行列式值得单独讲一节:它是判断「这个问题有没有唯一答案」的最快方式。

123.8k