使用 Continuum Anaconda 发行版中的 Sympy 0.7.2,(我太懒了,无法构建自己的堆栈,不要讨厌),我在做复杂矩阵代数时一直遇到这个问题,其中一些 native 函数取代了典型的'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 + ")")
谢谢
请您参考如下方法:
首先,您应该更新到 SymPy 0.7.3 (conda update sympy)。
您需要做的就是扩展一切。只需调用 (T.inv()*T).expand()。目前,SymPy 没有对应于 j 的 I 的浮点变体,因此您通常必须手动展开复数(SymPy 不会自动展开,因为有些人想把事情留在因素中,但公平地说,它可能应该在矩阵中自动进行简化,但这仍在进行中)。
