来自字符串的矩阵表达式
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)])
不会。
如果我将 w1
或 w2
更改为 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" 和 simpify
将 X1
解释为符号的语句。
很难说在其他情况下如何表现。 docs 中有注释警告:
Sometimes autosimplification during sympification results in
expressions that are very different in structure than what was
entered.
上下文:我正在进行大量模拟,需要我实现不同的哈密顿量。这些哈密顿量只是矩阵,由一些常见元素的克罗内克积构建而成,还有一些我必须根据系统参数计算的预因子。例如,使用 ⊗ 表示 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
.
我在这里做错了什么?这是我第一次使用 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" 和 simpify
将 X1
解释为符号的语句。
很难说在其他情况下如何表现。 docs 中有注释警告:
Sometimes autosimplification during sympification results in expressions that are very different in structure than what was entered.