2016-05-25 6 views
2

コンテキスト:私はさまざまなハミルトニアンを実装するために必要なシミュレーションを行っています。これらのハミルトニアンは、いくつかの一般的な要素のクロネッカー製品から構築された行列であり、システムパラメータに基づいて計算しなければならないいくつかの前触れです。例えば、クロネッカー積ため⊗使用文字列からの行列式

のH = W1が(A、B、C)* SIGMAX⊗Iは(X、Y、Z)W2を+ *私は作ることができる期待していた

sigmay⊗ a、b、c、x、y、zの値とハミルトニアンの式を読み取ることができ、必要な行列を構成する単純なパーサーです。 Sympyは明らかな候補のようですが、文字列を使って構築する行列式を得ることはできません。

from sympy import symbols,Matrix,MatrixSymbol 
from sympy.physics import msigma 
from sympy.physics.quantum import TensorProduct 
w1,w2 = symbols('w1 w2') 
X1 = MatrixSymbol('X1',4,4) 
X2 = MatrixSymbol('X2',4,4) 
x = msigma(1) 
x_1 = TensorProduct(eye(2),x) 
x_2 = TensorProduct(x,eye(2)) 
exp = w1*X1 + w2*X2 
exp.subs([(w1,0.5),(w2,2),(X1,x_1),(X2,x_2)]).as_explicit() 

となります。しかし、

exp = MatrixExpr('w1*X1+w2*X2') 

または

exp = MatrixExpr(sympify('w1*X1+w2*X2')) 

あるいは

exp = sympify('w1*X1 + w2*X2') 
exp.subs([(w1,0.5),(w2,2),(X1,x_1),(X2,x_2)]) 

をしようとすることはしません。 w1またはw2MatrixSymbolの1x1インスタンスに変更すると、この機能も無効になります。

私はここで間違っていますか?これはsympyを初めて使用したので、私は何かが欠落している可能性が非常に高いことは明らかです。

+0

「MatrixExp」という名前のメソッドまたはクラスはありません。クラス 'MatrixExpr'が存在しますが、それはMatrix ExpressのSuperClassです。 –

+0

申し訳ありませんが、MatrixExprは私が正確に意味していたものです – Padraic

+0

だから、言及したように、 'MatrixExpr'はマトリックスクラスのスーパークラスです。それは単に抽象行列を表します。あなたはそれを使うべきではありません。 –

答えて

1

はのは、単純なケースで何が起こっているか見てみましょう:simpify doesn'yはX1が行列であることを理解のよう

exp = sympify('w1*X1'); right_exp = w1*X1 

type(exp), type(right_exp) 
Out[47]: (sympy.core.mul.Mul, sympy.matrices.expressions.matmul.MatMul) 

が見えます。我々はそれが明示的に言及するのであれば、すべてがオールライトになります。

exp = sympify("w1*MatrixSymbol('X1',4,4)") 

exp.subs([(w1,0.5),(X1,x_1)]).as_explicit() 
Out[49]: 
Matrix([ 
[ 0, 0.5, 0, 0], 
[0.5, 0, 0, 0], 
[ 0, 0, 0, 0.5], 
[ 0, 0, 0.5, 0]]) 

right_exp.subs([(w1,0.5),(X1,x_1)]).as_explicit() 
Out[50]: 
Matrix([ 
[ 0, 0.5, 0, 0], 
[0.5, 0, 0, 0], 
[ 0, 0, 0, 0.5], 
[ 0, 0, 0.5, 0]]) 

そして、最後の文:

exp = sympify("w1*MatrixSymbol('X1',4,4)+w2*MatrixSymbol('X2',4,4)") 

exp.subs([(w1,0.5),(w2,2),(X1,x_1),(X2,x_2)]).as_explicit() 
Out[63]: 
Matrix([ 
[ 0, 0.5, 2, 0], 
[0.5, 0, 0, 2], 
[ 2, 0, 0, 0.5], 
[ 0, 2, 0.5, 0]]) 

何が起こっていますか? Basics of expressions in SymPyを読むと、「行列はシンプレッサブルではありません」という文があり、simpifyX1をシンボルとして解釈します。 別の状況でどのように行動するかを言うのは難しいです。

は時々 を入力したものよりも構造が非常に異なっている 式でsympification結果中にautosimplification:警告docsでノートがあります。