Матрицы
В SymPy есть свой тип матриц — Matrix. В отличие от numpy, он считает точно: дроби остаются дробями, а в элементах могут быть даже символы.
Создание и доступ
from sympy import Matrix, Rational, eye, zeros, symbols
A = Matrix([[1, 2], [3, 4]])
print(A.shape) # (2, 2)
print(A[0, 1]) # 2 — строка 0, столбец 1
print(A.row(1)) # Matrix([[3, 4]])
print(A.col(0)) # Matrix([[1], [3]])
print(eye(3)) # единичная матрица 3 × 3
print(zeros(2, 3)) # нулевая 2 × 3
Как в списках, работают срезы: A[:2, :2] — левый верхний угол.
Элементы лучше задавать точными числами: Rational("2/3") или целыми. Если подать 0.5, дальше всё будет считаться приближённо.
Действия
B = Matrix([[0, 1], [1, 0]])
print(A + B)
print(A * B) # матричное произведение
print(A ** 2) # A * A
print(A.T) # транспонирование
print(3 * A)
Знак * между матрицами SymPy — матричное произведение (у numpy это поэлементное).
Определитель, обратная, ранг
print(A.det()) # -2
print(A.inv()) # Matrix([[-2, 1], [3/2, -1/2]])
print(A.rank()) # 2
Обратная существует, только если определитель не равен нулю; иначе inv() выдаёт ошибку. Поэтому сначала проверяют A.det() == 0.
rref() приводит матрицу к ступенчатому виду методом Гаусса и возвращает пару: ступенчатую матрицу и номера ведущих столбцов. Система A x = b решается методом A.LUsolve(b) или функцией linsolve.
Перебрать строки удобно так:
for i in range(A.rows):
print(*A.row(i)) # элементы строки через пробел
Собственные значения
Число λ — собственное значение матрицы A, если есть ненулевой вектор v с A v = λ v: матрица только растягивает этот вектор. Собственные значения — корни характеристического многочлена \det(A - λ E) = 0.
M = Matrix([[4, 1], [2, 3]])
print(M.charpoly().as_expr()) # lambda**2 - 7*lambda + 10
print(M.eigenvals()) # {5: 1, 2: 1}
print(M.eigenvects()) # значения, кратности и векторы
eigenvals() возвращает словарь «значение → кратность». Если корень характеристического многочлена двукратный, в словаре он один раз, а кратность равна 2.
Итог
Matrix([[...], [...]])— точная матрица;A[i, j],A.row(i), срезы;*— матричное произведение,A.T— транспонирование;det(),inv(),rank(),rref();eigenvals()— словарь «собственное значение → кратность».