Sympy复杂矩阵求逆/运算

时间:2013-10-21 23:46:53

标签: python matrix complex-numbers sympy

使用来自Continuum Anaconda发行版的Sympy 0.7.2,(懒得构建我自己的堆栈,不讨厌),在进行复杂矩阵代数时我一直遇到这个问题,其中一些原生函数取代了典型的'1j',带有'I'。这很烦人,因为它不能很好地与其他算术运算一起使用,并且基本上保持其形式并增加因子而不是计算浓缩结果。我将给出一个例子:

>>> T
[          1, 1.0 - 1.0*I]
[1.0 + 1.0*I,           0]
>>> T.inv()
[-(0.5 + 0.5*I)*(1.0 - 1.0*I) + 1, 0.5 - 0.5*I]
[                     0.5 + 0.5*I,        -0.5]
>>> T.inv()*T
[-(0.5 + 0.5*I)*(1.0 - 1.0*I) + 1 + (0.5 - 0.5*I)*(1.0 + 1.0*I), (1.0 - 1.0*I)*(
-(0.5 + 0.5*I)*(1.0 - 1.0*I) + 1)]
[                                                             0,
      (0.5 + 0.5*I)*(1.0 - 1.0*I)]
由于T.inv()* T肯定是 1 ,(单位矩阵,而不是数字)而不是那里的混乱,(格式也令人恶心......)无论什么原因)。如果我手动将“I”替换为“1j”,我会像你一样得到 1 。上面的结果没有错,(它可以用于 1 ),但你可以想象,对于更复杂的问题,不是“让我们找到单位矩阵”,这可以非常快速地变得非常粗糙

我想知道有一个比我现在更好的解决方案,即将矩阵转换为字符串,并手动将'I'替换为'1j'....

#If A is a complex matrix, Let AI be its inverse.
A_STR = string(A).replace("I", "1j").replace("\n", "")
exec("AI=Matrix("+str(A.shape()).replace("(", "").replace(")", "")+"," + A_STR + ")")

谢谢

1 个答案:

答案 0 :(得分:1)

首先,您应该更新到SymPy 0.7.3(conda update sympy)。

您需要做的就是扩展一切。只需致电(T.inv()*T).expand()即可。目前,SymPy没有与I对应的j浮点变体,因此您通常必须手动扩展复数(SymPy不会自动进行扩展,因为有些人想要留下东西但是,考虑到公平,它可能应该在矩阵中自动进行简化,但这仍然是一项正在进行的工作)。