跳转至

线性代数(一)行列式

章节概述

行列式是线性代数的重要概念,是研究矩阵性质和解线性方程组的基础工具。本章将介绍行列式的定义、性质、计算方法以及应用。

学习目标

  • 理解行列式的定义和几何意义
  • 掌握行列式的基本性质
  • 学会行列式的计算方法
  • 了解行列式的应用

(一)行列式的定义

二阶行列式

对于 2×2 矩阵:

A = |a₁₁ a₁₂|
    |a₂₁ a₂₂|

其行列式定义为:

det(A) = a₁₁a₂₂ - a₁₂a₂₁

三阶行列式

对于 3×3 矩阵:

A = |a₁₁ a₁₂ a₁₃|
    |a₂₁ a₂₂ a₂₃|
    |a₃₁ a₃₂ a₃₃|

其行列式定义为:

det(A) = a₁₁a₂₂a₃₃ + a₁₂a₂₃a₃₁ + a₁₃a₂₁a₃₂
        - a₁₃a₂₂a₃₁ - a₁₂a₂₁a₃₃ - a₁₁a₂₃a₃₂

n阶行列式

n阶行列式可以使用拉普拉斯展开来定义。

Python 实现

def determinant_2x2(a):
    """计算 2×2 矩阵的行列式"""
    return a[0][0] * a[1][1] - a[0][1] * a[1][0]

def determinant_3x3(a):
    """计算 3×3 矩阵的行列式"""
    return (a[0][0] * a[1][1] * a[2][2] +
            a[0][1] * a[1][2] * a[2][0] +
            a[0][2] * a[1][0] * a[2][1] -
            a[0][2] * a[1][1] * a[2][0] -
            a[0][1] * a[1][0] * a[2][2] -
            a[0][0] * a[1][2] * a[2][1])

实例分析

实例1:计算二阶行列式

|1 2|
|3 4|

A = [[1, 2], [3, 4]]
det_A = determinant_2x2(A)
print(f"det(A) = {det_A}")  # 输出: -2

实例2:计算三阶行列式

|1 2 3|
|4 5 6|
|7 8 9|

B = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
det_B = determinant_3x3(B)
print(f"det(B) = {det_B}")  # 输出: 0

(二)行列式的性质

基本性质

性质1:转置行列式不变

det(Aᵀ) = det(A)

性质2:交换两行(或两列),行列式变号

det(交换第i行和第j行) = -det(A)

性质3:某行(或列)乘以常数k,行列式乘以k

det(第i行乘以k) = k·det(A)

性质4:某行(或列)的k倍加到另一行(或列),行列式不变

det(第j行的k倍加到第i行) = det(A)

性质5:如果某行(或列)全为零,行列式为零

性质6:如果两行(或两列)相同,行列式为零

性质7:如果两行(或两列)成比例,行列式为零

性质验证

def property_transpose(A):
    """验证转置性质"""
    import numpy as np
    A_np = np.array(A)
    return abs(np.linalg.det(A_np) - np.linalg.det(A_np.T)) < 1e-10

def property_row_swap(A, i, j):
    """验证交换行性质"""
    import numpy as np
    A_np = np.array(A).astype(float)
    det_original = np.linalg.det(A_np)

    A_swapped = A_np.copy()
    A_swapped[[i, j]] = A_swapped[[j, i]]
    det_swapped = np.linalg.det(A_swapped)

    return abs(det_original + det_swapped) < 1e-10

(三)行列式的计算

拉普拉斯展开

行列式可以按某一行(或某一列)展开:

det(A) = Σ(j=1 to n) (-1)^(i+j)·aᵢⱼ·Mᵢⱼ

其中 Mᵢⱼ 是元素 aᵢⱼ 的余子式。

按第一行展开

det(A) = a₁₁·det(A₁₁) - a₁₂·det(A₁₂) + a₁₃·det(A₁₃) - ...

Python 实现

