2013-10-21 146 views
2

使用Sympy 0.7.2从Continuum Anaconda发行版(太懒得建立我自己的堆栈,不讨厌),我在做复杂矩阵代数时遇到这个问题,其中一些本地函数用'I'代替了典型的'1j',这很烦人,因为它不能很好地与其他的算术运算一起使用,并且基本上保持了它的形式并且增加了因子而不是计算简明的结果。例如:Sympy复杂矩阵求逆/操作

>>> 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是绝对,(单位矩阵,数量不限),而不是那些乱七八糟那里,清楚地延迟(也格式是disgusti因为任何原因)。如果我手动将“I”替换为“1j”,我会像您一样获得。上面的结果并没有错,(它可以用于),但是你可以想象,对于更复杂的问题,如果不是“让我们找到单位矩阵”,那么这个问题可能非常快速地变得非常严重。

我不知道有一个比我现在有,这是对矩阵转换为字符串,并取代“我”与“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

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

所有你需要做的就是扩大一切。只需拨打(T.inv()*T).expand()即可。目前,SymPy没有与j相对应的I的浮点变体,因此您通常必须手动扩展复数(SymPy不会自动扩展,因为有些人想将事情因素考虑在内,但公平起见,它可能应该在矩阵中自动进行简化,但这仍然是一个工作进程)。

+0

太棒了,谢谢。 –