来自字符串的矩阵表达式

2024-09-29 19:27:46 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文:我正在做一堆模拟,需要我实现不同的哈密顿量。这些哈密顿量只是矩阵,由一些常见元素的Kronecker积构成,还有一些我必须根据系统参数计算的前置因子。E、 g,在Kronecker产品中使用⊗

H=w1(a,b,c)*sigmax⊗I+w2(x,y,z)*I⊗sigmay

我希望我能做一个简单的解析器,能读入a,b,c,x,y,z的值和哈密顿量的表达式,并构造必要的矩阵。sypy似乎是一个很明显的候选对象,但我无法使用字符串获得一个矩阵表达式。在

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()

会有用的。但是,试着

^{pr2}$

或者

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,所以我很清楚我可能遗漏了一些东西。在


Tags: fromimport表达式矩阵w1x1x2symbols
1条回答
网友
1楼 · 发布于 2024-09-29 19:27:46

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

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是一个矩阵。所以,如果我们明确地提出来,一切都会好起来的:

^{pr2}$

最后陈述:

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中有警告:

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

相关问题 更多 >

    热门问题