Перейти к содержимому

Матричные исчисления в SymPy

Матричные исчисления в SymPy

Ранее мы разобрали инструменты, которые нужны для анализа функций в Python: производные, интегралы и простые дифференциальные уравнения. Теперь перейдём к ещё одному базовому объекту высшей математики, который особенно важен в линейной алгебре и практически во всех прикладных задачах — к матрицам.

И программирование, и прикладная математика регулярно сталкиваются с необходимостью хранить и обрабатывать большие наборы чисел. Когда данные неупорядочены, работать с ними сложно: “хаос порождает хаос”. Один из главных способов организовать числовые данные и одновременно получить удобный математический инструмент — это матрицы.

Главная мысль урока: матрица — это не просто «таблица чисел». Это математический объект, для которого определены специальные операции (сложение, умножение, транспонирование, приведение к ступенчатому виду и т.д.), а эти операции лежат в основе решения систем уравнений, вычисления характеристик (след, определитель) и многих прикладных алгоритмов.

Содержание

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
Python

Частая путаница: хранение vs математика

Запомните: если вы храните матрицу как список списков, это ещё не делает её “матрицей” в математическом смысле. Матричные операции (например, произведение по правилу «строка на столбец») не совпадают с покомпонентными операциями “умножить каждый элемент”. Поэтому в Python удобно использовать 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)
Python

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)
Python

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)
Python

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\), перемножаем соответствующие элементы и складываем результаты.

matrix_mux_f50f3.jpeg

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)
Python

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)
Python

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
Python

5.4. Типичные ошибки

Ошибка 1: путать матричное произведение с покомпонентным

В линейной алгебре “умножение матриц” — это именно правило «строка на столбец». Покомпонентное умножение — это другая операция (в NumPy, например, это может быть просто * для массивов), и её нельзя автоматически считать “тем самым умножением”.

Ошибка 2: забывать про размерности при умножении

Если \(A\) — \(2\times 3\), а \(B\) — \(2\times 2\), то \(AB\) не определено, потому что “3 не равно 2”. Всегда проверяйте согласованность размеров.

↑ К оглавлению

6. Ступенчатый вид и элементарные преобразования строк

6.1. Что такое ступенчатый вид и зачем он нужен

Приведение матрицы к ступенчатому виду — это преобразование матрицы к форме, в которой удобно решать системы линейных уравнений, исследовать ранг, а также упрощать вычисления некоторых характеристик.

Идея (в простом описании): мы хотим с помощью преобразований строк получить много нулей “внизу слева”, чтобы матрица стала похожа на треугольную. В результате появляется структура, где в каждой следующей строке ведущий (первый ненулевой) элемент стоит правее, чем в предыдущей.

stmatr_780d5.png

6.2. Элементарные преобразования строк

Чтобы привести матрицу к ступенчатому виду, используют элементарные преобразования строк. Обычно выделяют три базовых операции:

  1. Поменять местами две строки.
  2. Умножить строку на ненулевое число.
  3. Прибавить к одной строке другую строку, предварительно умноженную на число.

Эти операции не “ломают” смысл многих задач, например при решении системы линейных уравнений они сохраняют множество решений.

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)
Python
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)
Bash

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
Python

Задача 2: нулевая и единичная матрица

Создайте нулевую матрицу 2x5 и единичную матрицу 4x4.

import sympy as sp

Z = sp.zeros(2, 5)
I = sp.eye(4)

print(Z)
print(I)
Python

Блок 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)
Python

Задача 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)
Python

Блок 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
Python

Задача 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)
Python
det(T): 160
diag product: 160
Bash

Задача 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
Python
A_inv:
Matrix([[7, -4], [-5, 3]])
A * A_inv:
Matrix([[1, 0], [0, 1]])
Bash

 

Задача 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)
Python
Matrix([[101/4, 31], [1/4, 1/3], [5, 6]])
True
Bash
↑ К оглавлению

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), не используя “деление матриц”.
Итоги: матрицы часто выглядят “необычно”, но сегодня они используются почти везде: от систем линейных уравнений до графов, криптографии, физики и машинного обучения. Мы не пытались охватить все тонкости линейной алгебры, а восстановили основные понятия и операции. Следующий шаг — научиться уверенно применять матрицы в Python для реальных вычислений и задач.
↑ К оглавлению

Ссылки по теме

Воскресенье, 01 марта 2026
Матричные исчисления в SymPy