【问题标题】:Matrix Expression from String来自字符串的矩阵表达式
【发布时间】:2016-05-25 15:47:47
【问题描述】:

上下文:我正在做一堆模拟,需要我实现不同的哈密顿量。这些哈密顿量只是矩阵,由一些常见元素的 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,所以我很清楚我可能只是遗漏了一些东西。

【问题讨论】:

  • 在 Sympy 中没有名为 MatrixExp 的方法或类。存在类MatrixExpr,但它是矩阵表达式的超类。
  • 对不起,MatrixExpr 正是我的意思
  • 所以,如前所述,MatrixExpr 是矩阵类的超类。它只表示抽象矩阵。你不应该使用它。
  • 好的,我将编辑问题以反映这一点;仅对表达式字符串使用 sympify 调用的结果也不能达到我想要或期望的效果
  • 好的,你的第一个代码块给出了一个对称矩阵。它给出了正确的结果吗?

标签: python matrix simulation sympy


【解决方案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 中有注释警告:

有时在简化过程中的自动简化会导致 结构上与原来大不相同的表达方式 输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 2020-05-06
    • 2018-01-02
    • 2012-01-07
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多