字符串

时间:2016-05-25 15:47:48

标签: python matrix simulation sympy

背景:我正在进行一系列模拟,要求我实施不同的汉密尔顿主义者。这些哈密顿量只是矩阵,由一些常见元素的Kronecker积构建而成,我必须根据系统参数计算一些前因子。例如,使用⊗作为Kronecker产品

H = w1(a,b,c)*sigmax⊗I+ w2(x,y,z)*I⊗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)])

赢得'吨。 如果我将w1w2更改为MatrixSymbol的1x1个实例,它也无法工作。

我在这里做错了什么?这是我第一次使用sympy,所以我非常清楚我可能会遗漏一些东西。

1 个答案:

答案 0 :(得分:1)

让我们看看更简单的情况:

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

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

simpify看起来并不了解X1是一个矩阵。所以,如果我们明确提到它,一切都会好起来的:

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解释为符号。 很难说在另一种情况下如何表现。 docs中有注释警告:

  

有时在同意期间自动简化会导致   结构与结果非常不同的表达式   输入