Матрицы в SymPy: точная линейная алгебра

В разделе про SciPy матрицы давали приближённые числа. SymPy работает с матрицами точно — определитель, обратная, собственные значения в радикалах.

Матрица в SymPy (Matrix) — матрица, элементы которой могут быть символами или точными числами, а все операции возвращают точные результаты.

Зачем символьные матрицы

Численная линейная алгебра (SciPy) незаменима для больших задач, но даёт приближения и не умеет работать «в буквах». SymPy позволяет: вывести формулу обратной матрицы через параметры, получить определитель как точное выражение, найти собственные значения в виде радикалов. Это нужно в теории управления, символьном выводе формул, проверке выкладок и обучении.

Точный определитель «руками»

Для матрицы 2×2 определитель прост: ad − bc. Реализуем рекурсивный определитель по разложению Лапласа на чистом Python — он точен для целых матриц:

def det(m):
    n = len(m)
    if n == 1:
        return m[0][0]
    if n == 2:
        return m[0][0]*m[1][1] - m[0][1]*m[1][0]
    total = 0
    for col in range(n):
        # минор: убираем первую строку и столбец col
        minor = [[m[i][j] for j in range(n) if j != col]
                 for i in range(1, n)]
        sign = (-1) ** col
        total += sign * m[0][col] * det(minor)
    return total

A = [[2, 1, 0],
     [1, 3, 1],
     [0, 1, 2]]
print("Определитель:", det(A))

Вывод:

Определитель: 8

Заметьте: ответ — точное целое 8, без всякого 8.0000001. Для целочисленной матрицы это важно: численный SciPy мог бы вернуть 7.999999999999998 из-за округлений.

Матрицы в SymPy

import sympy as sp

A = sp.Matrix([[2, 1, 0],
               [1, 3, 1],
               [0, 1, 2]])

print(A.det())           # 8 — точно
print(A.inv())           # точная обратная матрица (дроби, не float)
print(A.eigenvals())     # собственные значения в виде радикалов

# матрица с символами:
a, b = sp.symbols("a b")
M = sp.Matrix([[a, b], [b, a]])
print(M.det())           # a**2 - b**2 — формула!
print(M.eigenvals())     # {a - b: 1, a + b: 1} — точные собств. значения

Последние строки — настоящая мощь: SymPy выдаёт собственные значения матрицы в буквах, через параметры a и b. Численный SciPy так не умеет — ему нужны конкретные числа.

Символьное против численного: таблица

ОперацияSymPy (точно)SciPy (численно)
Определитель8 (или формула)7.999999999999998
Обратнаяточные дробиfloat-приближение
Собств. значениярадикалы / формулычисла (быстро)
Размер задачималенькие (символьно дорого)огромные (тысячи×тысячи)

Как работает под капотом

SymPy считает определитель и обратную точными методами (разложение Лапласа, метод Барейса с точными дробями), не теряя ни бита. Собственные значения он находит как корни характеристического многочлена det(A − λE) = 0 — и тут вступает в силу то же ограничение, что и для уравнений: для матриц размера ≥5 характеристический многочлен имеет степень ≥5 и его корни могут не выражаться в радикалах. Поэтому символьные собственные значения практичны для маленьких матриц; большие — удел численного SciPy. Зато SymPy незаменим, когда в матрице есть параметры (символы), а не только числа.

Частые ошибки

  • Большие символьные матрицы. Символьное обращение матрицы 10×10 может «зависнуть» — сложность растёт катастрофически. Для размера используйте SciPy.
  • Путать Matrix SymPy и массив NumPy. Это разные типы; перемешивать их нельзя без явного преобразования.
  • Ждать численной скорости. SymPy-матрицы для точности, а не для быстрых массовых расчётов.

Итог

  • SymPy Matrix даёт точные определитель, обратную и собственные значения.
  • Главное преимущество — матрицы с символами (параметрами), где SciPy бессилен.
  • Цена точности — скорость: большие матрицы решают численно в SciPy.
  • Собственные значения ≥5×5 упираются в неразрешимость в радикалах (как уравнения степени ≥5).
Проверьте себя
1. В чём главное преимущество символьных матриц SymPy перед численными SciPy?
AОни быстрее
BОни работают точно и умеют матрицы с символами (параметрами), выдавая определитель/собств. значения в виде формул
CОни занимают меньше памяти
DОни поддерживают большие размеры
2. Почему символьные собственные значения практичны лишь для маленьких матриц?
AЭто ограничение памяти
BОни — корни характеристического многочлена; для матриц ≥5×5 его степень ≥5 и корни могут не выражаться в радикалах, плюс символьные вычисления катастрофически дорожают
CSymPy не умеет матрицы больше 4×4
DБольшие матрицы не имеют собственных значений
3. Почему численный определитель целочисленной матрицы может выйти 7.999999999999998?
AОшибка SciPy
BЧисленные методы работают в float и накапливают ошибки округления, тогда как SymPy считает точно
CМатрица была неправильной
DТак и должно быть всегда