用零值块简化块矩阵?
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)
?
在我最近的项目中,我想解决符号线性代数问题。我要解的方程是
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)
?