Матричные исчисления в SymPy
Ранее мы разобрали инструменты, которые нужны для анализа функций в Python: производные, интегралы и простые дифференциальные уравнения. Теперь перейдём к ещё одному базовому объекту высшей математики, который особенно важен в линейной алгебре и практически во всех прикладных задачах — к матрицам.
И программирование, и прикладная математика регулярно сталкиваются с необходимостью хранить и обрабатывать большие наборы чисел. Когда данные неупорядочены, работать с ними сложно: “хаос порождает хаос”. Один из главных способов организовать числовые данные и одновременно получить удобный математический инструмент — это матрицы.
Главная мысль урока: матрица — это не просто «таблица чисел». Это математический объект, для которого определены специальные операции (сложение, умножение, транспонирование, приведение к ступенчатому виду и т.д.), а эти операции лежат в основе решения систем уравнений, вычисления характеристик (след, определитель) и многих прикладных алгоритмов.
Содержание
- 1. Цели урока
- 2. Что такое матрица и чем она отличается от «просто списка»
- 3. Виды матриц
- 4. Операции с матрицами: сложение, умножение на число, вычитание
- 5. Произведение матриц и транспонирование
- 6. Ступенчатый вид и элементарные преобразования строк
- 7. Практика: типовые задачи (с решениями)
- 8. Чек‑лист самопроверки знаний
1. Цели урока
- Понять, что такое матрица размера \(m\times n\) и как устроена адресация элементов \(a_{ij}\).
- Разобраться в основных видах матриц: прямоугольные, квадратные, строка, столбец, треугольные, диагональные, нулевая и единичная.
- Освоить базовые операции: сложение, умножение на число, матричное произведение, транспонирование.
- Понять идею элементарных преобразований строк и приведения матрицы к ступенчатому виду.
- Научиться вычислять численные характеристики квадратных матриц: след и определитель, а также понимать, когда существует обратная матрица.
- Научиться делать эти операции в Python с помощью SymPy (
sympy.Matrix).
2. Что такое матрица и чем она отличается от «просто списка»
Матрицей размера \(m\times n\) называют прямоугольную таблицу чисел, в которой \(m\) строк и \(n\) столбцов. Обычно матрицу обозначают буквой \(A\), а её элементы — \(a_{ij}\), где \(i\) — номер строки, \(j\) — номер столбца:
\[ A = (a_{ij}) = \begin{pmatrix} a_{11} & a_{12} & \dots & a_{1n}\\ a_{21} & a_{22} & \dots & a_{2n}\\ \vdots & \vdots & \ddots & \vdots\\ a_{m1} & a_{m2} & \dots & a_{mn} \end{pmatrix}. \]
Каждый элемент матрицы имеет “адрес”: индексы \(i\) и \(j\). Например, элемент на пересечении \(i\)-й строки и \(j\)-го столбца — это \(a_{ij}\).
В программировании мы уже встречали похожие структуры: двумерные списки или двумерные массивы. По способу доступа к элементам они действительно похожи на матрицы. Но различие принципиальное:
- список/массив — это структура хранения данных;
- матрица — это математический объект, над которым определены специфические математические операции.
import sympy as sp
A = sp.Matrix([[1, 2, 3],
[4, 5, 6]])
print(A) # матрица 2x3
print(A[0, 1]) # элемент (1-я строка, 2-й столбец) в 0-индексации Python => 2
Частая путаница: хранение vs математика
sympy.Matrix (или numpy.ndarray), чтобы матричная алгебра работала корректно.3. Виды матриц
3.1. Прямоугольная матрица, строка, столбец, квадратная
Самое простое разделение матриц — по форме, то есть по количеству строк и столбцов. Обычно выделяют несколько распространённых видов:
- Прямоугольная матрица — самый общий случай, когда нет требования \(m=n\). Например, матрица \(2\times 3\): \[ \begin{pmatrix} 5 & 8 & 2\\ 3 & 9 & 7 \end{pmatrix}. \]
- Матричная строка — матрица, где \(m=1\) (одна строка). Её также называют вектор-строкой: \[ \begin{pmatrix} 4 & 2 & 6 \end{pmatrix}. \]
- Матричный столбец — матрица, где \(n=1\) (один столбец), иначе — вектор-столбец: \[ \begin{pmatrix} 3\\ 7\\ 1 \end{pmatrix}. \]
- Квадратная матрица — матрица, где \(m=n\). Число \(n\) называют порядком матрицы. Например, матрица 3-го порядка: \[ \begin{pmatrix} 4 & 2 & 6\\ 8 & 5 & 9\\ 3 & 1 & 7 \end{pmatrix}. \]
3.2. Главная и побочная диагонали
Для квадратных матриц особенно важны диагонали. Главная диагональ — это элементы, у которых совпадают индексы строки и столбца: \(a_{11}, a_{22}, \dots, a_{nn}\). То есть “идём” из левого верхнего угла в правый нижний.
Побочная диагональ — это элементы, идущие из правого верхнего угла в левый нижний. В матрице \(n\times n\) это элементы вида \(a_{1n}, a_{2,n-1}, \dots, a_{n1}\).
3.3. Треугольные, диагональные, нулевая и единичная матрица
Относительно главной диагонали выделяют важные специальные формы:
- Верхнетреугольная матрица — все элементы ниже главной диагонали равны нулю: \[ \begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14}\\ 0 & a_{22} & a_{23} & a_{24}\\ 0 & 0 & a_{33} & a_{34}\\ 0 & 0 & 0 & a_{44} \end{pmatrix}. \]
- Нижнетреугольная матрица — все элементы выше главной диагонали равны нулю: \[ \begin{pmatrix} a_{11} & 0 & 0 & 0\\ a_{21} & a_{22} & 0 & 0\\ a_{31} & a_{32} & a_{33} & 0\\ a_{41} & a_{42} & a_{43} & a_{44} \end{pmatrix}. \]
- Диагональная матрица — нули вне главной диагонали (она одновременно верхне- и нижнетреугольная): \[ \begin{pmatrix} a_{11} & 0 & 0 & 0\\ 0 & a_{22} & 0 & 0\\ 0 & 0 & a_{33} & 0\\ 0 & 0 & 0 & a_{44} \end{pmatrix}. \]
- Нулевая матрица — матрица любой размерности, все элементы равны нулю: \[ \begin{pmatrix} 0 & 0 & \dots & 0\\ 0 & 0 & \dots & 0\\ \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & \dots & 0 \end{pmatrix}. \]
- Единичная матрица — квадратная диагональная матрица, где на главной диагонали стоят единицы: \[ I_n= \begin{pmatrix} 1 & 0 & \dots & 0\\ 0 & 1 & \dots & 0\\ \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & \dots & 1 \end{pmatrix}. \]
import sympy as sp
Z = sp.zeros(3, 4) # нулевая 3x4
I = sp.eye(4) # единичная 4x4
print(Z)
print(I)
3.4. Типичные ошибки
Ошибка 1: путать вектор-строку и вектор-столбец
В линейной алгебре форма важна: матрица \(1\times n\) и матрица \(n\times 1\) — это разные объекты. Это особенно заметно при умножении: “строка на столбец” даёт число, а “столбец на строку” даёт матрицу.
Ошибка 2: забыть, что диагональ определена только для квадратных матриц
У прямоугольной матрицы нет главной диагонали “в полном смысле”, потому что \(m\neq n\). Некоторые операции (след, определитель) вообще определяются только для квадратных матриц.
4. Операции с матрицами: сложение, умножение на число, вычитание
4.1. Сложение матриц
Пусть даны две матрицы \(A\) и \(B\) одинакового размера. Их суммой называют матрицу \(C\) того же размера, где каждый элемент получается сложением соответствующих элементов:
\[ C = A + B,\qquad c_{ij}=a_{ij}+b_{ij}. \]
import sympy as sp
A = sp.Matrix([[1, 2],
[3, 4]])
B = sp.Matrix([[10, 20],
[30, 40]])
print(A + B)
4.2. Умножение на число и вычитание матриц
Умножение матрицы на число \(\lambda\) тоже делается покомпонентно:
\[ \lambda A = (\lambda a_{ij}). \]
Благодаря этому удобно понимать вычитание: \[ A - B = A + (-1)\cdot B. \]
import sympy as sp
A = sp.Matrix([[2, -1],
[0, 5]])
B = sp.Matrix([[1, 3],
[4, -2]])
print("2*A:")
print(2*A)
print("A - B:")
print(A - B)
4.3. Типичные ошибки
Ошибка 1: пытаться сложить матрицы разных размеров
Сложение определено только для матриц одинаковой размерности. Если размеры различаются, операция не имеет смысла, и библиотеки обычно выбросят ошибку.
Ошибка 2: ожидать, что “деление матрицы на матрицу” существует
Деление матриц как базовая операция не определяется. Иногда вместо деления используют умножение на обратную матрицу (если она существует), но это отдельная идея, а не “/”.
5. Произведение матриц и транспонирование
5.1. Матричное произведение: формула и правило «строка на столбец»
Умножение матриц устроено не так, как умножение чисел и не так, как покомпонентное умножение. Пусть \(A\) имеет размер \(m\times n\), а \(B\) — размер \(n\times k\). Тогда их произведение \(C=AB\) — матрица размера \(m\times k\), а элементы вычисляются по формуле:
\[ c_{ij}=\sum_{\ell=1}^{n} a_{i\ell}\,b_{\ell j}. \]
Это удобно запоминать как правило «строка на столбец»: чтобы получить \(c_{ij}\), берём \(i\)-ю строку матрицы \(A\) и \(j\)-й столбец матрицы \(B\), перемножаем соответствующие элементы и складываем результаты.

