首页 文章

将Sympy矩阵替换为多项式

提问于
浏览
2

我有一个Sympy矩阵A和一个多项式表达式P,我想计算P(A) .

这是一个例子:

x = Symbol('x')
P = x**2 - 3*x + 5
A = Matrix([ [1,3], [-1,2] ])
P.subs(x, A)

我希望Sympy计算 A**2 - 3*A + 5*eye(2) (在这个例子中,结果是零矩阵) .

但是这失败并显示错误消息:

AttributeError: ImmutableMatrix has no attribute as_coeff_Mul.

有什么方法可以获得我想要的东西吗?

Edit: 我试图将 P 转换为Sympy的多项式类,然后替换,但结果是无用的:

Poly(P).subs(A)
Poly(Matrix([ [ 1, 3], [-1, 2]])**2 - 3*Matrix([ [ 1, 3],        
    [-1, 2]]) + 5, Matrix([ [ 1, 3], [-1, 2]]), domain='ZZ')

我可以使用以下函数获得正确的结果:

def poly_matrix(P, A):
    coeffs = Poly(P).all_coeffs()[::-1]
    res = zeros(A.rows)
    for i in range(len(coeffs)):
        res += coeffs[i]*(A**i)
    return res

但我仍在寻找更高效的内置选项 .

2 回答

  • 0

    矩阵表达式仍然有点错误,希望它们将来会被修复 .

    无论如何,这是执行替换的另一种方法:

    In [1]: x = MatrixSymbol('x', 2, 2)
    
    In [2]: P = x**2 - 3*x + 5*eye(2)
    
    In [3]: P
    Out[3]: 
                     2
    ⎡5  0⎤ + -3⋅x + x 
    ⎢    ⎥            
    ⎣0  5⎦            
    
    In [4]: A = Matrix([ [1,3], [-1,2] ])
    
    In [5]: P.subs(x, A)
    Out[5]: 
                                   2
    ⎡5  0⎤ + -3⋅⎡1   3⎤ + ⎛⎡1   3⎤⎞ 
    ⎢    ⎥      ⎢     ⎥   ⎜⎢     ⎥⎟ 
    ⎣0  5⎦      ⎣-1  2⎦   ⎝⎣-1  2⎦⎠ 
    
    In [6]: P.subs(x, A).doit()
    Out[6]: 
                       2
    ⎡2  -9⎤ + ⎛⎡1   3⎤⎞ 
    ⎢     ⎥   ⎜⎢     ⎥⎟ 
    ⎣3  -1⎦   ⎝⎣-1  2⎦⎠
    

    这里似乎MatPow无法执行.doit()操作 . 这可能是另一个错误 .

    在输出编号5中,打印机也存在错误(-3应该是-3) .

    我真的希望有人能最终解决所有这些问题 .

  • 1

    尝试评估多项式的每个项 .

    (x**2).subs(x,A) - (3*x).subs(x,A) + 5*(eye(2))
    

    这将评估你的表达 .

相关问题