Sherman-Morrison公式详解

发布时间:2023-05-19

一、Sherman-Morrison公式推导

Sherman-Morrison公式是由Sherman和Morrison在1950年提出的一种用于求解线性方程组描述的方法,可用于增量计算矩阵的逆。Sherman-Morrison公式的推导过程如下: 假设矩阵A是一个n阶方阵,而B是一个n列向量,那么我们可以写出下列的线性方程

Ax = B 

现在,我们希望求解一个新的线性方程,其中我们将增加一个列向量u

Ax' = B'

注意到该方程与原始方程仅有在右侧增加了一个向量B - B' = u的区别。使用伴随矩阵,我们可以将这些方程的解表示成如下形式

x = A⁻¹B

x' = (A + uv^T)⁻¹ (B + uα)

其中, α = -v^T A⁻¹ u / (1+v^T A⁻¹ u) 现在我们来推导Sherman-Morrison公式。将两个解表示为:

x' = A⁻¹B - (A⁻¹uv^T A⁻¹)/(1 + v^T A⁻¹ u) * A⁻¹B

因此,

x' = (A⁻¹ - (A⁻¹uv^T A⁻¹)/(1 + v^T A⁻¹ u))B

注意到,我们已经得到了通过增加列向量(u)来计算线性方程组解的方法。

二、Sherman-Morrison公式有什么用

Sherman-Morrison公式可用于在计算机科学领域中,特别是在网络、通信和信号处理中。该公式可以用于增量计算矩阵的逆,从而节省存储空间和计算时间。例如,当需要计算一个大型矩阵的逆时,该公式可用于对矩阵逐步添加向量,从而逐步计算矩阵的逆。

三、Sherman-Morrison公式证明

证明1:使用特殊情况证明

当我们使用向量u = e_i时,其中e_i是i位置上为1,其余位置上为0的列向量时, uA⁻¹ = A⁻¹e_i。我们可以将向量A⁻¹e_i表示为第i列及仅有的非零列。我们将v设置为第j列,同时α设置为-A⁻¹[j][i] / A⁻¹[i][i]。将这些变量代入公式,我们得到

(x')_i = (A⁻¹[i][i] B_i - A⁻¹[i][j] B_j) / (1 - A⁻¹[j][i] / A⁻¹[i][i])

现在我们来证明,将x'代入原始方程Ax' = B'中,我们可以得到B',即

(A⁻¹ - A⁻¹ e_i [j][i] A⁻¹ / A⁻¹ [i][i]) B  = B′.

如果我们将矩阵A的第i行和第j行交换,则新的矩阵是A'。同时,我们假设x''是Ax''=B''的解,其中B''是通过增加一个列向量e_j得到的新向量。用x'插入原方程并将i和j交换,我们得到

x'' = A⁻¹B'' = (A + e_j v^T A)⁻¹ (B + e_j)

我们可以采用相同的方法来计算出x'和x''的不同之处,从而证明Sherman-Morrison公式的正确性。

证明2:使用矩阵分块证明

假设我们有一个矩形矩阵M和一个向量c,让我们考虑将一个单位向量d添加到该矩阵中的效果,即:

(M + dc^T)x = b

其中,x是一个长度为n的向量,相应地,M是一个n×n的矩阵,c和d也是n维的向量,b是任意n维向量。该方程可以推导出如下的线性回归方程

x - (dc^Tx) / (1 + c^Tx)d = (M + dc^T)⁻¹b

所以,Sherman-Morrison公式是可行的,并且推导得到的结果与使用矩阵分块证明的结果是相同的。因此,Sherman-Morrison公式是完整和可靠的。

四、Sherman-Morrison公式代码示例

我们可以使用以下代码来计算Sherman-Morrison公式:

import numpy as np
def sherman_morrison(A, u, v):
    # Compute the inverse of A:
    A_inv = np.linalg.inv(A)
    # Compute alpha:
    alpha = -1 * (np.dot(np.dot(A_inv, u), v)) / (1 + np.dot(v, np.dot(A_inv, u))) 
    # Compute the Sherman-Morrison inverse:
    A_inv_sm = A_inv - (np.dot(np.dot(np.dot(A_inv, u), np.transpose(v)), A_inv)) / (1 + np.dot(v, np.dot(A_inv, u)))
    return A_inv_sm
# Sample usage:
A = np.array([[1, 2, 3], [4, 5,6], [7, 8, 9]])
u = np.array([1,1,1])
v = np.array([1,0,1])
A_inv_sm = sherman_morrison(A, u, v)
print(A_inv_sm)

该示例用于计算一个3×3矩阵的Sherman-Morrison逆。输出将是一个3×3的矩阵。

五、结论

在本文中,我们对Sherman-Morrison公式进行了详细的阐述。我们探讨了解释Sherman-Morrison公式以及如何使用它来计算矩阵的逆的方法。此外,我们还提供了两种不同的证明方法和实际的Python代码示例,以便于读者更好地理解和应用Sherman-Morrison公式。