线性代数(一)行列式¶
章节概述¶
行列式是线性代数的重要概念,是研究矩阵性质和解线性方程组的基础工具。本章将介绍行列式的定义、性质、计算方法以及应用。
学习目标¶
- 理解行列式的定义和几何意义
- 掌握行列式的基本性质
- 学会行列式的计算方法
- 了解行列式的应用
(一)行列式的定义¶
二阶行列式¶
对于 2×2 矩阵:
其行列式定义为:
三阶行列式¶
对于 3×3 矩阵:
其行列式定义为:
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:计算二阶行列式
实例2:计算三阶行列式
(二)行列式的性质¶
基本性质¶
性质1:转置行列式不变
性质2:交换两行(或两列),行列式变号
性质3:某行(或列)乘以常数k,行列式乘以k
性质4:某行(或列)的k倍加到另一行(或列),行列式不变
性质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
(三)行列式的计算¶
拉普拉斯展开¶
行列式可以按某一行(或某一列)展开:
其中 Mᵢⱼ 是元素 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 行列式
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,则:
其中 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₃) 组成的三角形面积为:
可以用行列式表示:
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. 对角行列式¶
2. 三角行列式¶
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:验证性质¶
验证矩阵转置后行列式不变
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:克莱姆法则¶
使用克莱姆法则解方程组:
A = [[2, 1, -1],
[1, -1, 1],
[3, 2, 1]]
b = [1, 2, 3]
solution = cramer_rule(A, b)
print(f"解: x = {solution}")
章节小结¶
本章介绍了行列式的基本概念:
- 行列式的定义:理解二阶、三阶和n阶行列式的定义
- 行列式的性质:掌握行列式的基本性质
- 行列式的计算:学会使用拉普拉斯展开计算行列式
- 行列式的应用:理解行列式在判断矩阵可逆、解方程组等方面的应用
- 特殊行列式:了解对角、三角、范德蒙德等特殊行列式
行列式是线性代数的基础,是后续学习矩阵理论和向量空间的重要工具。
下一步¶
继续学习第二章:矩阵及其运算,学习矩阵的运算、逆矩阵、秩等内容。
重点提醒: - 行列式是对方阵定义的标量值 - 行列式为零表示矩阵不可逆 - 拉普拉斯展开是计算行列式的基本方法 - 克莱姆法则适用于小规模线性方程组 - 特殊行列式有其独特的计算方法