У меня есть матрица Sympy A и полиномиальное выражение P, и я хотел бы вычислить P (A).Замените матрицу Sympy на полином
Вот пример:
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
Но я все еще ищу более эффективный встроенный вариант.
Интересная альтернатива. Ошибка 'doit()' была исправлена в 0.7.7.dev. – Adrien