def determinant_recursive(matrix):
    """
    递归计算 n×n 矩阵的行列式(拉普拉斯展开)

    参数:
        matrix: n×n 矩阵

    返回:
        float: 行列式的值

    示例:
        >>> A = [[1, 2], [3, 4]]
        >>> determinant_recursive(A)
        -2.0
    """
    n = len(matrix)

    # 基本情况:2×2 矩阵
    if n == 2:
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]

    # 递归情况:按第一行展开
    det = 0
    for j in range(n):
        # 计算余子式
        minor = []
        for row in range(1, n):
            minor_row = []
            for col in range(n):
                if col != j:
                    minor_row.append(matrix[row][col])
            minor.append(minor_row)

        # 计算代数余子式
        cofactor = (-1) ** j * matrix[0][j] * determinant_recursive(minor)
        det += cofactor

    return det

# 使用 NumPy 进行高效计算
def determinant_numpy(matrix):
    """
    使用 NumPy 计算行列式

    参数:
        matrix: n×n 矩阵

    返回:
        float: 行列式的值
    """
    import numpy as np
    return np.linalg.det(np.array(matrix, dtype=float))

实例分析

实例:计算 4×4 行列式

|1  2  3  4|
|5  6  7  8|
|9 10 11 12|
|13 14 15 16|

C = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]]

det_C = determinant_recursive(C)
print(f"det(C) = {det_C}")  # 输出: 0.0

(四)行列式的应用

1. 判断矩阵是否可逆

定理:方阵 A 可逆的充分必要条件是 det(A) ≠ 0

def is_invertible(matrix, tolerance=1e-10):
    """
    判断矩阵是否可逆

    参数:
        matrix: n×n 矩阵
        tolerance: 容差

    返回:
        bool: 如果可逆返回 True
    """
    import numpy as np
    det = np.linalg.det(np.array(matrix, dtype=float))
    return abs(det) > tolerance

# 示例
A = [[1, 2], [3, 4]]
print(f"矩阵 A 是否可逆: {is_invertible(A)}")  # True

B = [[1, 2], [2, 4]]
print(f"矩阵 B 是否可逆: {is_invertible(B)}")  # False

2. 解线性方程组(克莱姆法则)

对于 n 元线性方程组 Ax = b,如果 det(A) ≠ 0,则:

xᵢ = det(Aᵢ) / det(A)

其中 Aᵢ 是将 A 的第 i 列替换为 b 得到的矩阵。

def cramer_rule(A, b):
    """
    使用克莱姆法则解线性方程组

    参数:
        A: 系数矩阵 (n×n)
        b: 常数向量 (n×1)

    返回:
        list: 解向量

    示例:
        >>> A = [[2, 1], [1, -1]]
        >>> b = [3, 0]
        >>> cramer_rule(A, b)
        [1.0, 1.0]
    """
    import numpy as np

    A_np = np.array(A, dtype=float)
    det_A = np.linalg.det(A_np)

    if abs(det_A) < 1e-10:
        raise ValueError("行列式为零,无法使用克莱姆法则")

    n = len(A)
    x = []

    for i in range(n):
        # 创建 Aᵢ
        A_i = A_np.copy()
        A_i[:, i] = b

        # 计算 xᵢ
        det_A_i = np.linalg.det(A_i)
        x_i = det_A_i / det_A
        x.append(x_i)

    return x

# 示例
A = [[2, 1], [1, -1]]
b = [3, 0]
solution = cramer_rule(A, b)
print(f"解: x = {solution}")  # 输出: [1.0, 1.0]

3. 计算三角形面积

平面上三个点 (x₁, y₁), (x₂, y₂), (x₃, y₃) 组成的三角形面积为:

面积 = 1/2 · |x₁ y₂ + x₂ y₃ + x₃ y₁ - y₁ x₂ - y₂ x₃ - y₃ x₁|

可以用行列式表示:

面积 = 1/2 · |x₁(y₂ - y₃) + x₂(y₃ - y₁) + x₃(y₁ - y₂)|

