</>
Тема 5 из 5

Матрицы

В 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() — словарь «собственное значение → кратность».