Матрицы в 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.
- Путать
MatrixSymPy и массив NumPy. Это разные типы; перемешивать их нельзя без явного преобразования. - Ждать численной скорости. SymPy-матрицы для точности, а не для быстрых массовых расчётов.
Итог
- SymPy
Matrixдаёт точные определитель, обратную и собственные значения. - Главное преимущество — матрицы с символами (параметрами), где SciPy бессилен.
- Цена точности — скорость: большие матрицы решают численно в SciPy.
- Собственные значения ≥5×5 упираются в неразрешимость в радикалах (как уравнения степени ≥5).