import sympy as sp
A = sp.Matrix([[1, 2, 4],
[2, 0, 3]]) # 2x3
B = sp.Matrix([[2, 5],
[1, 3],
[1, 1]]) # 3x2
C = A * B # 2x2
print(C)
5.2. Два ключевых свойства: размерности и некоммутативность
У матричного произведения есть две особенности, которые важно выучить сразу:
- Не любые матрицы можно перемножить. Чтобы \(AB\) было определено, число столбцов \(A\) должно равняться числу строк \(B.\)
- Умножение матриц, как правило, некоммутативно. То есть обычно \(AB \neq BA\) (а иногда \(BA\) вообще не определено по размерности).
import sympy as sp
A = sp.Matrix([[1, 2],
[3, 4]])
B = sp.Matrix([[0, 1],
[1, 0]])
print("A*B:")
print(A*B)
print("B*A:")
print(B*A)
5.3. Транспонирование
Транспонирование — операция, которая “меняет местами” строки и столбцы. Транспонированную матрицу обозначают \(A^T\). Если \(A\) имеет размер \(m\times n\), то \(A^T\) имеет размер \(n\times m\), а элементы связаны так:
\[ (A^T)_{ij} = a_{ji}. \]
Это можно представлять как отражение относительно главной диагонали: то, что было в столбце, становится в строке, и наоборот.
import sympy as sp
A = sp.Matrix([[1, 2, 3],
[4, 5, 6]]) # 2x3
print("A:")
print(A)
print("A.T:")
print(A.T) # 3x2
5.4. Типичные ошибки
Ошибка 1: путать матричное произведение с покомпонентным
В линейной алгебре “умножение матриц” — это именно правило «строка на столбец». Покомпонентное умножение — это другая операция (в NumPy, например, это может быть просто * для массивов), и её нельзя автоматически считать “тем самым умножением”.
Ошибка 2: забывать про размерности при умножении
Если \(A\) — \(2\times 3\), а \(B\) — \(2\times 2\), то \(AB\) не определено, потому что “3 не равно 2”. Всегда проверяйте согласованность размеров.
6. Ступенчатый вид и элементарные преобразования строк
6.1. Что такое ступенчатый вид и зачем он нужен
Приведение матрицы к ступенчатому виду — это преобразование матрицы к форме, в которой удобно решать системы линейных уравнений, исследовать ранг, а также упрощать вычисления некоторых характеристик.
Идея (в простом описании): мы хотим с помощью преобразований строк получить много нулей “внизу слева”, чтобы матрица стала похожа на треугольную. В результате появляется структура, где в каждой следующей строке ведущий (первый ненулевой) элемент стоит правее, чем в предыдущей.

