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(数値ではなく単位行列)であり、それほど混乱していないため、これは明らかに遅れています(また、何らかの理由でフォーマットが嫌です)。「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 + ")")

ありがとう

4

1 に答える 1

1

まず、SymPy 0.7.3 ( conda update sympy) に更新する必要があります。

あなたがする必要があるのは、すべてを拡張することだけです。電話するだけ(T.inv()*T).expand()です。I現在、SymPy には に対応するの浮動小数点バリアントがないjため、通常は手動で複素数を展開する必要があります (SymPy は自動的に展開を行いません。因数分解したままにしておく人もいますが、公平を期すために、おそらく行列で自動的に単純化を行う必要がありますが、それはまだ進行中です)。

于 2013-10-23T00:25:02.200 に答える