将Sympy矩阵替换为多项式

时间:2015-09-07 20:57:11

标签: python matrix sympy polynomials

我有一个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.

有没有办法获得我想要的东西?

修改 我试图将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

但我仍然在寻找更有效的内置选项。

3 个答案:

答案 0 :(得分:1)

矩阵表达式仍然有点儿麻烦,希望它们将来会被修复。

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

let filename = suppDir.stringByAppendingPathComponent("some_file.dat")
try test.writeToFile(filename, atomically: false, encoding: NSUTF8StringEncoding)

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

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

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

答案 1 :(得分:0)

尝试评估多项式的​​每个项。

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

这将评估你的表达。

答案 2 :(得分:0)

要在P处评估A,可以将x替换为Matrix,然后乘以eye(2)来转换常数项:

P_ = Poly(P, x)
(P_ - P_.coeff_monomial(1)).as_expr().subs(x, A) * eye(2) + P_.coeff_monomial(1) * eye(2) # P(A)

即使eye(2)只是一个常数,即P,第一个乘以P_ - P_.coeff_monomial(1) == 0的乘积也确保和中的第一项是一个矩阵。