def triangle_area(p1, p2, p3):
    """
    计算三角形面积(使用行列式)

    参数:
        p1, p2, p3: 三角形的三个顶点坐标 (x, y)

    返回:
        float: 三角形面积

    示例:
        >>> triangle_area((0, 0), (1, 0), (0, 1))
        0.5
    """
    x1, y1 = p1
    x2, y2 = p2
    x3, y3 = p3

    area = 0.5 * abs(x1 * (y2 - y3) +
                     x2 * (y3 - y1) +
                     x3 * (y1 - y2))
    return area

# 示例
area = triangle_area((0, 0), (1, 0), (0, 1))
print(f"三角形面积: {area}")  # 输出: 0.5

(五)特殊行列式

1. 对角行列式

det(diag(a₁, a₂, ..., aₙ)) = a₁·a₂·...·aₙ

2. 三角行列式

det(上三角矩阵) = 主对角线元素的乘积
det(下三角矩阵) = 主对角线元素的乘积

3. 范德蒙德行列式

|1   1   1   ... 1|
|x₁  x₂  x₃  ... xₙ|
|x₁² x₂² x₃² ... xₙ²|
|...              |
|x₁^(n-1) x₂^(n-1) ... xₙ^(n-1)|

= Π(1 ≤ i < j ≤ n) (xⱼ - xᵢ)

Python 实现

def determinant_diagonal(diag):
    """计算对角行列式"""
    result = 1
    for val in diag:
        result *= val
    return result

def determinant_triangular(triangular):
    """计算三角行列式"""
    result = 1
    for i in range(len(triangular)):
        result *= triangular[i][i]
    return result

def vandermonde_determinant(x):
    """
    计算范德蒙德行列式

    参数:
        x: 向量 [x₁, x₂, ..., xₙ]

    返回:
        float: 范德蒙德行列式的值
    """
    result = 1
    n = len(x)

    for i in range(n):
        for j in range(i + 1, n):
            result *= (x[j] - x[i])

    return result

# 示例
x = [1, 2, 3, 4]
det_vandermonde = vandermonde_determinant(x)
print(f"范德蒙德行列式: {det_vandermonde}")

实战练习

练习1:计算行列式

计算下列行列式

|2  1  0|
|1  3  2|
|0  2  1|

D = [[2, 1, 0],
     [1, 3, 2],
     [0, 2, 1]]

det_D = determinant_recursive(D)
print(f"det(D) = {det_D}")

练习2:验证性质

验证矩阵转置后行列式不变

import numpy as np

E = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]

E_np = np.array(E, dtype=float)
det_E = np.linalg.det(E_np)
det_E_T = np.linalg.det(E_np.T)

print(f"det(E) = {det_E}")
print(f"det(Eᵀ) = {det_E_T}")
print(f"相等: {abs(det_E - det_E_T) < 1e-10}")

练习3:克莱姆法则

使用克莱姆法则解方程组:

2x + y - z = 1
x - y + z = 2
3x + 2y + z = 3

A = [[2, 1, -1],
     [1, -1, 1],
     [3, 2, 1]]
b = [1, 2, 3]

solution = cramer_rule(A, b)
print(f"解: x = {solution}")

章节小结

本章介绍了行列式的基本概念:

  1. 行列式的定义:理解二阶、三阶和n阶行列式的定义
  2. 行列式的性质:掌握行列式的基本性质
  3. 行列式的计算:学会使用拉普拉斯展开计算行列式
  4. 行列式的应用:理解行列式在判断矩阵可逆、解方程组等方面的应用
  5. 特殊行列式:了解对角、三角、范德蒙德等特殊行列式

行列式是线性代数的基础,是后续学习矩阵理论和向量空间的重要工具。

下一步

继续学习第二章:矩阵及其运算,学习矩阵的运算、逆矩阵、秩等内容。


重点提醒: - 行列式是对方阵定义的标量值 - 行列式为零表示矩阵不可逆 - 拉普拉斯展开是计算行列式的基本方法 - 克莱姆法则适用于小规模线性方程组 - 特殊行列式有其独特的计算方法