如何在SymPy中简化矩阵表达式?

14

考虑以下示例

import sympy as sy
n = sy.symbols('n')
A = sy.MatrixSymbol("A",n,n)
B = sy.MatrixSymbol("B",n,n)
C = sy.MatrixSymbol("C",n,n)
M = A.inverse()*B.inverse() - A.inverse()*C*B.inverse()
B.inverse()*M.inverse()*A.inverse()

这个例子打印出B^-1*(A^-1*B^-1 - A^-1*C*B^-1)^-1*A^-1

SymPy能简化表达式为(I-C)^-1吗?如果不能,那中间结果是否可行,例如在M中收集常见因素?


我不确定是否有一种方法可以做到这一点。我在 https://github.com/sympy/sympy/issues/15120 上提出了一个问题。此外,我认为答案应该是 (I - C)^-1,对吗? - asmeurer
@asmeurer :没错。我已经进行了编辑;也许这表明该功能会很有用。 - sarasvati119
1个回答

1
解决方法是在表达式上使用字符串转换:
from sympy import *

n = symbols('n')
A = MatrixSymbol("A",n,n)
B = MatrixSymbol("B",n,n)
C = MatrixSymbol("C",n,n)
M = A.inverse()*B.inverse() - A.inverse()*C*B.inverse()
expression = B.inverse()*M.inverse()*A.inverse()

# convert expression to string then simplify
simplify_expression = simplify(str(expression))

pprint(simplify_expression)

输出:

 -1  
─────
C - 1

这很不错。然而,我怀疑SymPy只是在这里进行标量转换:如果我们像定义A、B、C一样定义K和L,并定义A.inverse()*C*K*B.inverse() - A.inverse()*L*C*B.inverse(),结果应该是(CK-LC)^-1,但我得到了(C*(K-L))^-1,即存在标量简化。如果有一种确保字符串转换遵守矩阵代数的方法,那么这就是一个解决方案。 - sarasvati119

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接