矩阵及其运算的Python实现
根据您提供的《第二章 矩阵及其运算》文档内容,我为您编写了对应的 Python 代码。代码使用科学计算库 numpy,严格按照文档的章节结构(§1-§5),演示了矩阵的定义、运算、转置、行列式、伴随矩阵、逆矩阵以及矩阵方程的求解。
您可以直接复制以下代码在 Python 环境中运行:
import numpy as np# =========================================================# 《第二章 矩阵及其运算》Python (NumPy) 实现与演示# =========================================================print("="*60)print("1. 矩阵的定义与特殊矩阵 (对应文档 §1)")print("="*60)# 一般矩阵定义 (文档 §1 二)A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])print("矩阵 A =\n", A)# 特殊矩阵 (文档 §1 三)O = np.zeros((2, 2)) # 零矩阵E = np.eye(3) # 单位阵 (对角线为1的对角阵)D = np.diag([2, 4, 6]) # 对角阵S = 5 * np.eye(3) # 纯量阵 (数量矩阵)print("\n零矩阵 O =\n", O)print("\n单位阵 E =\n", E)print("\n对角阵 D =\n", D)print("\n纯量阵 S =\n", S)print("\n" + "="*60)print("2. 矩阵的线性运算 (加法、减法、数乘) (对应文档 §2 一、二)")print("="*60)A1 = np.array([[1, 2], [3, 4]])B1 = np.array([[5, 6], [7, 8]])lam = 3# 矩阵加法 (必须同型)C_add = A1 + B1print("A1 + B1 =\n", C_add)# 矩阵减法 (加负矩阵)C_sub = A1 - B1print("\nA1 - B1 =\n", C_sub)# 数与矩阵相乘C_mul = lam * A1print("\nlambda * A1 =\n", C_mul)print("\n" + "="*60)print("3. 矩阵与矩阵相乘及幂运算 (对应文档 §2 三)")print("="*60)A2 = np.array([[1, 2], [3, 4]])B2 = np.array([[5, 6], [7, 8]])B3 = np.array([[1, 2, 3], [4, 5, 6]])# 矩阵相乘 (使用 @ 运算符或 np.dot)C_matmul = A2 @ B3print("A2 * B3 =\n", C_matmul)# 验证文档结论 1:矩阵乘法不满足交换律 AB != BAprint("\n验证 AB != BA:")print("A2 @ B2 =\n", A2 @ B2)print("B2 @ A2 =\n", B2 @ A2)# 验证文档结论 2:AB=O 不能推导 A=O 或 B=OA_zero_test = np.array([[-2, 4], [1, -2]])B_zero_test = np.array([[2, 4], [-3, -6]])print("\n验证 AB=O 但 A,B 均不为 O:")print("A_zero_test @ B_zero_test =\n", A_zero_test @ B_zero_test) # 结果为零矩阵# 方阵的幂运算 A^kA_pow = np.linalg.matrix_power(A2, 3) # 等同于 A2@A2@A2print("\nA2^3 =\n", A_pow)# 方阵的多项式 (文档 §2 三:phi(A) = A^3 + 2*A^2 - 3*A)phi_A = np.linalg.matrix_power(A2, 3) + 2*np.linalg.matrix_power(A2, 2) - 3*A2print("\nphi(A) = A^3 + 2*A^2 - 3*A =\n", phi_A)print("\n" + "="*60)print("4. 矩阵的转置与对称阵 (对应文档 §2 四)")print("="*60)A3 = np.array([[1, 2, 3], [4, 5, 6]])A3_T = A3.T # 使用 .T 求转置print("A3 =\n", A3)print("\nA3 的转置 A3.T =\n", A3_T)# 验证性质:(AB)^T = B^T * A^Tprint("\n验证 (AB)^T == B^T @ A^T:")print("(A2@B2)^T =\n", (A2 @ B2).T)print("B2.T @ A2.T =\n", B2.T @ A2.T)# 对称阵 (A = A^T)Sym_A = np.array([[1, 2, 3], [2, 4, 5], [3, 5, 6]])print("\n对称阵 Sym_A =\n", Sym_A)print("Sym_A.T =\n", Sym_A.T) # 与原矩阵相等print("\n" + "="*60)print("5. 方阵的行列式与伴随矩阵 (对应文档 §2 五)")print("="*60)# 引用文档 §3 例题矩阵A4 = np.array([[2, 2, 1], [3, 1, 5], [3, 2, 3]], dtype=float)# 方阵的行列式 |A| 或 det(A)det_A4 = np.linalg.det(A4)# 由于浮点数精度问题,四舍五入显示print(f"矩阵 A4 的行列式 |A4| = {det_A4:.2f}")# 伴随矩阵 A* # Numpy 没有直接求伴随矩阵的函数,利用文档中的定理:A* = |A| * A^-1A4_inv = np.linalg.inv(A4)A4_star = det_A4 * A4_invprint("\nA4 的伴随矩阵 A4* =\n", np.round(A4_star, 2)) # 四舍五入处理精度误差# 验证文档性质:A * A* = |A| * Eprint("\n验证 A * A* = |A| * E:")print("A4 @ A4* =\n", np.round(A4 @ A4_star, 2))print("|A4| * E =\n", np.round(det_A4 * np.eye(3), 2))print("\n" + "="*60)print("6. 逆矩阵及其应用 (对应文档 §3)")print("="*60)# 求逆矩阵 A^-1A4_inverse = np.linalg.inv(A4)print("A4 的逆矩阵 A4^-1 =\n", np.round(A4_inverse, 2))# 验证文档推论:(AB)^-1 = B^-1 * A^-1A5 = np.array([[1, 2], [3, 4]], dtype=float)B5 = np.array([[5, 6], [7, 8]], dtype=float)print("\n验证 (A5*B5)^-1 == B5^-1 * A5^-1:")print("(A5@B5)^-1 =\n", np.linalg.inv(A5 @ B5))print("B5^-1 @ A5^-1 =\n", np.linalg.inv(B5) @ np.linalg.inv(A5))# 逆矩阵的应用:解矩阵方程 AXB = C (对应文档 §3 四)# 文档例子:A4 已知,B = [[2,1],[5,3]], C = [[1,3],[2,0],[3,1]]B_mat = np.array([[2, 1], [5, 3]], dtype=float)C_mat = np.array([[1, 3], [2, 0], [3, 1]], dtype=float)# 方程 AXB = C => X = A^-1 * C * B^-1X_sol = np.linalg.inv(A4) @ C_mat @ np.linalg.inv(B_mat)print("\n矩阵方程 AXB = C 的解 X =\n", np.round(X_sol, 2))print("\n" + "="*60)print("7. 线性方程组的矩阵表示与求解 (对应文档 §1 四, §2 三)")print("="*60)# 线性方程组 Ax = bA_eq = np.array([[1, 2, 3], [2, 5, 3], [1, 0, 8]], dtype=float)b_eq = np.array([5, 15, 9], dtype=float)print("系数矩阵 A =\n", A_eq)print("常数项向量 b =", b_eq)# 在 Python 中,求解 Ax = b 最简便的方法是使用 np.linalg.solve# 它内部使用的是类似初等变换的LU分解法,比直接求逆更稳定、快速x_sol = np.linalg.solve(A_eq, b_eq)print("\n方程组 Ax = b 的解 x =", x_sol)# 验证解的正确性print("验证 A * x =", A_eq @ x_sol)
代码与文档知识点的对应说明:
- 矩阵的建立 (§1) :在 Python 中使用嵌套列表
[[...], [...]] 并通过 np.array 转换为矩阵。np.zeros、np.eye、np.diag 分别对应文档中的零矩阵、单位阵和对角阵。 - 线性运算 (§2 一、二) :Python 中直接重载了
+、- 运算符进行同型矩阵的加减法,使用 * 进行数与矩阵的乘法(注意:在 NumPy 中,* 用于矩阵时是逐元素相乘,但数乘时等价于文档中的数乘运算)。 - 矩阵乘法 (§2 三) :Python 中使用
@ 运算符或 np.dot() 进行矩阵乘法。程序中演示了不满足交换律(A2@B2 不等于 B2@A2)和零因子现象。方阵的幂运算使用 np.linalg.matrix_power,完全对应文档中的 ,并计算了文档提到的方阵的多项式。 - 转置 (§2 四) :Python 中使用矩阵的
.T 属性求转置。代码验证了文档中的性质 ,即 (A @ B).T == B.T @ A.T。 - 行列式与伴随矩阵 (§2 五) :
np.linalg.det(A) 用于求方阵的行列式。由于 Python 没有直接求伴随矩阵的函数,代码利用了文档 §3 中的推导公式 来实现伴随矩阵的求解,并验证了 。 - 逆矩阵 (§3) :
np.linalg.inv(A) 用于求逆矩阵。代码演示了如何利用逆矩阵求解文档 §3 中的矩阵方程 ,其解即为 inv(A) @ C @ inv(B)。 - 线性方程组 (§1 四, §4) :文档中将方程组表示为 。在 Python 工程实践中,不推荐使用
inv(A) @ b 求解,而是使用 np.linalg.solve(A, b),这本质上对应了文档提到的“初等变换法”求解思想,效率远高于克拉默法则或直接求逆。
运算结果验证:
1. 矩阵的定义与特殊矩阵 (对应文档 §1)
import numpy as npprint("="*60)print("1. 矩阵的定义与特殊矩阵 (对应文档 §1)")print("="*60)# 一般矩阵定义 (文档 §1 二)A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])print("矩阵 A =\n", A)# 特殊矩阵 (文档 §1 三)O = np.zeros((2, 2)) # 零矩阵E = np.eye(3) # 单位阵 (对角线为1的对角阵)D = np.diag([2, 4, 6]) # 对角阵S = 5 * np.eye(3) # 纯量阵 (数量矩阵)print("\n零矩阵 O =\n", O)print("\n单位阵 E =\n", E)print("\n对角阵 D =\n", D)print("\n纯量阵 S =\n", S)
2. 矩阵的线性运算 (加法、减法、数乘) (对应文档 §2 一、二)
import numpy as npprint("\n" + "="*60)print("2. 矩阵的线性运算 (加法、减法、数乘) (对应文档 §2 一、二)")print("="*60)A1 = np.array([[1, 2], [3, 4]])B1 = np.array([[5, 6], [7, 8]])lam = 3# 矩阵加法 (必须同型)C_add = A1 + B1print("A1 + B1 =\n", C_add)# 矩阵减法 (加负矩阵)C_sub = A1 - B1print("\nA1 - B1 =\n", C_sub)# 数与矩阵相乘C_mul = lam * A1print("\nlambda * A1 =\n", C_mul)
3. 矩阵与矩阵相乘及幂运算 (对应文档 §2 三)
import numpy as npprint("\n" + "="*60)print("3. 矩阵与矩阵相乘及幂运算 (对应文档 §2 三)")print("="*60)A2 = np.array([[1, 2], [3, 4]])B2 = np.array([[5, 6], [7, 8]])B3 = np.array([[1, 2, 3], [4, 5, 6]])# 矩阵相乘 (使用 @ 运算符或 np.dot)C_matmul = A2 @ B3print("A2 * B3 =\n", C_matmul)# 验证文档结论 1:矩阵乘法不满足交换律 AB != BAprint("\n验证 AB != BA:")print("A2 @ B2 =\n", A2 @ B2)print("B2 @ A2 =\n", B2 @ A2)# 验证文档结论 2:AB=O 不能推导 A=O 或 B=OA_zero_test = np.array([[-2, 4], [1, -2]])B_zero_test = np.array([[2, 4], [-3, -6]])print("\n验证 AB=O 但 A,B 均不为 O:")print("A_zero_test @ B_zero_test =\n", A_zero_test @ B_zero_test) # 结果为零矩阵# 方阵的幂运算 A^kA_pow = np.linalg.matrix_power(A2, 3) # 等同于 A2@A2@A2print("\nA2^3 =\n", A_pow)# 方阵的多项式 (文档 §2 三:phi(A) = A^3 + 2*A^2 - 3*A)phi_A = np.linalg.matrix_power(A2, 3) + 2*np.linalg.matrix_power(A2, 2) - 3*A2print("\nphi(A) = A^3 + 2*A^2 - 3*A =\n", phi_A)
4. 矩阵的转置与对称阵 (对应文档 §2 四)
import numpy as npprint("\n" + "="*60)print("4. 矩阵的转置与对称阵 (对应文档 §2 四)")print("="*60)A3 = np.array([[1, 2, 3], [4, 5, 6]])A3_T = A3.T # 使用 .T 求转置print("A3 =\n", A3)print("\nA3 的转置 A3.T =\n", A3_T)# 验证性质:(AB)^T = B^T * A^Tprint("\n验证 (AB)^T == B^T @ A^T:")print("(A2@B2)^T =\n", (A2 @ B2).T)print("B2.T @ A2.T =\n", B2.T @ A2.T)# 对称阵 (A = A^T)Sym_A = np.array([[1, 2, 3], [2, 4, 5], [3, 5, 6]])print("\n对称阵 Sym_A =\n", Sym_A)print("Sym_A.T =\n", Sym_A.T) # 与原矩阵相等
5. 方阵的行列式与伴随矩阵 (对应文档 §2 五)
import numpy as npprint("\n" + "="*60)print("5. 方阵的行列式与伴随矩阵 (对应文档 §2 五)")print("="*60)# 引用文档 §3 例题矩阵A4 = np.array([[2, 2, 1], [3, 1, 5], [3, 2, 3]], dtype=float)# 方阵的行列式 |A| 或 det(A)det_A4 = np.linalg.det(A4)# 由于浮点数精度问题,四舍五入显示print(f"矩阵 A4 的行列式 |A4| = {det_A4:.2f}")# 伴随矩阵 A* # Numpy 没有直接求伴随矩阵的函数,利用文档中的定理:A* = |A| * A^-1A4_inv = np.linalg.inv(A4)A4_star = det_A4 * A4_invprint("\nA4 的伴随矩阵 A4* =\n", np.round(A4_star, 2)) # 四舍五入处理精度误差# 验证文档性质:A * A* = |A| * Eprint("\n验证 A * A* = |A| * E:")print("A4 @ A4* =\n", np.round(A4 @ A4_star, 2))print("|A4| * E =\n", np.round(det_A4 * np.eye(3), 2))
6. 逆矩阵及其应用 (对应文档 §3)
import numpy as npprint("\n" + "="*60)print("6. 逆矩阵及其应用 (对应文档 §3)")print("="*60)# 求逆矩阵 A^-1A4_inverse = np.linalg.inv(A4)print("A4 的逆矩阵 A4^-1 =\n", np.round(A4_inverse, 2))# 验证文档推论:(AB)^-1 = B^-1 * A^-1A5 = np.array([[1, 2], [3, 4]], dtype=float)B5 = np.array([[5, 6], [7, 8]], dtype=float)print("\n验证 (A5*B5)^-1 == B5^-1 * A5^-1:")print("(A5@B5)^-1 =\n", np.linalg.inv(A5 @ B5))print("B5^-1 @ A5^-1 =\n", np.linalg.inv(B5) @ np.linalg.inv(A5))# 逆矩阵的应用:解矩阵方程 AXB = C (对应文档 §3 四)# 文档例子:A4 已知,B = [[2,1],[5,3]], C = [[1,3],[2,0],[3,1]]B_mat = np.array([[2, 1], [5, 3]], dtype=float)C_mat = np.array([[1, 3], [2, 0], [3, 1]], dtype=float)# 方程 AXB = C => X = A^-1 * C * B^-1X_sol = np.linalg.inv(A4) @ C_mat @ np.linalg.inv(B_mat)print("\n矩阵方程 AXB = C 的解 X =\n", np.round(X_sol, 2))
7. 线性方程组的矩阵表示与求解 (对应文档 §1 四, §2 三)
import numpy as npprint("\n" + "="*60)print("7. 线性方程组的矩阵表示与求解 (对应文档 §1 四, §2 三)")print("="*60)# 线性方程组 Ax = bA_eq = np.array([[1, 2, 3], [2, 5, 3], [1, 0, 8]], dtype=float)b_eq = np.array([5, 15, 9], dtype=float)print("系数矩阵 A =\n", A_eq)print("常数项向量 b =", b_eq)# 在 Python 中,求解 Ax = b 最简便的方法是使用 np.linalg.solve# 它内部使用的是类似初等变换的LU分解法,比直接求逆更稳定、快速x_sol = np.linalg.solve(A_eq, b_eq)print("\n方程组 Ax = b 的解 x =", x_sol)# 验证解的正确性print("验证 A * x =", A_eq @ x_sol)