Заставить символы SymPy не коммутировать с матрицами - PullRequest
0 голосов
/ 10 января 2019

Я использую SymPy для решения линейной системы уравнений матриц. Тем не менее, я не использую объект MatrixSymbol SymPy, потому что он, кажется, не очень хорошо работает с solve_linear_system. Поэтому вместо этого я просто использую нормальные символы с commutative=False, что, кажется, работает нормально.

Однако, когда я пытаюсь окончательно подставить в матрицы для оценки решения, я сталкиваюсь с проблемой, что некоммутативным символам SymPy по-прежнему разрешено коммутировать с матрицами SymPy . Например:

import sympy as sy

A, B = sy.symbols('A, B', commutative=False)
expr = A*B

print(expr.subs(A, sy.eye(2)))
print(expr.subs(B, sy.eye(2)))

1010 * дает *

Matrix([
[1, 0],
[0, 1]])*B
Matrix([
[1, 0],
[0, 1]])*A

Это приводит к неправильному порядку умножения матриц при подстановке в несколько значений:

X = sy.Matrix([[1,1],[0,0]])
Y = sy.Matrix([[0,1],[0,1]])

print(expr.subs({A: X, B: Y}))
print(X*Y)

дает

Matrix([[0, 0], [0, 0]])
Matrix([[0, 2], [0, 0]])

Есть ли какой-нибудь способ избежать переключения символов с матрицами в процессе замены? Использование simultaneous=True для вызова subs не помогает.

1 Ответ

0 голосов
/ 10 января 2019

Кажется, что все символы должны быть некоммутативными, чтобы SymPy соблюдала некоммутативность. Поэтому, если я определю один коммутативный символ и один некоммутативный символ, то SymPy будет предполагать, что они коммутируют:

In [15]: A = Symbol('A', commutative=False)                                                                                                                   

In [16]: B = Symbol('B', commutative=True)                                                                                                                    

In [17]: A*B                                                                                                                                                  
Out[17]: B⋅A

In [18]: A*B - B*A                                                                                                                                            
Out[18]: 0

Полагаю, это означает, что когда вы заменяете коммутативную матрицу идентичности, SmyPy с удовольствием переупорядочивает факторы:

In [3]: ask(Q.commutative(eye(2)))                                                                                                                            
Out[3]: True

В общем, я не уверен, насколько хорошо работает некоммутативность в SymPy, но я бы подумал, что вам будет лучше с MatrixSymbol. Может быть, проще сделать эту работу с solve_linear_system, чем исправить эти проблемы ...

...