用零值块简化块矩阵?

Simplifying a block matrix with zero-valued blocks?

在我最近的项目中,我想解决符号线性代数问题。我要解的方程是

S^{-1}*S^{-1}.T

其中S是下三角矩阵

S = [[a,0,0],[b,c,0],[d,e,f]]

我可以在 SymPy 中实现这个方程甚至求解它,但我不知道有什么方法可以告诉 Sympy Z 是一个零矩阵(因此所有带有 Z 的项都应该抵消) .我尝试用零矩阵替换符号 Z,但这只是天真地将零矩阵插入方程中而不取消任何项。

有没有一种方法可以定义 Z=0 并取消所有对应的项而不插入任何 A、B、C、D、E 和 F 的值?

# Import sympy
import sympy as sym

# Create some symbolic square matrices; 3-by-3 size not strictly necessary
A = sym.MatrixSymbol('A',3,3)
B = sym.MatrixSymbol('B',3,3)
C = sym.MatrixSymbol('C',3,3)
D = sym.MatrixSymbol('D',3,3)
E = sym.MatrixSymbol('E',3,3)
F = sym.MatrixSymbol('F',3,3)

# Create a dummy MatrixSymbol for a block of zeros
Z = sym.MatrixSymbol('Z',3,3)
# Z = sym.zeros(3,3) # Specifying a matrix of zeros does not cancel out

# Create a lower triangular BlockMatrix; the upper right entries are all zero
S   = sym.BlockMatrix([[A,Z,Z],[B,C,Z],[D,E,F]])

# Calculate the inverse of S
Sinv = S.inverse()

# Simplify the dot product between Sinv and Sinv.T
# This does NOT cancel terms with Z
rhs = sym.block_collapse(Sinv*Sinv.transpose())

我能想到的最好的:

借助数学的力量,如果我没有忘记所学的一切,那么 `S^{-1} S^{-T} = (S^T S)^{-1}

现在您可以手动将矩阵 S 符号化地块相乘,然后让 sympy 反转 that.

编辑:实际上,为什么不将 Z 替换为 ZeroMatrix(3,3)