2

使用来自 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,(单位矩阵,而不是数字)而不是那里的混乱,(而且格式也很恶心......无论出于何种原因)。如果我用“1j”手动替换“I”,我会得到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 + ")")

谢谢

4

1 回答 1

1

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

您需要做的就是扩展所有内容。只要打电话(T.inv()*T).expand()。目前,SymPy 没有I对应于的浮点变体j,因此您通常必须手动扩展复数(SymPy 不会自动进行扩展,因为有些人想保留因素,但公平地说,它可能应该在矩阵中自动进行简化,但这仍然是一项正在进行的工作)。

于 2013-10-23T00:25:02.200 回答