来自字符串的矩阵表达式

Matrix Expression from String

上下文:我正在进行大量模拟,需要我实现不同的哈密顿量。这些哈密顿量只是矩阵,由一些常见元素的克罗内克积构建而成,还有一些我必须根据系统参数计算的预因子。例如,使用 ⊗ 表示 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,所以我很清楚我可能只是遗漏了一些东西。

让我们看看更简单的情况下发生了什么:

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,您会发现 "matrices aren’t sympifiable" 和 simpifyX1 解释为符号的语句。 很难说在其他情况下如何表现。 docs 中有注释警告:

Sometimes autosimplification during sympification results in expressions that are very different in structure than what was entered.