我正在尝试使用sympy计算一些带矩阵的符号表达式。对于矩阵来说,sympy函数subs的行为很奇怪。我需要的是用符号表达式取字符串,用一些特定的矩阵代替这个表达式中的符号并计算结果。
对于标量,sympy.subs完成了这项工作:
import sympy as sp
sp.sympify("x1*x2**2").subs({"x1":5,"x2":10})
按预期给出500。
如果使用标量,我使用像
这样的矩阵sp.sympify("x1*x2**2").subs({"x1":sp.Matrix([[0,1],[1,0]]),"x2":sp.Matrix([[1,0],[0,1]])}
结果是AttributeError: 'MatPow' object has no attribute 'as_base_exp'
。只要
aa,bb = sp.Matrix([[0,1],[1,0]]), sp.Matrix([[1,0],[0,1]])
aa*bb**2
按预期工作。
在同意中进行此类计算的正确方法是什么?
答案 0 :(得分:3)
sympify
会将x1
和x2
转换为符号,但要实现这一点,他们需要成为MatrixSymbols,例如
x1 = MatrixSymbol('x1', 2, 2)
x2 = MatrixSymbol('x2', 2, 2)
(x1*x2**2).subs({x1: Matrix([[0,1],[1,0]]), x2: Matrix([[1,0],[0,1]])})
默认情况下,这是未评估的,但您可以使用.doit
对其进行评估,例如
(x1*x2**2).subs({x1: Matrix([[0,1],[1,0]]), x2: Matrix([[1,0],[0,1]])}).doit()