6.2. Элементарные преобразования строк
Чтобы привести матрицу к ступенчатому виду, используют элементарные преобразования строк. Обычно выделяют три базовых операции:
- Поменять местами две строки.
- Умножить строку на ненулевое число.
- Прибавить к одной строке другую строку, предварительно умноженную на число.
Эти операции не “ломают” смысл многих задач, например при решении системы линейных уравнений они сохраняют множество решений.
6.3. Как приводить матрицу к ступенчатому виду в SymPy
В SymPy есть методы, которые выполняют приведение к ступенчатым формам автоматически. Часто используются:
echelon_form()— ступенчатая форма;rref()— приведённая ступенчатая форма (reduced row echelon form), вместе с информацией о ведущих столбцах.
import sympy as sp
A = sp.Matrix([[2, 4, -2],
[4, 9, -3],
[-2, -3, 7]])
print("A:")
print(A)
print("Echelon form:")
print(A.echelon_form())
rref_matrix, pivots = A.rref()
print("RREF:")
print(rref_matrix)
print("Pivot columns:", pivots)
A:
Matrix([[2, 4, -2], [4, 9, -3], [-2, -3, 7]])
Echelon form:
Matrix([[2, 4, -2], [0, 2, 2], [0, 0, 16]])
RREF:
Matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
Pivot columns: (0, 1, 2)
6.4. Типичные ошибки
Ошибка 1: делать преобразования строк “вручную” и ошибаться в арифметике
Ручные преобразования полезны для понимания, но в коде их легко сделать с ошибкой. Для надёжности используйте готовые методы SymPy (echelon_form, rref), особенно когда числа большие или матрица крупная.
Ошибка 2: не различать “ступенчатую” и “приведённую ступенчатую” формы
Ступенчатая форма — это “много нулей снизу слева”. Приведённая ступенчатая форма идёт дальше: ведущие элементы обычно делают равными 1 и зануляют столбцы над ними. Для разных задач нужна разная форма.
7. Практика: типовые задачи (с решениями)
Блок 1: виды и создание матриц
Задача 1: создать матрицу и получить элемент по индексам
Создайте матрицу 3x3 и выведите элемент второй строки, третьего столбца (в математике это \(a_{23}\)).
import sympy as sp
A = sp.Matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# В Python индексация с 0:
print(A[1, 2]) # 6
Задача 2: нулевая и единичная матрица
Создайте нулевую матрицу 2x5 и единичную матрицу 4x4.
import sympy as sp
Z = sp.zeros(2, 5)
I = sp.eye(4)
print(Z)
print(I)
Блок 2: операции
Задача 3: сложение и вычитание
Сложите две матрицы 2x2 и затем вычтите одну из другой.
import sympy as sp
A = sp.Matrix([[2, 1],
[0, 3]])
B = sp.Matrix([[5, -2],
[7, 4]])
print("A + B:")
print(A + B)
print("A - B:")
print(A - B)
Задача 4: матричное умножение и транспонирование
Перемножьте матрицы (2x3) и (3x2), затем выведите транспонированную матрицу результата.
import sympy as sp
A = sp.Matrix([[1, 2, 3],
[0, 1, 4]])
B = sp.Matrix([[2, 0],
[1, 3],
[0, 1]])
C = A * B
print("C:")
print(C)
print("C.T:")
print(C.T)
Блок 3: след, определитель, обратная, решение AX=B
Задача 5: след (trace)
Найдите след квадратной матрицы как сумму элементов главной диагонали.
import sympy as sp
A = sp.Matrix([[4, 2, 6],
[8, 5, 9],
[3, 1, 7]])
print(A.trace()) # 4 + 5 + 7 = 16
Задача 6: определитель (det)
Найдите определитель. Отдельно проверьте треугольную матрицу: её определитель равен произведению диагональных элементов.
import sympy as sp
T = sp.Matrix([[2, 5, -1, 3],
[0, 1, 4, 2],
[0, 0, 8, -6],
[0, 0, 0, 10]])
print("det(T):", T.det())
print("diag product:", 2*1*8*10)
det(T): 160
diag product: 160
Задача 7: обратная матрица и проверка A·A^{-1} = I
Найдите обратную матрицу (если она существует) и проверьте, что произведение даёт единичную.
import sympy as sp
A = sp.Matrix([[3, 4],
[5, 7]])
A_inv = A.inv()
print("A_inv:")
print(A_inv)
print("A * A_inv:")
print(A * A_inv) # должно быть I
A_inv:
Matrix([[7, -4], [-5, 3]])
A * A_inv:
Matrix([[1, 0], [0, 1]])
Задача 8: матричное уравнение AX = B
Решите матричное уравнение AX=B. Важно: вместо “деления” используют либо решение системы, либо формулу X=A^{-1}B (если A обратима).
import sympy as sp
A = sp.Matrix([[1, 3, -5],
[0, 12, 0],
[0, 0, 1]])
B = sp.Matrix([[1, 2],
[3, 4],
[5, 6]])
# В SymPy удобнее решать так:
X = A.LUsolve(B)
print(X)
# Проверка:
print(A*X == B)
Matrix([[101/4, 31], [1/4, 1/3], [5, 6]])
True
8. Чек‑лист самопроверки знаний
Отметьте пункты, которые вы действительно понимаете и можете применить без подсказок.
| ✓ | Навык | Проверка |
|---|---|---|
| Определение матрицы | Могу объяснить, что такое матрица \(m\times n\) и как обозначается элемент \(a_{ij}\). | |
| Виды матриц | Могу отличить прямоугольную матрицу от квадратной, а матрицу-строку от матрицы-столбца. | |
| Диагонали | Могу показать главную диагональ \(a_{11},a_{22},\dots\) и описать побочную диагональ. | |
| Специальные матрицы | Могу объяснить, что такое верхнетреугольная, нижнетреугольная, диагональная, нулевая и единичная матрица. | |
| Сложение и скаляр | Могу сложить/вычесть матрицы одинакового размера и умножить матрицу на число \(\lambda\). | |
| Матричное умножение | Могу объяснить правило «строка на столбец» и проверить условие согласованности размерностей. | |
| Некоммутативность | Понимаю, что обычно \(AB \neq BA\), и могу привести пример. | |
| Транспонирование | Могу получить \(A^T\) и объяснить связь \((A^T)_{ij}=a_{ji}\). | |
| Ступенчатая форма | Могу перечислить три элементарных преобразования строк и получить ступенчатую форму (например, через SymPy). | |
| След и определитель | Могу найти след как сумму диагональных элементов и вычислить определитель квадратной матрицы (в т.ч. для треугольной). | |
| Обратимость | Понимаю, что обратная матрица существует не всегда, и что условие обратимости связано с \(\det(A)\neq 0\). | |
| Решение AX=B | Могу решить матричное уравнение \(AX=B\) через методы SymPy (например, LUsolve), не используя “деление матриц”. |