矩阵逆($A^{-1}$)在求解 $Ax = b$ 形式的线性方程组中具有理论作用。这里展示了如何使用NumPy计算逆矩阵。尽管在实际中,直接计算逆矩阵通常不是求解方程组的首选方法,但知道如何计算它是一项基本技能。numpy.linalg 模块NumPy作为Python数值计算的主要库,包含一个专门用于线性代数运算的子模块:numpy.linalg。该模块包含用于矩阵分解、特征值计算、求解线性系统以及(对我们目前来说很重要)计算矩阵逆的函数。使用 inv() 计算逆矩阵要计算方阵的逆矩阵,我们使用 numpy.linalg.inv() 函数。它接受一个方阵(以NumPy数组表示)作为输入,并返回其逆矩阵,同样以NumPy数组形式。请记住,只有方阵才有逆矩阵,并且即使是方阵,也只有当它们是非奇异的(可逆的)时才有逆矩阵。让我们看一个例子。考虑以下 2x2 矩阵 $A$:$$ A = \begin{pmatrix} 4 & 7 \ 2 & 6 \end{pmatrix} $$我们可以在NumPy中表示这个矩阵并计算其逆矩阵:import numpy as np # 定义矩阵 A A = np.array([[4, 7], [2, 6]]) print("矩阵 A:") print(A) # 计算 A 的逆矩阵 try: A_inv = np.linalg.inv(A) print("\nA 的逆矩阵 (A_inv):") print(A_inv) except np.linalg.LinAlgError as e: print(f"\n无法计算逆矩阵: {e}") 执行这段代码将输出原始矩阵 $A$ 及其计算出的逆矩阵 $A_{inv}$。验证逆矩阵矩阵逆 $A^{-1}$ 的一个规定性质是,当它与原始矩阵 $A$ 相乘时,会得到单位矩阵 $I$。即:$$ A A^{-1} = A^{-1} A = I $$我们可以使用NumPy的矩阵乘法功能来验证这一点。请记住,@ 运算符执行矩阵乘法(或者您可以使用 np.dot()):# 验证 A * A_inv identity_check_1 = A @ A_inv print("\n验证 (A @ A_inv):") print(identity_check_1) # 验证 A_inv * A identity_check_2 = A_inv @ A print("\n验证 (A_inv @ A):") print(identity_check_2) # 创建预期中的单位矩阵 I = np.identity(A.shape[0]) # A.shape[0] 给出行数(此处为 2) print("\n单位矩阵 I:") print(I)您应该会看到 identity_check_1 和 identity_check_2 都产生一个与 2x2 单位矩阵非常接近的矩阵:$$ I = \begin{pmatrix} 1 & 0 \ 0 & 1 \end{pmatrix} $$关于浮点精度的一点说明您可能会注意到,结果矩阵并非完全是单位矩阵。代替完美的零,您可能会看到非常小的数字,例如 2.22044605e-16(即 $2.22 \times 10^{-16}$)。这是计算机处理非整数计算(称为浮点运算)的正常结果。这些微小的差异通常可以忽略不计。如果您需要以编程方式检查两个矩阵是否在一定容差范围内相等,NumPy 提供了 np.allclose() 函数:# 检查 A @ A_inv 是否接近单位矩阵 I are_close = np.allclose(A @ A_inv, np.identity(A.shape[0])) print(f"\nA @ A_inv 在数值上是否接近 I? {are_close}") # 输出应为 True不可逆矩阵怎么办?如果我们尝试计算一个没有逆矩阵(即奇异矩阵)的矩阵的逆,会发生什么?让我们尝试一个矩阵,其中一列是另一列的倍数,从而使其成为奇异矩阵:$$ B = \begin{pmatrix} 1 & 2 \ 2 & 4 \end{pmatrix} $$# 定义一个奇异矩阵 B B = np.array([[1, 2], [2, 4]]) print("\n矩阵 B (奇异):") print(B) # 尝试计算 B 的逆矩阵 try: B_inv = np.linalg.inv(B) print("\nB 的逆矩阵:") print(B_inv) except np.linalg.LinAlgError as e: print(f"\n无法计算 B 的逆矩阵: {e}") 当您运行这段代码时,NumPy 将检测到该矩阵是奇异矩阵,并引发 LinAlgError: Singular matrix 错误。这是NumPy告诉您给定矩阵 B 没有逆矩阵的方式。这种行为正确对应了“可逆条件”部分中讨论的数学性质。计算逆矩阵是一项基本操作,np.linalg.inv() 提供了一种直接的方法来完成它。然而,请记住,对于求解方程组 $Ax=b$,直接使用逆矩阵($x = A^{-1}b$)有时在数值上不如使用专门的求解器稳定和高效,我们将在下一节中讨论这些求解器。