背景:我正在进行一系列模拟,要求我实施不同的汉密尔顿主义者。这些哈密顿量只是矩阵,由一些常见元素的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)])
赢得'吨。
如果我将w1
或w2
更改为MatrixSymbol
的1x1个实例,它也无法工作。
我在这里做错了什么?这是我第一次使用sympy,所以我非常清楚我可能会遗漏一些东西。
答案 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,您可以找到声明"矩阵不可同意"并simpify
将X1
解释为符号。
很难说在另一种情况下如何表现。 docs中有注释警告:
有时在同意期间自动简化会导致 结构与结果非常不同的表达式 输入