2015-09-07 2 views
2

У меня есть матрица 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 

Но я все еще ищу более эффективный встроенный вариант.

ответ

1

Матричные выражения по-прежнему немного ошибочны, надеюсь, они будут исправлены в будущем.

Во всяком случае, вот альтернативный способ выполнить замену:

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).

Я действительно надеюсь, что кто-то в конечном итоге исправит все эти проблемы.

+0

Интересная альтернатива. Ошибка 'doit()' была исправлена ​​в 0.7.7.dev. – Adrien

0

Попробуйте оценить каждый член многочлена.

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

Это оценит ваше выражение.

+0

Ну, если бы я должен был подставлять термины один за другим вручную, я бы с самого начала напечатал 'A ** 2 - 3 * A + 5 * eye (2)'. – Adrien

+0

будет искать лучшее решение. – rresol

Смежные вопросы