2013-10-21 145 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

太棒了,謝謝。 –