🔴 Сложный ⏱️ 50 минут

Однородные системы

📋 Содержание урока

Однородные системы 🕳️

Весь предыдущий блок мы решали системы вида $Ax = b$ и каждый раз первым делом задавали вопрос: а есть ли вообще решение? Теорема Кронекера — Капелли, сравнение рангов, несовместные системы, где два уравнения противоречат друг другу, — всё это было про то, существует ли хоть один вектор $x$, удовлетворяющий всем уравнениям сразу.

Теперь возьмём частный случай: пусть правая часть — нули. Система $Ax = 0$. И сразу выясняется забавная вещь: вопрос «а есть ли решение?» становится бессмысленным. Решение есть всегда — нулевой вектор. Подставь $x = (0, 0, \dots, 0)$ в любую систему, где все свободные члены равны нулю, и каждое уравнение обратится в тождество $0 = 0$. Такая система не может быть несовместной физически: противоречие вида «$0 = 7$» тут просто неоткуда взять.

Казалось бы, тема закрыта, не начавшись. Но именно здесь начинается самое интересное в линейной алгебре. Потому что настоящий вопрос про однородную систему звучит иначе: есть ли у неё решения, кроме нулевого? И если есть — как выглядит всё их множество целиком, не «одно решение», а вся бесконечная семья сразу?

Ответ на этот вопрос оказывается неожиданно богатым. Множество решений однородной системы — это не просто «какой-то набор векторов». Оно устроено идеально правильно: сложи два решения — получишь решение, умножь решение на число — снова решение. Геометрически это значит, что решения заполняют прямую, плоскость или их многомерный аналог, обязательно проходящие через начало координат. У этого множества есть имя — нуль-пространство, или ядро матрицы, и есть компактный способ описать его целиком через конечный набор векторов — фундаментальную систему решений.

И вот главный сюрприз: разобравшись с однородной системой, ты автоматически разбираешься с любой неоднородной. Потому что множество решений системы $Ax = b$ — это ровно то же самое ядро, только сдвинутое: возьми одно любое решение $Ax = b$ и прибавь к нему все решения $Ax = 0$. Прямая через ноль превращается в параллельную ей прямую, не проходящую через ноль. Это и есть та формула, которая ставит точку во всём блоке про системы линейных уравнений: $X_{\text{общ}} = X_{\text{частн}} + X_{\text{одн}}$.

А в машинном обучении ядро матрицы — это прямое объяснение того, почему модель иногда не обучается однозначно. Если ядро матрицы признаков непустое, у линейной модели существует бесконечно много наборов весов, дающих ровно одинаковые предсказания на обучающих данных. Никакой оптимизатор тут не виноват — задача просто не имеет единственного ответа. Именно отсюда растут мультиколлинеарность, dummy variable trap и необходимость регуляризации.

🎯 Ты узнаешь:

  • Почему для однородной системы вопрос о совместности вырождается в тождество, и какой вопрос нужно задавать вместо него

  • Критерий существования нетривиального решения: $\operatorname{rank} A < n$, и два его практических следствия

  • Что такое нуль-пространство (ядро) матрицы и как оно выглядит геометрически — точка, прямая, плоскость

  • Как строить фундаментальную систему решений по чёткому алгоритму и почему в ней ровно $n - r$ векторов

  • Почему ФСР не единственна, но множество решений от выбора не зависит

  • Как из ядра и одного частного решения собирается всё множество решений неоднородной системы

  • Где ядро матрицы признаков всплывает в машинном обучении: неидентифицируемость весов, one-hot без выброшенной категории, зачем регуляризация выбирает одно решение из бесконечности

История: откуда это взялось?

Первым, кто споткнулся об однородные системы и понял, что тут что-то не так, был Леонард Эйлер — задолго до того, как появилось само слово «матрица». В 1750 году он разбирал старую геометрическую задачу: сколько точек нужно, чтобы однозначно задать кривую третьего порядка на плоскости? Уравнение такой кривой содержит десять коэффициентов, и каждая точка, через которую кривая обязана пройти, даёт одно линейное уравнение на эти коэффициенты. Уравнение кривой можно умножить на любое ненулевое число, оно не изменится, — значит, коэффициенты определены с точностью до общего множителя, и девяти точек «по счёту» должно хватать.

Но Габриэль Крамер заметил парадокс: две различные кубические кривые пересекаются ровно в девяти точках, и через эти девять точек проходят обе — то есть девять условий не определяют кривую однозначно. Этот сюжет вошёл в историю как парадокс Крамера. Эйлер в письме и в работе 1750 года дал правильное объяснение: девять уравнений не обязаны быть независимыми, они могут «повторять друг друга», и тогда решений бесконечно много. По сути Эйлер сформулировал (без термина «ранг», которого ещё не существовало) тот самый факт, что интересует нас в этом уроке: число уравнений само по себе ничего не говорит, важно, сколько среди них независимых.

Систематический аппарат появился сильно позже. Карл Фридрих Гаусс в «Theoria Motus» (1809) отработал метод исключения на задачах астрономии, где систем с зависимыми уравнениями было в избытке. Джеймс Джозеф Сильвестр, уже знакомый нам по слову «матрица» и по термину «ранг», в 1884 году ввёл понятие nullity — «дефект» матрицы, то самое число $n - r$, которое сегодня мы называем размерностью ядра. Сильвестр же сформулировал знаменитый «закон дефекта» (law of nullity), связывающий дефект произведения матриц с дефектами сомножителей.

Термин фундаментальная система решений пришёл в алгебру из соседней области — теории линейных дифференциальных уравнений. Немецкий математик Лазарус Фукс в работах середины 1860-х годов употреблял слово Fundamentalsystem для набора базисных решений линейного однородного дифференциального уравнения, из которых линейными комбинациями получаются все остальные решения. Идея оказалась настолько удачной и настолько буквально переносимой на алгебраические системы, что закрепилась и там: и в дифференциальном уравнении, и в системе $Ax = 0$ мы описываем бесконечное множество решений конечным набором «образующих».

Георг Фробениус в работах 1870–1880-х годов свёл всё это в стройную картину, связав ранг матрицы, число независимых решений однородной системы и структуру решений неоднородной. А Леопольд Кронекер и Альфредо Капелли (1892) поставили последнюю точку в вопросе о совместности — с их теоремой ты уже познакомился в этом блоке.

Забавная деталь: слово ядро (kernel, нем. Kern) для множества «того, что отображение переводит в ноль» вошло в математику ещё позже и уже из теории групп — из работ по гомоморфизмам начала XX века. То есть сначала люди научились находить решения $Ax = 0$, потом поняли, что это множество устроено особым образом, и только потом придумали ему имя, отражающее суть: ядро — это то, что матрица «съедает» без остатка.

Однородная система: вопрос ставится по-другому

Определение: Система линейных уравнений называется однородной, если все её свободные члены равны нулю. В матричной записи это система вида

$$Ax = 0,$$

где $A$ — матрица коэффициентов размера $m \times n$, $x$ — столбец из $n$ неизвестных, а $0$ — нулевой столбец высоты $m$.

Развёрнуто это выглядит так:

$$\begin{cases} a_{11}x_1 + a_{12}x_2 + \dots + a_{1n}x_n = 0 \\ a_{21}x_1 + a_{22}x_2 + \dots + a_{2n}x_n = 0 \\ \dots \\ a_{m1}x_1 + a_{m2}x_2 + \dots + a_{mn}x_n = 0 \end{cases}$$

Если хотя бы один свободный член отличен от нуля, система называется неоднородной — именно с такими мы работали весь блок. Однородная система, которая получается из неоднородной заменой всех свободных членов на нули (то есть с той же самой матрицей $A$), называется приведённой однородной системой для неё. Это словосочетание нам ещё пригодится в самом конце урока.

Интуиция: почему у однородной системы всегда есть решение

Подставь в любое уравнение однородной системы нули вместо всех неизвестных:

$$a_{11} \cdot 0 + a_{12} \cdot 0 + \dots + a_{1n} \cdot 0 = 0$$

Слева ноль, справа ноль. Тождество выполняется независимо от того, какие числа стоят в матрице $A$. То же самое верно для каждого из $m$ уравнений. Значит, нулевой вектор — решение любой однородной системы, вообще любой, без исключений.

Определение: Решение $x = (0, 0, \dots, 0)$ называется тривиальным решением однородной системы. Любое решение, отличное от нулевого, называется нетривиальным.

Отсюда сразу два вывода.

Вывод первый: однородная система всегда совместна. Она не может быть несовместной в принципе. Несовместность в неоднородном случае возникала, когда после преобразований появлялась строка вида $0 \cdot x_1 + \dots + 0 \cdot x_n = c$ с ненулевым $c$ — то есть требование «ноль равен семи». В однородной системе справа всегда стоит ноль, и строка $0 = 0$ никого не смущает: она просто лишняя, её выбрасывают.

Вывод второй: теорема Кронекера — Капелли вырождается в тождество. Расширенная матрица однородной системы — это

$$[A \mid 0] = \left(\begin{array}{cccc|c} a_{11} & a_{12} & \dots & a_{1n} & 0 \\ a_{21} & a_{22} & \dots & a_{2n} & 0 \\ \vdots & \vdots & & \vdots & \vdots \\ a_{m1} & a_{m2} & \dots & a_{mn} & 0 \end{array}\right)$$

Приписанный столбец состоит из одних нулей. Нулевой столбец не может добавить ни одной независимой строки: какие бы элементарные преобразования строк ты ни делал, нули в последнем столбце останутся нулями (прибавление нуля к нулю даёт ноль, умножение нуля на число даёт ноль). Поэтому

$$\operatorname{rank}[A \mid 0] = \operatorname{rank} A \quad \text{всегда.}$$

Условие теоремы Кронекера — Капелли выполнено автоматически, при любой матрице $A$. Проверять его бессмысленно — это не даёт никакой информации. Вся содержательная часть теоремы для однородного случая уходит во вторую половину: сравнение ранга с числом неизвестных.

Правильный вопрос про однородную систему звучит так: есть ли у неё нетривиальные решения? Или, что то же самое: единственно ли тривиальное решение, или их бесконечно много? Промежуточного варианта — например, «ровно два решения» — не бывает, и мы скоро увидим почему.

Разбор примеров

Пример 1. Система только с тривиальным решением.

$$\begin{cases} x_1 + 2x_2 = 0 \\ 3x_1 - x_2 = 0 \end{cases}$$

Матрица $A = \begin{pmatrix} 1 & 2 \\ 3 & -1 \end{pmatrix}$, определитель $\det A = 1 \cdot (-1) - 2 \cdot 3 = -7 \ne 0$. Матрица невырождена, значит $\operatorname{rank} A = 2 = n$. Приведём к ступенчатому виду: $R_2 \to R_2 - 3R_1$ даёт строку $(0, -7)$, откуда $-7x_2 = 0$, то есть $x_2 = 0$, и затем $x_1 = -2x_2 = 0$.

Единственное решение — тривиальное: $x_1 = x_2 = 0$. Геометрически: два уравнения задают две различные прямые на плоскости, обе проходят через начало координат, и пересекаются они ровно в одной точке — в самом начале координат.

Пример 2. Система с бесконечным числом решений.

$$\begin{cases} x_1 + 2x_2 = 0 \\ 2x_1 + 4x_2 = 0 \end{cases}$$

Второе уравнение — удвоенное первое, никакой новой информации оно не несёт. $\operatorname{rank} A = 1 < 2 = n$. Реально система сводится к одному уравнению $x_1 = -2x_2$, где $x_2$ можно брать любым. Полагая $x_2 = t$, получаем

$$x = \begin{pmatrix} -2t \\ t \end{pmatrix} = t \begin{pmatrix} -2 \\ 1 \end{pmatrix}, \quad t \in \mathbb{R}.$$

Решений бесконечно много, и все они лежат на одной прямой, проходящей через начало координат в направлении вектора $(-2, 1)$. При $t = 0$ получается тривиальное решение — оно тоже входит в это семейство, как и должно быть.

Пример 3. Уравнений меньше, чем неизвестных.

$$x_1 - 2x_2 + 3x_3 = 0$$

Одно уравнение, три неизвестных. $\operatorname{rank} A = 1 < 3$. Выражаем $x_1 = 2x_2 - 3x_3$ и получаем двухпараметрическое семейство решений. Геометрически это плоскость в трёхмерном пространстве, проходящая через начало координат.

Почему это важно

Разница между «система совместна» и «система имеет нетривиальное решение» — не игра словами, а разница между двумя совершенно разными практическими вопросами.

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

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

Критерий нетривиального решения

Теперь главный технический результат урока. Он вытекает прямо из теоремы Кронекера — Капелли, точнее из её второй половины, которую ты уже знаешь: если $\operatorname{rank} A = \operatorname{rank}[A \mid b] = n$, решение единственно, а если общий ранг меньше $n$ — решений бесконечно много. Для однородной системы левое равенство выполняется автоматически, и остаётся только сравнение с $n$.

Критерий: Однородная система $Ax = 0$ с $n$ неизвестными имеет нетривиальное решение тогда и только тогда, когда $\operatorname{rank} A < n$.

Если $\operatorname{rank} A = n$, единственное решение — тривиальное.

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

Механику критерия удобно видеть через свободные переменные. Приведём матрицу к ступенчатому виду. Число ненулевых строк — это ранг $r$. Столбцы с ведущими элементами дают $r$ базисных переменных, остальные $n - r$ переменных — свободные: им можно назначать любые значения, а базисные потом однозначно досчитываются обратным ходом. Если свободных переменных нет ($r = n$), назначать нечего, и обратный ход даёт нули сверху донизу. Если хотя бы одна свободная переменная есть ($r < n$), возьми её равной единице — и получишь ненулевой вектор-решение.

Два практических следствия

Следствие 1 (квадратный случай). Если система квадратная, то есть $m = n$, то

$$\text{нетривиальное решение существует} \iff \det A = 0.$$

Это прямой перевод критерия на язык определителей: для квадратной матрицы $\operatorname{rank} A = n$ равносильно $\det A \ne 0$. Практически это самый быстрый тест для систем $2 \times 2$ и $3 \times 3$: посчитал определитель, сравнил с нулём — ответ готов, решать систему не нужно. И обратно: если ты видишь квадратную однородную систему с ненулевым определителем, можешь сразу писать «только тривиальное решение», не делая ни одного элементарного преобразования.

Есть и обратное прочтение, которым мы будем пользоваться в задачах с параметром: если у квадратной однородной системы есть ненулевое решение, то определитель её матрицы равен нулю. Это превращает задачу «при каких значениях параметра появляется нетривиальное решение» в задачу «решить уравнение $\det A(\lambda) = 0$» — то есть в обычное алгебраическое уравнение относительно параметра.

Следствие 2 (широкий случай). Если уравнений меньше, чем неизвестных, то есть $m < n$, то нетривиальное решение существует всегда, при любой матрице $A$.

Доказательство в одну строку: ранг матрицы не превосходит числа её строк, поэтому $\operatorname{rank} A \le m < n$, и критерий выполнен. Никаких вычислений не требуется — достаточно посчитать уравнения и неизвестные.

Этот факт стоит запомнить намертво, потому что он работает как мгновенный ответ во множестве задач. «Пять неизвестных, три уравнения, все однородные» — нетривиальное решение есть, точка. «Матрица признаков, в которой наблюдений меньше, чем признаков» — у неё непустое ядро, и линейная модель на таких данных заведомо не имеет единственного решения. Последнее, кстати, ровно ситуация $p > n$ в статистике: признаков больше, чем объектов.

Разбор примеров

Пример 1. Квадратная система $3 \times 3$: проверяем определитель.

$$\begin{cases} 2x_1 + x_2 - x_3 = 0 \\ x_1 + 3x_2 + 2x_3 = 0 \\ x_1 - x_2 + x_3 = 0 \end{cases}$$

Считаем определитель разложением по первой строке:

$$\det A = 2\begin{vmatrix} 3 & 2 \\ -1 & 1 \end{vmatrix} - 1\begin{vmatrix} 1 & 2 \\ 1 & 1 \end{vmatrix} + (-1)\begin{vmatrix} 1 & 3 \\ 1 & -1 \end{vmatrix}$$$$= 2(3 + 2) - 1(1 - 2) - 1(-1 - 3) = 10 + 1 + 4 = 15 \ne 0.$$

Определитель ненулевой, значит $\operatorname{rank} A = 3 = n$, и единственное решение — тривиальное: $x_1 = x_2 = x_3 = 0$. Никаких дальнейших вычислений не нужно.

Пример 2. Квадратная система $3 \times 3$ с нулевым определителем.

$$\begin{cases} x_1 + 2x_2 + 3x_3 = 0 \\ 2x_1 + 5x_2 + 7x_3 = 0 \\ 3x_1 + 7x_2 + 10x_3 = 0 \end{cases}$$

Третья строка — сумма первых двух: $(1,2,3) + (2,5,7) = (3,7,10)$. Значит определитель равен нулю и нетривиальные решения есть. Найдём их. Прямой ход:

$$R_2 \to R_2 - 2R_1: \quad (0, 1, 1), \qquad R_3 \to R_3 - 3R_1: \quad (0, 1, 1)$$$$R_3 \to R_3 - R_2: \quad (0, 0, 0)$$

Ступенчатый вид:

$$\begin{pmatrix} 1 & 2 & 3 \\ 0 & 1 & 1 \\ 0 & 0 & 0 \end{pmatrix}$$

Ранг равен 2, неизвестных 3, свободных переменных $3 - 2 = 1$. Пивоты стоят в столбцах 1 и 2, значит базисные переменные — $x_1, x_2$, свободная — $x_3$. Обратный ход: из второй строки $x_2 = -x_3$; из первой $x_1 = -2x_2 - 3x_3 = 2x_3 - 3x_3 = -x_3$. Полагая $x_3 = t$:

$$x = t\begin{pmatrix} -1 \\ -1 \\ 1 \end{pmatrix}.$$

Проверка при $t = 1$, вектор $(-1, -1, 1)$: $-1 - 2 + 3 = 0$; $-2 - 5 + 7 = 0$; $-3 - 7 + 10 = 0$. Все три уравнения выполнены.

Пример 3. Уравнений меньше, чем неизвестных — ответ без вычислений.

$$\begin{cases} x_1 + x_2 - x_3 + 2x_4 - x_5 = 0 \\ 3x_1 - x_2 + x_3 + x_4 + 4x_5 = 0 \end{cases}$$

Здесь $m = 2$, $n = 5$. Так как $\operatorname{rank} A \le 2 < 5$, нетривиальные решения существуют — и их бесконечно много, минимум трёхпараметрическое семейство. Заметь, что этот вывод не потребовал ни одного арифметического действия: хватило пересчёта строк и столбцов.

Почему это важно

Критерий $\operatorname{rank} A < n$ — это ровно тот момент, где ранг из абстрактной характеристики матрицы превращается в диагноз. В прикладных задачах он читается так:

  • $\operatorname{rank} A = n$ — «система жёсткая, свободы нет»: единственная конфигурация, удовлетворяющая всем ограничениям, — нулевая. В задачах о равновесии это означает, что равновесие возможно только при нулевых силах; в задачах о балансировке реакции — что уравнение не балансируется вообще (значит, где-то ошибка в наборе веществ).

  • $\operatorname{rank} A < n$ — «есть степени свободы»: существует $n - r$ независимых направлений, вдоль которых можно двигаться, оставаясь решением. Именно число $n - r$ и есть количество этих степеней свободы.

В машинном обучении второй случай — это ровно ситуация, когда модель переопределена: признаков больше, чем реально независимой информации в данных, и веса модели определяются неоднозначно. Мы вернёмся к этому подробно в разделе про ML.

Ключевое свойство решений и нуль-пространство матрицы

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

Интуиция: решения складываются

Возьмём два решения одной и той же однородной системы. Пусть $X_1$ и $X_2$ — столбцы, для которых $AX_1 = 0$ и $AX_2 = 0$. Что будет, если их сложить? Воспользуемся тем, что умножение матрицы на столбец распределительно относительно сложения (это свойство операций над матрицами из урока 157):

$$A(X_1 + X_2) = AX_1 + AX_2 = 0 + 0 = 0.$$

Сумма — снова решение. Теперь умножим решение на число $c$:

$$A(cX_1) = c \cdot AX_1 = c \cdot 0 = 0.$$

Тоже решение. Объединяя, получаем главное свойство.

Свойство (принцип суперпозиции): Если $X_1, X_2, \dots, X_k$ — решения однородной системы $Ax = 0$, то при любых числах $c_1, c_2, \dots, c_k$ вектор

$$c_1X_1 + c_2X_2 + \dots + c_kX_k$$

тоже является решением этой системы.

Это свойство целиком принадлежит однородному случаю. Проверь на неоднородной системе: если $AX_1 = b$ и $AX_2 = b$, то $A(X_1 + X_2) = 2b \ne b$ (при $b \ne 0$). Сумма двух решений неоднородной системы решением не является. И $A(cX_1) = cb \ne b$ при $c \ne 1$. Так что «складываемость» — это ровно то, что отличает однородную систему от неоднородной, и ровно то, из-за чего с однородной работать намного приятнее.

Аналогия. Представь, что решение — это рецепт «сдвига, который система не замечает». Если один сдвиг система не замечает и другой не замечает, то и оба подряд она не заметит. И если сдвиг можно сделать вдвое длиннее или в обратную сторону — система по-прежнему ничего не заметит. Множество «незаметных сдвигов» замкнуто относительно сложения и растяжения — это и есть содержание принципа суперпозиции.

Геометрия: почему решения лежат «плоско» и проходят через нуль

Из принципа суперпозиции сразу следует форма множества решений.

Во-первых, ноль всегда внутри: тривиальное решение никуда не девается. Значит, множество решений однородной системы обязательно проходит через начало координат.

Во-вторых, если в множестве есть ненулевой вектор $X$, то в нём же есть и вся прямая $cX$ — растянутые и отражённые копии. То есть множество решений «не может быть кусочком»: если оно содержит точку, оно содержит и весь луч через неё, и противоположный луч.

В-третьих, если в множестве есть два непропорциональных вектора $X_1$ и $X_2$, то в нём же есть все их комбинации $c_1X_1 + c_2X_2$ — целая плоскость через начало координат.

Итого, для системы с тремя неизвестными множество решений может быть только одним из четырёх объектов:

  • одна точка (начало координат) — когда $r = 3$, решение только тривиальное;

  • прямая через начало координат — когда $r = 2$;

  • плоскость через начало координат — когда $r = 1$;

  • всё пространство $\mathbb{R}^3$ — когда $r = 0$, то есть матрица нулевая и уравнения ничего не требуют.

Никаких «двух отдельных прямых», «отрезков», «сфер» или «парабол» тут не бывает — только плоские объекты, обязательно проходящие через ноль. Это очень сильное ограничение, и оно полностью описывает картину.

Нуль-пространство (ядро) матрицы

У этого множества есть стандартное имя.

Определение: Нуль-пространством (или ядром) матрицы $A$ размера $m \times n$ называется множество всех решений однородной системы $Ax = 0$:

$$\ker A = \{\, x \in \mathbb{R}^n \;:\; Ax = 0 \,\}.$$

Обозначения: $\ker A$ (от kernel), реже $N(A)$ или $\operatorname{null}(A)$; по-английски — null space.

Содержательный смысл: ядро — это всё, что матрица убивает в ноль. Умножение на матрицу $A$ — это преобразование, которое каждому столбцу $x$ длины $n$ сопоставляет столбец $Ax$ длины $m$. Некоторые входы это преобразование стирает подчистую, превращая в нулевой вектор. Вот их совокупность и есть ядро.

Если ядро состоит из одного нуля ($\ker A = \{0\}$), матрица ничего не теряет: разным входам соответствуют разные выходы. Действительно, если $Ax_1 = Ax_2$, то $A(x_1 - x_2) = 0$, то есть разность лежит в ядре; при пустом (кроме нуля) ядре разность обязана быть нулевой, и $x_1 = x_2$. А вот если в ядре есть ненулевой вектор $v$, то $A(x + v) = Ax + Av = Ax$ — два разных входа дают один и тот же выход, информация о том, «сколько мы добавили вдоль $v$», теряется безвозвратно. Эта мысль — прямой мостик к разделу про машинное обучение, где потерянная информация превращается в невозможность определить веса модели.

Размерность ядра. Число независимых направлений в ядре равно $n - r$, где $r = \operatorname{rank} A$, а $n$ — число столбцов матрицы. Это число называют дефектом матрицы. Связь $r + (n - r) = n$ иногда формулируют как «ранг плюс дефект равны числу столбцов».

Обрати внимание: число строк $m$ в формулу не входит. Ядро живёт в пространстве размерности $n$ — по числу неизвестных, а не по числу уравнений.

Разбор примеров: геометрия ядра

Пример 1. Матрица $3 \times 3$ ранга 2 — ядро есть прямая.

$$A = \begin{pmatrix} 1 & 2 & 3 \\ 2 & 5 & 7 \\ 3 & 7 & 10 \end{pmatrix}$$

Это матрица из предыдущего раздела: $r = 2$, дефект $3 - 2 = 1$. Ядро — прямая через начало координат в направлении вектора $(-1, -1, 1)$:

$$\ker A = \{\, t \cdot (-1, -1, 1)^{T} \;:\; t \in \mathbb{R} \,\}.$$

Каждое из трёх уравнений задаёт плоскость через ноль. Три плоскости в общем положении пересекались бы в одной точке, но здесь третья плоскость — «сумма» первых двух и проходит через всю линию их пересечения, ничего нового не добавляя. Пересечение всех трёх — та самая прямая.

Пример 2. Матрица $3 \times 3$ ранга 1 — ядро есть плоскость.

$$B = \begin{pmatrix} 1 & 2 & -1 \\ 2 & 4 & -2 \\ -1 & -2 & 1 \end{pmatrix}$$

Вторая строка равна удвоенной первой, третья — первой со знаком минус. После элементарных преобразований остаётся одна ненулевая строка, $r = 1$, дефект $3 - 1 = 2$. Система сводится к единственному уравнению

$$x_1 + 2x_2 - x_3 = 0,$$

а это уравнение плоскости, проходящей через начало координат с нормальным вектором $(1, 2, -1)$. Ядро — вся эта плоскость. Описать её можно двумя векторами: полагая $x_2 = 1, x_3 = 0$, получаем $(-2, 1, 0)$; полагая $x_2 = 0, x_3 = 1$, получаем $(1, 0, 1)$. Проверка: $-2 + 2 - 0 = 0$ и $1 + 0 - 1 = 0$. Любая точка плоскости — комбинация $c_1(-2, 1, 0) + c_2(1, 0, 1)$.

Пример 3. Матрица $3 \times 3$ ранга 3 — ядро есть точка.

Для матрицы из примера 1 предыдущего раздела с $\det = 15 \ne 0$ ранг равен 3, дефект $3 - 3 = 0$. Ядро состоит из единственного элемента — нулевого вектора: $\ker A = \{0\}$. Матрица ничего не теряет, преобразование обратимо (что мы и знаем из урока про обратную матрицу: $\det \ne 0$).

Пример 4. Прямоугольная матрица: ядро живёт по числу столбцов.

$$C = \begin{pmatrix} 1 & -1 & 2 & 0 \\ 2 & -2 & 3 & 1 \end{pmatrix}$$

Здесь $m = 2$ строки, $n = 4$ столбца. $R_2 \to R_2 - 2R_1$ даёт $(0, 0, -1, 1)$, обе строки ненулевые, $r = 2$. Дефект $4 - 2 = 2$: ядро — двумерный объект внутри четырёхмерного пространства. Число строк (2) на размерность ядра не влияет никак; влияют только ранг и число столбцов.

Почему это важно

Понятие ядра переводит вопрос «сколько решений» в вопрос «какой формы множество решений», а это уже гораздо содержательнее. В приложениях это выглядит так.

В геометрии и графике. Матрица проекции (например, проекции трёхмерной сцены на экран) имеет непустое ядро: все точки, лежащие на луче зрения, проецируются в одну точку экрана, а разность двух таких точек лежит в ядре. Ядро проекции — это ровно «направление, которое теряется при проецировании».

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

В инженерных задачах. Ядро матрицы жёсткости конструкции описывает движения, при которых конструкция не деформируется, — так называемые движения твёрдого тела. Ненулевое ядро тут означает, что конструкция не закреплена и может свободно смещаться или вращаться.

Дальше нам нужно научиться описывать ядро не словами «прямая» или «плоскость», а конкретным конечным списком векторов. Этим и займёмся.

Фундаментальная система решений

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

Определение: Фундаментальной системой решений (сокращённо ФСР) однородной системы $Ax = 0$ называется такой набор решений $X_1, X_2, \dots, X_k$, что любое решение системы записывается в виде

$$X = c_1X_1 + c_2X_2 + \dots + c_kX_k$$

при некоторых числах $c_1, \dots, c_k$, и ни одно из решений набора не выражается через остальные.

Ключевой факт: в ФСР ровно $n - r$ решений, где $n$ — число неизвестных, $r$ — ранг матрицы системы. Ни больше, ни меньше. Если $r = n$, то $n - r = 0$: ФСР пуста, потому что описывать нечего — есть только тривиальное решение.

По сути ФСР — это компактное «сжатое» описание бесконечного множества: вместо перечисления всех решений мы указываем $n - r$ штук и правило, как из них получить остальные. Строгая теория того, что здесь происходит (какой набор векторов можно назвать базисом множества и почему их количество не зависит от способа выбора), разбирается в ближайших уроках курса. Нам сейчас достаточно рабочего понимания: ФСР — минимальный набор, которого хватает, чтобы получить всё.

Алгоритм построения ФСР

Алгоритм короткий и абсолютно механический.

Шаг 1. Записать матрицу $A$ коэффициентов системы. Столбец свободных членов не нужен: он нулевой и при элементарных преобразованиях останется нулевым, так что таскать его за собой бессмысленно.

Шаг 2. Привести $A$ к ступенчатому виду элементарными преобразованиями строк. Посчитать ранг $r$ (число ненулевых строк) и записать $n - r$ — столько решений будет в ФСР.

Шаг 3. Определить базисные и свободные переменные. Базисные — те, чьи столбцы содержат ведущие элементы (пивоты); свободные — все остальные.

Шаг 4. Довести матрицу до улучшенного ступенчатого вида (RREF): пивоты равны единице, над ними — нули. После этого каждая базисная переменная выражается через свободные напрямую, без обратной подстановки.

Шаг 5. Построить $n - r$ решений: для $i$-го решения назначить $i$-й свободной переменной значение $1$, всем остальным свободным — значение $0$, и досчитать базисные переменные. Полученные столбцы $X_1, \dots, X_{n-r}$ и есть ФСР.

Шаг 6. Записать общее решение: $X = c_1X_1 + \dots + c_{n-r}X_{n-r}$, где $c_i$ — произвольные числа.

Шаг 7. Проверить: подставить каждый $X_i$ в исходную систему и убедиться, что все уравнения дают ноль. Это занимает полминуты и ловит почти все арифметические ошибки.

Почему на шаге 5 назначаются именно нули и единицы? Не потому, что другие числа запрещены, а потому, что такой выбор гарантирует «независимость» полученных решений и делает арифметику минимальной. У $i$-го решения в позиции $i$-й свободной переменной стоит единица, а у всех остальных решений в этой позиции — ноль. Значит, ни одно из них нельзя собрать из остальных: в комбинации $c_1X_1 + \dots + c_{n-r}X_{n-r}$ координата, отвечающая $i$-й свободной переменной, равна просто $c_i$. Это же наблюдение объясняет, почему коэффициенты $c_i$ в общем решении восстанавливаются однозначно: они буквально равны значениям свободных переменных.

Разбор примеров

Пример 1. Система $3 \times 4$: три уравнения, четыре неизвестных.

$$\begin{cases} x_1 + 2x_2 - x_3 + 3x_4 = 0 \\ 2x_1 + 4x_2 - x_3 + x_4 = 0 \\ 3x_1 + 6x_2 - 2x_3 + 4x_4 = 0 \end{cases}$$

Шаг 1–2. Матрица и прямой ход:

$$A = \begin{pmatrix} 1 & 2 & -1 & 3 \\ 2 & 4 & -1 & 1 \\ 3 & 6 & -2 & 4 \end{pmatrix}$$$$R_2 \to R_2 - 2R_1: \quad (0,\ 0,\ 1,\ -5)$$$$R_3 \to R_3 - 3R_1: \quad (0,\ 0,\ 1,\ -5)$$$$R_3 \to R_3 - R_2: \quad (0,\ 0,\ 0,\ 0)$$$$\begin{pmatrix} 1 & 2 & -1 & 3 \\ 0 & 0 & 1 & -5 \\ 0 & 0 & 0 & 0 \end{pmatrix}$$

Ранг $r = 2$, неизвестных $n = 4$, значит в ФСР будет $4 - 2 = 2$ решения.

Шаг 3. Пивоты стоят в столбцах 1 и 3. Базисные переменные — $x_1, x_3$; свободные — $x_2, x_4$.

Шаг 4. Улучшенный ступенчатый вид: $R_1 \to R_1 + R_2$ даёт $(1, 2, 0, -2)$:

$$\begin{pmatrix} 1 & 2 & 0 & -2 \\ 0 & 0 & 1 & -5 \\ 0 & 0 & 0 & 0 \end{pmatrix} \quad\Longrightarrow\quad \begin{cases} x_1 = -2x_2 + 2x_4 \\ x_3 = 5x_4 \end{cases}$$

Шаг 5. Строим два решения.

Первое: $x_2 = 1$, $x_4 = 0$. Тогда $x_1 = -2$, $x_3 = 0$:

$$X_1 = \begin{pmatrix} -2 \\ 1 \\ 0 \\ 0 \end{pmatrix}$$

Второе: $x_2 = 0$, $x_4 = 1$. Тогда $x_1 = 2$, $x_3 = 5$:

$$X_2 = \begin{pmatrix} 2 \\ 0 \\ 5 \\ 1 \end{pmatrix}$$

Шаг 6. Общее решение:

$$X = c_1\begin{pmatrix} -2 \\ 1 \\ 0 \\ 0 \end{pmatrix} + c_2\begin{pmatrix} 2 \\ 0 \\ 5 \\ 1 \end{pmatrix}, \qquad c_1, c_2 \in \mathbb{R}.$$

Шаг 7. Проверка $X_1$: $-2 + 2 - 0 + 0 = 0$; $-4 + 4 - 0 + 0 = 0$; $-6 + 6 - 0 + 0 = 0$. Проверка $X_2$: $2 + 0 - 5 + 3 = 0$; $4 + 0 - 5 + 1 = 0$; $6 + 0 - 10 + 4 = 0$. Обе проверки сошлись.

Пример 2. Система $4 \times 5$: четыре уравнения, пять неизвестных.

$$\begin{cases} x_1 + 2x_2 + x_3 - x_4 + x_5 = 0 \\ 2x_1 + 4x_2 + 3x_3 + x_5 = 0 \\ x_1 + 2x_2 + 2x_3 + x_4 = 0 \\ 3x_1 + 6x_2 + 4x_3 - x_4 + 2x_5 = 0 \end{cases}$$

Прямой ход. Матрица:

$$A = \begin{pmatrix} 1 & 2 & 1 & -1 & 1 \\ 2 & 4 & 3 & 0 & 1 \\ 1 & 2 & 2 & 1 & 0 \\ 3 & 6 & 4 & -1 & 2 \end{pmatrix}$$$$R_2 \to R_2 - 2R_1: \quad (0,\ 0,\ 1,\ 2,\ -1)$$$$R_3 \to R_3 - R_1: \quad (0,\ 0,\ 1,\ 2,\ -1)$$$$R_4 \to R_4 - 3R_1: \quad (0,\ 0,\ 1,\ 2,\ -1)$$

Три одинаковые строки — вычитаем вторую из третьей и четвёртой, обе обнуляются:

$$\begin{pmatrix} 1 & 2 & 1 & -1 & 1 \\ 0 & 0 & 1 & 2 & -1 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \end{pmatrix}$$

Ранг $r = 2$, неизвестных $n = 5$, в ФСР будет $5 - 2 = 3$ решения. Пивоты в столбцах 1 и 3: базисные $x_1, x_3$; свободные $x_2, x_4, x_5$.

RREF. $R_1 \to R_1 - R_2$ даёт $(1, 2, 0, -3, 2)$:

$$\begin{cases} x_1 = -2x_2 + 3x_4 - 2x_5 \\ x_3 = -2x_4 + x_5 \end{cases}$$

Строим три решения.

$x_2 = 1, x_4 = 0, x_5 = 0$: $x_1 = -2$, $x_3 = 0$, откуда $X_1 = (-2, 1, 0, 0, 0)^T$.

$x_2 = 0, x_4 = 1, x_5 = 0$: $x_1 = 3$, $x_3 = -2$, откуда $X_2 = (3, 0, -2, 1, 0)^T$.

$x_2 = 0, x_4 = 0, x_5 = 1$: $x_1 = -2$, $x_3 = 1$, откуда $X_3 = (-2, 0, 1, 0, 1)^T$.

Общее решение: $X = c_1X_1 + c_2X_2 + c_3X_3$.

Проверка $X_2 = (3, 0, -2, 1, 0)$: первое уравнение $3 + 0 - 2 - 1 + 0 = 0$; второе $6 + 0 - 6 + 0 + 0 = 0$; третье $3 + 0 - 4 + 1 + 0 = 0$; четвёртое $9 + 0 - 8 - 1 + 0 = 0$. Сошлось. Аналогично проверяются $X_1$ и $X_3$.

Обрати внимание на арифметику: четыре уравнения, а ранг всего 2 — три из четырёх строк оказались одинаковыми после первого же шага. Это типичная ситуация в реальных данных, где строки таблицы часто дублируют друг друга с точностью до масштаба.

Пример 3. Случай $r = n$: ФСР пуста.

$$\begin{cases} 2x_1 + x_2 - x_3 = 0 \\ x_1 + 3x_2 + 2x_3 = 0 \\ x_1 - x_2 + x_3 = 0 \end{cases}$$

Определитель этой матрицы мы уже считали: $\det A = 15 \ne 0$, значит $r = 3 = n$, дефект $3 - 3 = 0$.

В ФСР ноль решений. Это не описка и не «ФСР состоит из нулевого вектора» — именно пустой набор. Общее решение записывается как «сумма нуля слагаемых», то есть просто $X = 0$. Ядро состоит из одной точки: $\ker A = \{0\}$.

Формально это можно проговорить и так: свободных переменных нет, назначать значения нечему, единственный вариант обратного хода даёт нули. Частая ошибка на этом месте — написать «ФСР $= \{(0,0,0)\}$». Нулевой вектор в ФСР входить не может по определению: набор, содержащий нулевой вектор, всегда «избыточен», ведь нулевой вектор получается из любых других умножением на ноль, и никакой информации он не несёт.

Пример 4. Система $2 \times 4$: широкая система.

$$\begin{cases} x_1 - x_2 + 2x_3 = 0 \\ 2x_1 - 2x_2 + 3x_3 + x_4 = 0 \end{cases}$$

$m = 2 < 4 = n$, значит нетривиальные решения точно есть (следствие 2 критерия). Считаем:

$$R_2 \to R_2 - 2R_1: \quad (0,\ 0,\ -1,\ 1)$$

Умножим полученную строку на $-1$: $(0, 0, 1, -1)$. Ранг $r = 2$, в ФСР будет $4 - 2 = 2$ решения. Пивоты в столбцах 1 и 3: базисные $x_1, x_3$; свободные $x_2, x_4$.

RREF: $R_1 \to R_1 - 2R_2$ даёт $(1, -1, 0, 2)$:

$$\begin{cases} x_1 = x_2 - 2x_4 \\ x_3 = x_4 \end{cases}$$

$x_2 = 1, x_4 = 0$: $X_1 = (1, 1, 0, 0)^T$. $x_2 = 0, x_4 = 1$: $X_2 = (-2, 0, 1, 1)^T$.

Проверка $X_2$: $-2 - 0 + 2 + 0 = 0$ и $-4 - 0 + 3 + 1 = 0$. Сошлось.

Неединственность ФСР

Вот момент, который сбивает с толку почти всех, кто впервые сверяет свой ответ с ответом из задачника: ФСР не единственна. Два человека, решая одну и ту же систему, могут получить разные наборы векторов — и оба будут правы.

Причина простая: на шаге 3 алгоритма мы делили переменные на базисные и свободные, и это деление зависит от того, как именно шёл прямой ход (какие строки переставляли, какой столбец получил пивот). Другой порядок действий — другой набор свободных переменных — другая ФСР. При этом само множество решений, то есть ядро, конечно, не меняется: это объективное свойство системы, а не следствие наших действий.

Покажем это на конкретном примере, доведя оба варианта до конца.

$$\begin{cases} x_1 + x_2 + x_3 + x_4 = 0 \\ x_1 + 2x_2 + 3x_3 + 4x_4 = 0 \end{cases}$$

$R_2 \to R_2 - R_1$ даёт $(0, 1, 2, 3)$, ранг $r = 2$, дефект $4 - 2 = 2$.

Вариант A: свободные переменные $x_3, x_4$. Пивоты в столбцах 1 и 2. Приводим к RREF: $R_1 \to R_1 - R_2$ даёт $(1, 0, -1, -2)$:

$$\begin{cases} x_1 = x_3 + 2x_4 \\ x_2 = -2x_3 - 3x_4 \end{cases}$$

$x_3 = 1, x_4 = 0$: $X_1 = (1, -2, 1, 0)^T$. $x_3 = 0, x_4 = 1$: $X_2 = (2, -3, 0, 1)^T$.

Вариант B: свободные переменные $x_1, x_2$. Теперь базисными делаем $x_3, x_4$. Перепишем те же два соотношения как систему относительно $x_3, x_4$:

$$\begin{cases} x_3 + 2x_4 = x_1 \\ -2x_3 - 3x_4 = x_2 \end{cases}$$

Умножим первое на 2 и сложим со вторым: $x_4 = 2x_1 + x_2$. Тогда $x_3 = x_1 - 2x_4 = x_1 - 4x_1 - 2x_2 = -3x_1 - 2x_2$.

$x_1 = 1, x_2 = 0$: $Y_1 = (1, 0, -3, 2)^T$. $x_1 = 0, x_2 = 1$: $Y_2 = (0, 1, -2, 1)^T$.

Проверяем оба варианта. $Y_1$: $1 + 0 - 3 + 2 = 0$ и $1 + 0 - 9 + 8 = 0$. $Y_2$: $0 + 1 - 2 + 1 = 0$ и $0 + 2 - 6 + 4 = 0$. Всё верно — это действительно решения, и их ровно $4 - 2 = 2$ штуки, как и положено.

Наборы разные, множество одно. Убедимся, что $Y_1$ и $Y_2$ выражаются через $X_1$ и $X_2$:

$$-3X_1 + 2X_2 = -3(1, -2, 1, 0) + 2(2, -3, 0, 1) = (-3 + 4,\ 6 - 6,\ -3 + 0,\ 0 + 2) = (1, 0, -3, 2) = Y_1$$$$-2X_1 + X_2 = -2(1, -2, 1, 0) + (2, -3, 0, 1) = (-2 + 2,\ 4 - 3,\ -2 + 0,\ 0 + 1) = (0, 1, -2, 1) = Y_2$$

И наоборот, $X_1$ и $X_2$ выражаются через $Y_1, Y_2$ (проверь это в качестве упражнения, коэффициенты находятся из тех же соображений). Значит, семейства $c_1X_1 + c_2X_2$ и $d_1Y_1 + d_2Y_2$ описывают одно и то же множество векторов — просто «в разных координатах».

Практический вывод. Если твой ответ не совпал буквально с ответом в конце задачника — не паникуй. Проверь три вещи: каждый твой вектор действительно решение (подстановка даёт нули); количество векторов равно $n - r$; каждый вектор из «эталонной» ФСР выражается через твои. Если всё три пункта сошлись, ответ верен. Кстати, sympy.Matrix.nullspace() возвращает свою ФСР, которая тоже далеко не всегда совпадает с той, что получилась у тебя на бумаге — по той же самой причине.

Почему это важно

ФСР — это переход от «умею решать» к «умею описывать». Разница огромная. Одно дело найти какое-то одно решение системы, другое — предъявить компактную формулу, порождающую все решения сразу, с явным указанием, сколько в ней степеней свободы.

В вычислительной практике ядро матрицы почти всегда представляют именно так: не как множество, а как набор векторов-образующих. Функция scipy.linalg.null_space(A) возвращает матрицу, столбцы которой — как раз такой набор (правда, ортонормированный, найденный через сингулярное разложение, а не через метод Гаусса — численно это устойчивее). Функция sympy.Matrix(A).nullspace() возвращает список векторов, полученных точным символьным вариантом того же алгоритма, который мы разобрали шаг за шагом.

А число $n - r$ — «сколько степеней свободы» — часто и есть искомый ответ в прикладной задаче, даже без нахождения самих векторов. Если у химического уравнения дефект равен 1, коэффициенты определяются однозначно с точностью до множителя, и балансировка корректна. Если дефект равен 2, значит набор веществ описывает не одну реакцию, а семейство — и задача поставлена некорректно.

Структура общего решения неоднородной системы

Это главный раздел урока — тот, ради которого весь блок про системы линейных уравнений и затевался. Мы возьмём всё, что узнали про однородные системы, и получим полное описание решений любой системы $Ax = b$.

Интуиция: сдвинутое ядро

Пусть система $Ax = b$ совместна, и мы каким-то способом — Гауссом, Крамером, матричным методом, угадыванием — нашли одно её решение. Назовём его $X_{\text{частн}}$ («частное решение»). Вопрос: как выглядят остальные?

Пусть $X$ — какое-то другое решение той же системы. Посмотрим на разность:

$$A(X - X_{\text{частн}}) = AX - AX_{\text{частн}} = b - b = 0.$$

Разность двух решений неоднородной системы — решение приведённой однородной системы, то есть элемент ядра. Обозначим её $X_{\text{одн}} = X - X_{\text{частн}}$, тогда $X = X_{\text{частн}} + X_{\text{одн}}$.

Проверим и в обратную сторону: если взять любой элемент ядра $X_{\text{одн}}$ и прибавить его к частному решению, получится ли решение? Проверяем:

$$A(X_{\text{частн}} + X_{\text{одн}}) = AX_{\text{частн}} + AX_{\text{одн}} = b + 0 = b.$$

Да, получится. Значит, множество решений неоднородной системы — это в точности множество вида «частное решение плюс что угодно из ядра».

Теорема о структуре общего решения: Если система $Ax = b$ совместна, то её общее решение имеет вид

$$X_{\text{общ}} = X_{\text{частн}} + X_{\text{одн}},$$

где $X_{\text{частн}}$ — любое (одно) решение системы $Ax = b$, а $X_{\text{одн}} = c_1X_1 + \dots + c_{n-r}X_{n-r}$ — общее решение приведённой однородной системы $Ax = 0$, записанное через её ФСР.

Формула читается так: чтобы описать все решения, достаточно найти одно решение и всё ядро.

Геометрия: параллельный перенос

Геометрический смысл этой формулы, пожалуй, самый наглядный во всём курсе линейной алгебры.

Множество решений однородной системы — прямая, плоскость или их аналог, проходящие через начало координат. Множество решений неоднородной системы — тот же самый объект той же самой размерности, но сдвинутый на вектор $X_{\text{частн}}$ и потому через начало координат, как правило, не проходящий.

Представь прямую, проходящую через ноль, — это ядро. Теперь возьми всю эту прямую целиком и параллельно перенеси её так, чтобы точка «ноль» переехала в точку $X_{\text{частн}}$. Получившаяся прямая и есть множество решений $Ax = b$. Направление у неё то же самое (ядро задаёт направление), изменилось только положение.

Отсюда сразу несколько полезных наблюдений.

  • Решения неоднородной системы не складываются: сумма двух точек сдвинутой прямой на этой прямой не лежит (если только прямая не проходит через ноль, то есть если $b \ne 0$).

  • Число степеней свободы у неоднородной системы то же самое, что у приведённой однородной: $n - r$. Правая часть $b$ на количество параметров не влияет — она влияет только на то, есть ли решения вообще.

  • Если $\ker A = \{0\}$, то сдвигать нечего: решение ровно одно. Это и есть случай единственности из теоремы Кронекера — Капелли, увиденный с другой стороны.

Разбор примеров

Пример 1. Прямая, не проходящая через ноль.

$$\begin{cases} x_1 + 2x_2 + 3x_3 = 6 \\ 2x_1 + 3x_2 + 4x_3 = 9 \end{cases}$$

Шаг 1: приведённая однородная система. Матрица $A = \begin{pmatrix} 1 & 2 & 3 \\ 2 & 3 & 4 \end{pmatrix}$. Прямой ход: $R_2 \to R_2 - 2R_1$ даёт $(0, -1, -2)$. Ранг $r = 2$, $n = 3$, дефект $3 - 2 = 1$ — в ФСР одно решение.

Из второй строки $-x_2 - 2x_3 = 0$, то есть $x_2 = -2x_3$. Из первой $x_1 = -2x_2 - 3x_3 = 4x_3 - 3x_3 = x_3$. Полагаем $x_3 = 1$:

$$X_1 = \begin{pmatrix} 1 \\ -2 \\ 1 \end{pmatrix}, \qquad X_{\text{одн}} = c\begin{pmatrix} 1 \\ -2 \\ 1 \end{pmatrix}.$$

Проверка: $1 - 4 + 3 = 0$ и $2 - 6 + 4 = 0$. Верно.

Шаг 2: частное решение. Проще всего занулить свободную переменную. Положим $x_3 = 0$:

$$\begin{cases} x_1 + 2x_2 = 6 \\ 2x_1 + 3x_2 = 9 \end{cases}$$

Из первого $x_1 = 6 - 2x_2$; подставляем во второе: $12 - 4x_2 + 3x_2 = 9$, откуда $x_2 = 3$ и $x_1 = 0$. Частное решение $X_{\text{частн}} = (0, 3, 0)^T$. Проверка: $0 + 6 + 0 = 6$ и $0 + 9 + 0 = 9$. Верно.

Шаг 3: общее решение.

$$X = \begin{pmatrix} 0 \\ 3 \\ 0 \end{pmatrix} + c\begin{pmatrix} 1 \\ -2 \\ 1 \end{pmatrix} = \begin{pmatrix} c \\ 3 - 2c \\ c \end{pmatrix}, \qquad c \in \mathbb{R}.$$

Геометрия. Каждое из двух уравнений задаёт плоскость в $\mathbb{R}^3$, не проходящую через начало координат. Их пересечение — прямая, проходящая через точку $(0, 3, 0)$ в направлении $(1, -2, 1)$. Приведённая однородная система задаёт две плоскости, проходящие через ноль и параллельные исходным; их пересечение — прямая того же направления $(1, -2, 1)$, но проходящая через ноль. Две прямые параллельны — это ровно та картинка «сдвинутого ядра», о которой шла речь.

Пример 2. Тот же ответ, другое частное решение.

Продолжим предыдущий пример. Возьмём вместо $(0, 3, 0)$ другое частное решение — например, $(1, 1, 1)$. Проверим, что это действительно решение: $1 + 2 + 3 = 6$ и $2 + 3 + 4 = 9$. Да.

Тогда общее решение запишется так:

$$X = \begin{pmatrix} 1 \\ 1 \\ 1 \end{pmatrix} + d\begin{pmatrix} 1 \\ -2 \\ 1 \end{pmatrix} = \begin{pmatrix} 1 + d \\ 1 - 2d \\ 1 + d \end{pmatrix}, \qquad d \in \mathbb{R}.$$

Формулы выглядят по-разному, но описывают одно и то же множество. Убедимся: возьмём произвольную точку из первой записи, с параметром $c$, и найдём соответствующий ей параметр $d$ во второй. Сравнивая первые координаты: $c = 1 + d$, то есть $d = c - 1$. Проверим вторую координату: $1 - 2(c - 1) = 3 - 2c$ — совпало. Третью: $1 + (c - 1) = c$ — совпало. Значит, каждой точке первого семейства соответствует точка второго, и наоборот.

Почему так получается, видно и без вычислений: разность двух частных решений

$$(1, 1, 1) - (0, 3, 0) = (1, -2, 1)$$

сама лежит в ядре (это в точности наш вектор $X_1$). Сдвиг на элемент ядра переводит множество решений в себя — прямая просто «съезжает вдоль себя самой», оставаясь той же прямой. Отсюда общее правило: частное решение можно брать любое, ответ множеством от этого не изменится. Именно поэтому в задачниках ответы к таким задачам часто выглядят по-разному, оставаясь верными.

Ещё одно частное решение той же системы: $c = -1$ даёт $(-1, 5, -1)$. Проверка: $-1 + 10 - 3 = 6$ и $-2 + 15 - 4 = 9$. Тоже подходит, и построенное на нём общее решение снова опишет ту же прямую.

Пример 3. Плоскость в четырёхмерном пространстве.

$$\begin{cases} x_1 + x_2 + x_3 + x_4 = 4 \\ x_1 + 2x_2 + 3x_3 + 4x_4 = 10 \\ 2x_1 + 3x_2 + 4x_3 + 5x_4 = 14 \end{cases}$$

Совместность. Третье уравнение — сумма первых двух, и слева ($(1,1,1,1) + (1,2,3,4) = (2,3,4,5)$), и справа ($4 + 10 = 14$). Значит, оно избыточно, но не противоречиво: $\operatorname{rank} A = \operatorname{rank}[A \mid b] = 2$. Система совместна, дефект $4 - 2 = 2$.

Однородная часть. Матрица $A$ после $R_2 \to R_2 - R_1$ и $R_3 \to R_3 - R_1 - R_2$ приводится к

$$\begin{pmatrix} 1 & 1 & 1 & 1 \\ 0 & 1 & 2 & 3 \\ 0 & 0 & 0 & 0 \end{pmatrix} \quad\Longrightarrow\quad \begin{pmatrix} 1 & 0 & -1 & -2 \\ 0 & 1 & 2 & 3 \\ 0 & 0 & 0 & 0 \end{pmatrix}$$

Базисные $x_1, x_2$; свободные $x_3, x_4$; $x_1 = x_3 + 2x_4$, $x_2 = -2x_3 - 3x_4$. ФСР:

$$X_1 = (1, -2, 1, 0)^T, \qquad X_2 = (2, -3, 0, 1)^T.$$

Частное решение. Проведём те же преобразования, но уже над расширенной матрицей — правая часть поедет вместе со строками:

$$\left(\begin{array}{cccc|c} 1 & 1 & 1 & 1 & 4 \\ 1 & 2 & 3 & 4 & 10 \\ 2 & 3 & 4 & 5 & 14 \end{array}\right) \xrightarrow[\ R_3 - 2R_1\ ]{\ R_2 - R_1\ } \left(\begin{array}{cccc|c} 1 & 1 & 1 & 1 & 4 \\ 0 & 1 & 2 & 3 & 6 \\ 0 & 1 & 2 & 3 & 6 \end{array}\right) \xrightarrow[\ R_1 - R_2\ ]{\ R_3 - R_2\ } \left(\begin{array}{cccc|c} 1 & 0 & -1 & -2 & -2 \\ 0 & 1 & 2 & 3 & 6 \\ 0 & 0 & 0 & 0 & 0 \end{array}\right)$$

Отсюда $x_1 = -2 + x_3 + 2x_4$ и $x_2 = 6 - 2x_3 - 3x_4$. Полагаем $x_3 = x_4 = 0$.

Итого $x_1 = -2$, $x_2 = 6$ при нулевых свободных: $X_{\text{частн}} = (-2, 6, 0, 0)^T$. Проверка: $-2 + 6 + 0 + 0 = 4$; $-2 + 12 + 0 + 0 = 10$; $-4 + 18 + 0 + 0 = 14$. Всё сходится.

Общее решение:

$$X = \begin{pmatrix} -2 \\ 6 \\ 0 \\ 0 \end{pmatrix} + c_1\begin{pmatrix} 1 \\ -2 \\ 1 \\ 0 \end{pmatrix} + c_2\begin{pmatrix} 2 \\ -3 \\ 0 \\ 1 \end{pmatrix}.$$

Геометрически это двумерная плоскость внутри четырёхмерного пространства, сдвинутая из начала координат в точку $(-2, 6, 0, 0)$.

Другое частное решение. Возьмём $c_1 = 1, c_2 = 0$: точка $(-1, 4, 1, 0)$. Проверка: $-1 + 4 + 1 + 0 = 4$; $-1 + 8 + 3 + 0 = 10$; $-2 + 12 + 4 + 0 = 14$. Годится. Записанное через неё общее решение $(-1, 4, 1, 0) + d_1X_1 + d_2X_2$ описывает ту же плоскость.

Почему это важно

Формула $X_{\text{общ}} = X_{\text{частн}} + X_{\text{одн}}$ — это не только про системы линейных уравнений. Она повторяется буквально в той же форме везде, где встречается «линейность»:

  • в линейных рекуррентных соотношениях: общее решение = частное + общее решение однородного рекуррентного уравнения;

  • в линейных дифференциальных уравнениях: общее решение = частное решение + общее решение однородного уравнения (именно там и появилось словосочетание «фундаментальная система»);

  • в задачах оптимизации с линейными ограничениями: множество допустимых точек — сдвинутое ядро матрицы ограничений, и движение внутри ядра не нарушает ограничений.

Практически же эта формула экономит массу работы. Если тебе нужно решить несколько систем с одной и той же матрицей $A$, но разными правыми частями, ядро считается один раз — оно от $b$ не зависит. Дальше для каждой правой части нужно найти только одно частное решение. Ровно эта логика стоит за тем, что в численных библиотеках матрицу разлагают один раз, а потом дёшево решают систему для каждого нового $b$.

Итог блока: сколько решений и какой они формы

Пять уроков подряд мы отвечали на один вопрос — «что делать с системой $Ax = b$». Пора собрать всё в одну картину. Пусть $A$ — матрица размера $m \times n$, $r = \operatorname{rank} A$, $\tilde{r} = \operatorname{rank}[A \mid b]$, $n$ — число неизвестных.

Случай 1: $r \ne \tilde{r}$. Система несовместна, решений нет. Множество решений пусто. Для однородной системы этот случай невозможен: там всегда $r = \tilde{r}$.

Случай 2: $r = \tilde{r} = n$. Система определённая, решение единственно. Ядро тривиально: $\ker A = \{0\}$. Множество решений — одна точка. Для однородной системы эта точка — начало координат.

Случай 3: $r = \tilde{r} < n$. Система неопределённая, решений бесконечно много. Ядро имеет дефект $n - r$, ФСР состоит из $n - r$ векторов. Множество решений — сдвиг ядра на частное решение: при $n - r = 1$ это прямая, при $n - r = 2$ — плоскость, дальше — многомерные аналоги. Для однородной системы сдвиг нулевой, и объект проходит через начало координат.

Сведём в таблицу.

Ситуация Неоднородная $Ax = b$ Однородная $Ax = 0$
$r \ne \tilde{r}$ решений нет невозможно
$r = n$ ровно одно решение только тривиальное
$r < n$ сдвинутое ядро, $n - r$ параметров ядро, $n - r$ параметров
форма множества точка / прямая / плоскость, сдвинутые точка / прямая / плоскость через ноль
решения складываются нет да

И два инструмента, которые закрывают вычислительную сторону вопроса:

  • метод Гаусса работает всегда — для любой матрицы, квадратной или прямоугольной, совместной системы или нет; именно им находят и ранг, и ФСР, и частное решение;

  • правило Крамера и матричный метод $x = A^{-1}b$ работают только в случае 2 при $m = n$, то есть когда $\det A \ne 0$; в случаях 1 и 3 они неприменимы в принципе, потому что обратной матрицы не существует.

Ещё один способ увидеть ту же картину: правило Крамера и матричный метод отвечают на вопрос «чему равно решение», а ранг с ядром — на вопрос «сколько решений и как они устроены». Второй вопрос шире и задаётся первым: пока не ответил на него, применять Крамера бессмысленно, можно нарваться на деление на ноль.

Однородные системы в машинном обучении

Ядро матрицы — одно из тех понятий, которое в ML не «применяется иногда», а лежит прямо под ногами: на нём стоит объяснение целого класса проблем, с которыми сталкивается каждый, кто обучал линейные модели.

Неидентифицируемость: когда у модели бесконечно много «правильных» ответов

Линейная модель предсказывает $\hat{y} = Xw$, где $X$ — матрица объекты-признаки размера $m \times n$ ($m$ наблюдений, $n$ признаков), $w$ — столбец весов. Обучение сводится к подбору $w$, минимизирующего ошибку.

Теперь ключевой вопрос: единственный ли этот $w$? Пусть $v \in \ker X$, то есть $Xv = 0$ и $v \ne 0$. Тогда для любого набора весов $w$:

$$X(w + v) = Xw + Xv = Xw + 0 = Xw.$$

Предсказания на обучающей выборке абсолютно те же самые. Ошибка та же, метрики те же, лосс тот же. Но веса другие. И так для любого элемента ядра, то есть для бесконечного множества наборов весов.

Правило: если $\ker X \ne \{0\}$, параметры линейной модели неидентифицируемы — существует бесконечно много наборов весов, дающих идентичные предсказания на обучающих данных.

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

Связь с уроком про обратную матрицу здесь прямая. Нормальные уравнения линейной регрессии $X^TXw = X^Ty$ имеют единственное решение $w = (X^TX)^{-1}X^Ty$ только при обратимой $X^TX$. А $X^TX$ вырождена ровно тогда, когда $\ker X \ne \{0\}$: если $Xv = 0$, то и $X^TXv = X^T \cdot 0 = 0$, то есть $v$ лежит и в ядре $X^TX$, значит $\det(X^TX) = 0$. Мультиколлинеарность, о которой ты читал раньше, и непустое ядро матрицы признаков — это буквально одно и то же явление, описанное с двух сторон.

Dummy variable trap: самый частый способ создать себе ядро

Классический сюжет. Есть категориальный признак — скажем, «город» с тремя значениями: Москва, Казань, Пермь. Кодируем его one-hot: заводим три бинарных столбца $d_1, d_2, d_3$, где $d_1 = 1$ для москвичей и 0 иначе, и так далее. Плюс, как обычно в линейной регрессии, добавляем столбец из единиц для свободного члена (intercept).

Матрица признаков выглядит так (по два наблюдения на город):

$$X = \begin{pmatrix} 1 & 1 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 0 & 0 & 1 \\ 1 & 0 & 0 & 1 \end{pmatrix}$$

Каждая строка содержит ровно одну единицу среди $d_1, d_2, d_3$ — по определению one-hot. Значит, для каждого объекта

$$d_1 + d_2 + d_3 = 1 = \text{столбец intercept}.$$

Столбцы линейно зависимы, и это порождает ядро. Найдём его: нужен вектор $v = (v_0, v_1, v_2, v_3)$, для которого $Xv = 0$. Каждая строка даёт $v_0 + v_j = 0$ для своего $j$, откуда $v_1 = v_2 = v_3 = -v_0$. Полагая $v_0 = 1$:

$$\ker X = \{\, t \cdot (1, -1, -1, -1)^T \,\}, \qquad \dim \ker X = 1.$$

Ранг матрицы равен $4 - 1 = 3$ при четырёх столбцах. Смысл найденного вектора прозрачен: «добавь $t$ к свободному члену и вычти $t$ из веса каждой категории» — предсказания не изменятся ни на одном объекте. Веса категорий определены только с точностью до общего сдвига.

Отсюда стандартное лекарство: выбросить одну категорию (drop_first=True в pandas.get_dummies, drop='first' в sklearn.preprocessing.OneHotEncoder). После выбрасывания столбцов остаётся три ($1, d_2, d_3$), они независимы, ядро схлопывается в ноль, веса определяются однозначно. Выброшенная категория становится «базовой», а веса остальных читаются как отклонения от неё.

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

Проверяем ядро в коде

Две рабочие функции — численная и символьная.

import numpy as np
from scipy.linalg import null_space

X = np.array([
    [1, 1, 0, 0],
    [1, 1, 0, 0],
    [1, 0, 1, 0],
    [1, 0, 1, 0],
    [1, 0, 0, 1],
    [1, 0, 0, 1],
], dtype=float)

print(np.linalg.matrix_rank(X))    # 3 при четырёх столбцах — ранг неполный
N = null_space(X)
print(N.shape)                     # (4, 1) — ядро одномерно
print(np.round(N / N[0, 0], 3).ravel())   # [ 1. -1. -1. -1.]

scipy.linalg.null_space возвращает матрицу, столбцы которой — ортонормированный набор образующих ядра. Их количество (N.shape[1]) и есть дефект $n - r$. Векторы нормированы, поэтому для сравнения с ручным ответом их удобно поделить на первую координату — что мы и сделали.

Символьный вариант, если нужны точные дроби, а не числа с плавающей точкой:

from sympy import Matrix

A = Matrix([[1, 2, -1, 3],
            [2, 4, -1, 1],
            [3, 6, -2, 4]])

print(A.rank())          # 2
print(A.rref())          # улучшенный ступенчатый вид и позиции пивотов
print(A.nullspace())     # список векторов ФСР

Matrix.nullspace() делает ровно то, что мы делали руками: приводит к RREF, находит свободные переменные, назначает каждой по очереди единицу. Возвращённый набор может отличаться от твоего — про неединственность ФСР мы говорили выше.

Полезный приём: null_space принимает параметр rcond, задающий порог, ниже которого сингулярное значение считается нулём. На реальных данных точных нулей не бывает — из-за шума и округлений столбцы почти никогда не зависят строго, они зависят «почти». Поэтому численный ранг — вопрос выбранного порога, и np.linalg.matrix_rank(X, tol=...) тоже принимает допуск. Это принципиальное отличие численной линейной алгебры от символьной: там, где sympy скажет «ранг 3», numpy на зашумлённых данных скажет «ранг 4, но одно сингулярное значение равно $10^{-14}$».

Ранг-дефицитные системы в реальных данных

Строгое равенство $\ker X \ne \{0\}$ на практике возникает от структурных причин: one-hot без выброшенной категории, дублирующие столбцы после неаккуратного джойна, признак, полученный арифметикой из других признаков, константный столбец в дополнение к intercept, а также ситуация $m < n$ — наблюдений меньше, чем признаков.

Последний случай стоит запомнить особо, потому что он ловится без всяких вычислений — просто из следствия 2 критерия. Если в датасете 50 объектов и 200 признаков, то $\operatorname{rank} X \le 50 < 200$, дефект минимум 150, и линейная регрессия по методу наименьших квадратов имеет бесконечно много точных решений с нулевой ошибкой на обучении. Все они идеально подгоняются под данные и все, скорее всего, никуда не годятся на новых данных. Это ровно та ситуация $p \gg n$, которая типична для геномных данных, текстовых представлений bag-of-words и любых задач с большим числом разреженных признаков.

Гораздо чаще встречается «мягкая» версия проблемы: ядро формально пусто, но матрица к вырожденной очень близка — есть направление, вдоль которого предсказания меняются едва заметно. Тогда веса не бесконечно неопределённы, но чудовищно неустойчивы: крошечное изменение данных даёт совсем другие коэффициенты. Это уже вопрос обусловленности, о которой шла речь в уроке про матричный метод; ядро — предельный случай плохой обусловленности, когда число обусловленности обращается в бесконечность.

Зачем нужна регуляризация: выбрать одно решение из бесконечности

Если решений бесконечно много и данные не позволяют выбрать между ними, выбор должен сделать кто-то другой. Этим и занимается регуляризация: она добавляет к задаче дополнительный критерий, отсекающий всё лишнее.

Гребневая регрессия (ridge, $L_2$) минимизирует $\|Xw - y\|^2 + \lambda\|w\|^2$. Второе слагаемое — штраф за большие веса. Посмотрим, что он делает с неопределённостью. Все наборы весов вида $w + v$, где $v \in \ker X$, дают одинаковое первое слагаемое. Но норма $\|w + v\|$ у них разная — и штраф однозначно выбирает тот набор, у которого норма минимальна. Бесконечное множество схлопывается в одну точку.

Проверить это можно прямо на нашей one-hot матрице. Функция numpy.linalg.lstsq в вырожденном случае возвращает именно решение минимальной нормы:

y = np.array([10., 10., 20., 20., 30., 30.])
w, *_ = np.linalg.lstsq(X, y, rcond=None)
print(np.round(w, 3))                 # [15. -5.  5. 15.]

v = N[:, 0] / N[0, 0]                 # [1, -1, -1, -1] — вектор из ядра
print(np.round(X @ w, 3))             # [10. 10. 20. 20. 30. 30.]
print(np.round(X @ (w + 5*v), 3))     # [10. 10. 20. 20. 30. 30.] — те же предсказания
print(np.linalg.norm(w), np.linalg.norm(w + 5*v))   # 22.36 против 24.49

Обрати внимание на строки вывода: предсказания у $w$ и у $w + 5v$ совпадают до последнего знака, а норма у $w$ меньше. Из бесконечного семейства одинаково хороших решений выбрано ровно одно — минимальное по длине. Тот же эффект даёт ridge при малом $\lambda$; отличие в том, что ridge делает выбор мягко и заодно чуть сдвигает решение в сторону нуля, а lstsq выбирает минимальную норму точно.

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

Анонс: собственные векторы — тоже однородная система

Напоследок — куда эта тема ведёт дальше. Одна из центральных задач линейной алгебры формулируется так: найти такие ненулевые векторы $x$ и числа $\lambda$, что $Ax = \lambda x$. Перепишем это как

$$(A - \lambda I)x = 0.$$

Это в точности однородная система с матрицей $A - \lambda I$. Нас интересуют её нетривиальные решения — и по критерию из этого урока они существуют тогда и только тогда, когда $\det(A - \lambda I) = 0$. Вся техника поиска таких $\lambda$ и соответствующих им векторов разбирается в отдельном уроке дальше по курсу; здесь важно другое — что аппарат, которым эта задача решается, ты уже полностью освоил. Однородные системы, ранг, ядро, ФСР — всё, что нужно, уже в руках.

Практика: 30 заданий

Базовые задания (1–10)

Задание 1: Имеет ли однородная система нетривиальное решение?

$$\begin{cases} 3x_1 + x_2 = 0 \\ 2x_1 + 5x_2 = 0 \end{cases}$$

Задание 2: Имеет ли система нетривиальное решение, и если да — найди его общее решение.

$$\begin{cases} x_1 + 2x_2 + 3x_3 = 0 \\ 4x_1 + 5x_2 + 6x_3 = 0 \\ 7x_1 + 8x_2 + 9x_3 = 0 \end{cases}$$

Задание 3: Однородная система состоит из 4 уравнений с 6 неизвестными. Можно ли утверждать, что у неё есть нетривиальное решение, не зная коэффициентов?


Задание 4: Матрица $A$ имеет размер $4 \times 6$ и ранг 3. Какова размерность ядра $\ker A$? Сколько решений будет в ФСР?


Задание 5: Для матрицы $A = \begin{pmatrix} 1 & -1 & 1 \\ 3 & -1 & -1 \\ 2 & 0 & -2 \end{pmatrix}$ проверь, входят ли в её ядро векторы $u = (1, 2, 1)^T$ и $v = (1, 1, 1)^T$.


Задание 6: Найди ФСР системы

$$\begin{cases} x_1 - 2x_2 + x_3 = 0 \\ 2x_1 - 4x_2 + 2x_3 = 0 \end{cases}$$

Задание 7: Найди ФСР системы

$$\begin{cases} x_1 + x_2 + x_3 = 0 \\ x_1 - x_2 + 3x_3 = 0 \end{cases}$$

Задание 8: Что представляет собой ядро матрицы $A = \begin{pmatrix} 1 & 2 & 0 \\ 0 & 1 & 1 \\ 1 & 3 & 1 \end{pmatrix}$ геометрически — точку, прямую или плоскость? Найди его.


Задание 9: Запиши общее решение однородной системы, состоящей из одного уравнения $x_1 - 2x_2 + 3x_3 = 0$. Что это за множество геометрически?


Задание 10: Докажи, что система имеет только тривиальное решение, не решая её.

$$\begin{cases} x_1 + 2x_2 + x_3 = 0 \\ 2x_1 + x_2 + 3x_3 = 0 \\ 3x_1 + 3x_2 + 5x_3 = 0 \end{cases}$$

Средние задания (11–20)

Задание 11: Найди ФСР и общее решение системы

$$\begin{cases} x_1 + x_2 + 2x_3 - x_4 = 0 \\ 2x_1 + x_2 + 3x_3 + x_4 = 0 \\ 3x_1 + 2x_2 + 5x_3 = 0 \end{cases}$$

Задание 12: Найди ФСР системы

$$\begin{cases} x_1 + 2x_2 + x_4 + x_5 = 0 \\ 2x_1 + 4x_2 + x_3 + 3x_4 + x_5 = 0 \\ x_1 + 2x_2 + x_3 + 2x_4 = 0 \\ x_3 + x_4 - x_5 = 0 \end{cases}$$

Задание 13: Найди ФСР системы

$$\begin{cases} x_1 - 2x_2 + x_4 = 0 \\ 2x_1 - 4x_2 + x_3 - x_4 = 0 \end{cases}$$

Задание 14: При каких значениях параметра $a$ система имеет нетривиальное решение? Найди это решение для каждого критического значения.

$$\begin{cases} ax_1 + 4x_2 = 0 \\ x_1 + ax_2 = 0 \end{cases}$$

Задание 15: При каком значении параметра $a$ система имеет нетривиальное решение? Найди общее решение при этом значении.

$$\begin{cases} x_1 + 2x_2 + 3x_3 = 0 \\ 2x_1 - x_2 + x_3 = 0 \\ 3x_1 + x_2 + ax_3 = 0 \end{cases}$$

Задание 16: Найди общее решение неоднородной системы, представив его в виде «частное решение плюс общее решение однородной».

$$\begin{cases} x_1 + x_2 - x_3 = 2 \\ 2x_1 + 3x_2 + x_3 = 7 \end{cases}$$

Задание 17: Найди общее решение системы в виде $X_{\text{частн}} + X_{\text{одн}}$.

$$\begin{cases} x_1 + 2x_2 + x_3 + x_4 = 5 \\ 2x_1 + 4x_2 + x_3 + 3x_4 = 8 \\ 3x_1 + 6x_2 + 2x_3 + 4x_4 = 13 \end{cases}$$

Задание 18: Проверь, образуют ли векторы $X_1 = (-1, 0, 1, 0)^T$ и $X_2 = (0, -1, 0, 1)^T$ фундаментальную систему решений для

$$\begin{cases} x_1 + x_2 + x_3 + x_4 = 0 \\ x_1 - x_2 + x_3 - x_4 = 0 \end{cases}$$

Задание 19: Построй однородную систему из двух уравнений с тремя неизвестными, ядро матрицы которой — прямая, проходящая через начало координат в направлении вектора $(1, 2, 3)$.


Задание 20: Уравняй химическую реакцию горения водорода $\mathrm{H_2} + \mathrm{O_2} \to \mathrm{H_2O}$, составив и решив однородную систему.


Продвинутые задания (21–30)

Задание 21: При каких значениях параметра $a$ система имеет нетривиальное решение? Для каждого такого значения найди размерность ядра и ФСР.

$$\begin{cases} ax_1 + x_2 + x_3 = 0 \\ x_1 + ax_2 + x_3 = 0 \\ x_1 + x_2 + ax_3 = 0 \end{cases}$$

Задание 22: При каких значениях параметра $a$ система имеет нетривиальное решение? Найди ФСР для каждого критического значения.

$$\begin{cases} ax_1 + 2x_2 = 0 \\ x_1 + ax_2 + x_3 = 0 \\ 2x_2 + ax_3 = 0 \end{cases}$$

Задание 23: Обобщи задание 21 на четыре неизвестных: при каких $a$ система имеет нетривиальное решение и какова размерность ядра?

$$\begin{cases} ax_1 + x_2 + x_3 + x_4 = 0 \\ x_1 + ax_2 + x_3 + x_4 = 0 \\ x_1 + x_2 + ax_3 + x_4 = 0 \\ x_1 + x_2 + x_3 + ax_4 = 0 \end{cases}$$

Задание 24: Построй однородную систему с четырьмя неизвестными, ФСР которой состоит из векторов $X_1 = (1, 0, -1, 2)^T$ и $X_2 = (0, 1, 1, -1)^T$.


Задание 25: Ядро матрицы $A$ размера $m \times 3$ — плоскость, проходящая через начало координат и содержащая векторы $(1, 1, 0)$ и $(0, 1, 1)$. Найди простейшую систему, задающую это ядро, и укажи ранг $A$.


Задание 26 (ML): Категориальный признак «город» с тремя значениями закодирован one-hot без выброшенной категории, к нему добавлен столбец единиц для свободного члена. Матрица признаков (по два наблюдения на город):

$$X = \begin{pmatrix} 1 & 1 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 0 & 0 & 1 \\ 1 & 0 & 0 & 1 \end{pmatrix}$$

Найди ранг, размерность ядра и ФСР. Объясни, что это означает для весов линейной модели.


Задание 27: В сети три узла $A$, $B$, $C$ и четыре направленных канала: $x_1$ из $A$ в $B$, $x_2$ из $B$ в $C$, $x_3$ из $C$ в $A$, $x_4$ из $A$ в $C$. В каждом узле приток равен оттоку. Найди все возможные распределения потоков.


Задание 28: К точке приложены три силы, направленные вдоль векторов $d_1 = (3, 4)$, $d_2 = (-1, 0)$, $d_3 = (-1, -2)$, с неизвестными величинами $c_1, c_2, c_3$. При каких $c_i$ точка находится в равновесии (сумма сил равна нулю)?


Задание 29: Пусть $X_1$ и $X_2$ — два различных решения совместной системы $Ax = b$. Докажи: (а) $X_1 - X_2$ лежит в $\ker A$; (б) при любом числе $t$ вектор $X_1 + t(X_1 - X_2)$ тоже решение системы $Ax = b$; (в) если у системы есть хотя бы два различных решения, то их бесконечно много.


Задание 30: Уравняй реакцию $\mathrm{Fe} + \mathrm{O_2} \to \mathrm{Fe_2O_3}$ через однородную систему. Объясни, почему ответ определён однозначно, хотя решений бесконечно много.


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

Ошибка 1. «Проверим по теореме Кронекера — Капелли, совместна ли однородная система».

Как выглядит: решающий добросовестно выписывает расширенную матрицу $[A \mid 0]$, приводит её к ступенчатому виду, сравнивает ранги, радуется совпадению и пишет «система совместна».

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

Как правильно: для однородной системы $\operatorname{rank}[A \mid 0] = \operatorname{rank} A$ тождественно, при любой матрице. Проверка не несёт информации и только тратит время. Столбец свободных членов вообще не нужно выписывать — он нулевой и останется нулевым после любых элементарных преобразований. Правильный вопрос — «есть ли нетривиальное решение», то есть верно ли, что $\operatorname{rank} A < n$.

Ошибка 2. «ФСР состоит из нулевого вектора».

Как выглядит: при $r = n$ пишут «ФСР $= \{(0, 0, 0)\}$» вместо «ФСР пуста».

Почему возникает: кажется, что «раз решение есть, его надо куда-то записать».

Как правильно: нулевой вектор не может входить в ФСР: набор с нулевым вектором заведомо избыточен, ведь ноль получается умножением любого вектора на 0 и никакой информации не добавляет. При $r = n$ количество векторов в ФСР равно $n - r = 0$, то есть ФСР — пустой набор, а ядро состоит из единственного элемента $\{0\}$.

Ошибка 3. Путают размерность ядра с числом уравнений.

Как выглядит: «матрица $2 \times 5$, значит дефект равен $5 - 2 = 3$» — и это правильный ответ, но по неправильной причине; на матрице $4 \times 5$ ранга 2 тот же ход рассуждений даёт неверное $5 - 4 = 1$ вместо верного $5 - 2 = 3$.

Почему возникает: число строк совпадает с рангом только тогда, когда все строки независимы, и на простых примерах это часто так.

Как правильно: $\dim \ker A = n - \operatorname{rank} A$, где $n$ — число столбцов. Ранг надо посчитать, а не подставить вместо него число строк. Единственное, что даёт число строк без вычислений, — это оценка $\operatorname{rank} A \le m$, из которой следует $\dim\ker A \ge n - m$.

Ошибка 4. «Мой ответ не совпал с ответом задачника — значит, я ошибся».

Как выглядит: решение верное, но ФСР записана через другие свободные переменные, и векторы выглядят иначе.

Почему возникает: привычка сверять ответ буквально.

Как правильно: ФСР не единственна. Проверять надо три вещи: каждый вектор — решение (подстановка даёт нули); количество векторов равно $n - r$; векторы из «эталонного» ответа выражаются через твои. Если всё сошлось, ответ верен, хотя и выглядит по-другому.

Ошибка 5. Складывают решения неоднородной системы.

Как выглядит: найдя два решения $Ax = b$, складывают их и заявляют, что сумма — тоже решение.

Почему возникает: принцип суперпозиции запоминается как «решения складываются» без уточнения, что это верно только для однородного случая.

Как правильно: $A(X_1 + X_2) = 2b \ne b$ при $b \ne 0$. Складывать можно решения однородной системы; из решений неоднородной складывать можно только так: «одно решение неоднородной плюс любое решение однородной».

Ошибка 6. «У однородной квадратной системы с $\det A = 0$ решений бесконечно много, значит их размерность равна 1».

Как выглядит: автоматически пишут «дефект 1» всякий раз, когда определитель обнулился.

Почему возникает: большинство учебных примеров действительно имеют дефект 1, и это закрепляется как правило.

Как правильно: $\det A = 0$ означает только $r < n$, а насколько меньше — вопрос отдельного вычисления. В задании 21 при $a = 1$ ранг падал сразу до 1, и дефект был равен 2, а не 1. Всегда считай ранг явно.

Ошибка 7. При построении ФСР назначают свободным переменным произвольные значения вроде $(1, 1)$ и $(2, 0)$.

Как выглядит: вместо «единица и нули» подставляют что попало, получают два решения и объявляют их фундаментальной системой.

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

Как правильно: набор из $n - r$ решений действительно можно выбрать по-разному, но при произвольных подстановках легко получить векторы, выражающиеся друг через друга — и тогда набор перестанет быть фундаментальным. Схема «$i$-й свободной единица, остальным нули» гарантирует нужное свойство автоматически и требует минимума арифметики.

Ошибка 8. В задачах с параметром находят корни $\det A(a) = 0$ и на этом останавливаются.

Как выглядит: «нетривиальное решение при $a = 1$ и $a = -2$» — и всё, ФСР не найдена, размерность ядра не указана.

Почему возникает: критерий через определитель кажется исчерпывающим ответом.

Как правильно: определитель отвечает только на вопрос «есть или нет». Ранг при разных критических значениях может падать по-разному, и дефект — тоже. Подставь каждое найденное значение параметра в матрицу и доведи решение до ФСР, как в заданиях 21–23.

Ошибка 9. Забывают, что при поиске частного решения свободные переменные можно занулить.

Как выглядит: мучительный подбор частного решения перебором или решение системы «в лоб» с дробями.

Почему возникает: частное решение воспринимается как «какое-то особенное».

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

Ошибка 10. Считают, что ядро зависит от правой части системы.

Как выглядит: при решении нескольких систем с одной матрицей $A$ и разными $b$ заново ищут ФСР для каждой.

Почему возникает: ядро находится «в процессе решения системы» и мысленно привязывается к ней целиком.

Как правильно: $\ker A$ определяется только матрицей $A$. Меняя $b$, ты меняешь частное решение и сам факт совместности, но не ядро. Посчитал ФСР один раз — используй для всех правых частей.

Главное запомнить

  • Однородная система — это $Ax = 0$. Она всегда совместна: нулевой вектор является её решением при любой матрице $A$.

  • Тривиальное решение — нулевое; нетривиальное — любое ненулевое. Вопрос о совместности для однородной системы бессмысленен, потому что $\operatorname{rank}[A \mid 0] = \operatorname{rank} A$ тождественно.

  • Критерий: нетривиальное решение существует тогда и только тогда, когда $\operatorname{rank} A < n$, где $n$ — число неизвестных.

  • Для квадратной системы критерий равносилен $\det A = 0$. Если уравнений меньше, чем неизвестных ($m < n$), нетривиальное решение есть всегда.

  • Принцип суперпозиции: сумма решений однородной системы — решение, решение, умноженное на число, — решение. Для неоднородной системы это неверно.

  • Ядро (нуль-пространство) $\ker A$ — множество всех решений $Ax = 0$, то есть всё, что матрица «убивает в ноль». Оно всегда содержит начало координат и геометрически представляет собой точку, прямую, плоскость или их многомерный аналог.

  • $\dim \ker A = n - \operatorname{rank} A$ — размерность ядра (дефект) считается по числу столбцов, а не строк.

  • ФСР — набор из ровно $n - r$ решений, через которые линейными комбинациями выражаются все остальные. Строится по алгоритму: RREF, разделение переменных на базисные и свободные, поочерёдное назначение свободным единицы при нулях у остальных.

  • ФСР не единственна: другой набор свободных переменных даёт другие векторы, но то же множество решений. Проверка ответа — три пункта: решения, количество $n - r$, выразимость эталонных векторов.

  • Структура общего решения: $X_{\text{общ}} = X_{\text{частн}} + X_{\text{одн}}$. Множество решений $Ax = b$ — это ядро, сдвинутое на любое частное решение; частное решение можно брать любое, множество от этого не меняется.

  • Ядро зависит только от матрицы $A$ и не зависит от правой части $b$.

  • Число решений системы: ноль (несовместна), одно ($r = n$) или бесконечно много ($r < n$). Ровно двух или ровно трёх решений у линейной системы не бывает.

  • В ML непустое ядро матрицы признаков означает неидентифицируемость весов: бесконечно много наборов весов дают одинаковые предсказания. Типичный источник — one-hot без выброшенной категории.

Связь с другими темами курса

Что нужно было знать до этого урока

Урок опирается на весь блок про системы линейных уравнений. Из урока 157 взято распределительное свойство умножения матрицы на столбец — без него не доказать принцип суперпозиции. Из уроков 158–160 — техника вычисления определителей, которая даёт быстрый критерий $\det A = 0$ для квадратных систем и решает задачи с параметром. Из урока 161 — связка «$\det A \ne 0 \Leftrightarrow$ существует $A^{-1}$», которая теперь дополнилась третьей эквивалентной формулировкой: «ядро тривиально». Из урока 162 — ранг и элементарные преобразования, главный рабочий инструмент всего урока. Из урока 163 — теорема Кронекера — Капелли, базисные и свободные переменные, понятия общего и частного решения. Из урока 164 — метод Гаусса, прямой и обратный ход, улучшенный ступенчатый вид, разбор систем с параметром. Из уроков 165–166 — понимание границ применимости правила Крамера и матричного метода: оба работают только при $\det A \ne 0$, то есть ровно в том случае, когда ядро тривиально и вся тема этого урока вырождается.

Что изучить дальше

Урок 168 «Векторные пространства» даст аксиоматику того, что мы здесь описали руками: ядро матрицы окажется примером векторного пространства (точнее, подпространства в $\mathbb{R}^n$), а принцип суперпозиции — просто проверкой аксиом замкнутости. Урок 169 «Линейная зависимость векторов» формализует то, что мы обходили словами «ни один вектор не выражается через остальные». Урок 170 «Базис и размерность» объяснит, почему ФСР — это базис ядра, почему количество векторов в ней не зависит от способа построения и почему «размерность ядра» — корректно определённое число, а не свойство выбранного пути решения. Урок 172 «Собственные векторы и собственные значения» сведёт задачу $Ax = \lambda x$ к однородной системе $(A - \lambda I)x = 0$: критерий из этого урока превратится там в характеристическое уравнение $\det(A - \lambda I) = 0$, а собственные векторы — в ФСР соответствующего ядра. Дальше, в уроке 173 «Диагонализация», размерности этих ядер определят, диагонализуема матрица или нет.

Где это нужно в жизни

💻 Программирование. Функции scipy.linalg.null_space, sympy.Matrix.nullspace(), numpy.linalg.matrix_rank — прямая реализация материала урока. В компьютерной графике ядро матрицы проекции описывает направление, теряющееся при проецировании сцены на экран; в системах компьютерной алгебры решение $Ax = 0$ лежит в основе упрощения символьных выражений.

🤖 ML/AI. Неидентифицируемость параметров, мультиколлинеарность, dummy variable trap, ситуация $p > n$ (признаков больше, чем объектов), выбор решения минимальной нормы через lstsq и через ridge-регуляризацию — всё это разные обличья одного вопроса «пусто ли ядро матрицы признаков». Плюс собственные векторы, на которых стоят PCA и спектральные методы, находятся как решения однородных систем.

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

🔬 Наука. Балансировка химических реакций (дефект равен 1 — коэффициенты определены с точностью до множителя), анализ сетей потоков и электрических цепей по законам Кирхгофа, статика конструкций, где ядро матрицы жёсткости описывает движения без деформации. В квантовой механике стационарные состояния — решения однородного уравнения $(\hat{H} - E)\psi = 0$.

💰 Финансы. Арбитражные портфели — нетривиальные решения однородной системы «нулевая стоимость сейчас, неотрицательный доход потом»; отсутствие арбитража формулируется как условие на ядро матрицы платежей. В факторных моделях доходности линейно зависимые факторы делают веса неидентифицируемыми точно так же, как в регрессии.

Интересные факты

  • Парадокс Крамера — тот самый сюжет с девятью точками и кубическими кривыми — обсуждался в переписке Габриэля Крамера и Леонарда Эйлера в 1744–1750 годах. Эйлер опубликовал разбор в работе с говорящим названием «О кажущемся противоречии в учении о кривых линиях» (1750), где по существу объяснил, что уравнения могут быть зависимыми. Термина «ранг» тогда не существовало — он появится только через сто лет.

  • Слово nullity («дефект») ввёл Джеймс Джозеф Сильвестр в 1884 году, в тот же период, когда он сформулировал «закон дефекта» (law of nullity) — неравенство, связывающее дефект произведения матриц с дефектами сомножителей. Сильвестр вообще любил придумывать термины: ему принадлежат также слова «матрица», «дискриминант» и «якобиан».

  • Термин Fundamentalsystem (фундаментальная система) пришёл в алгебру из теории дифференциальных уравнений, где его в 1860-х употреблял Лазарус Фукс. Структура ответа там в точности та же, что и у нас: общее решение линейного однородного дифференциального уравнения — линейная комбинация конечного набора базисных решений, а общее решение неоднородного — частное плюс общее однородного.

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

  • Численно ядро матрицы почти никогда не ищут методом Гаусса. scipy.linalg.null_space использует сингулярное разложение и считает нулевыми те сингулярные значения, которые меньше заданного порога. Причина в устойчивости: на данных с округлениями строгая линейная зависимость превращается в «почти зависимость», и наивная редукция может выдать полный ранг там, где фактически ранг неполный, — или наоборот.

Лайфхаки и полезные трюки

  1. Не выписывай нулевой столбец. Для однородной системы работай с матрицей $A$, а не с расширенной $[A \mid 0]$. Нули справа останутся нулями при любых преобразованиях, и переписывание их на каждом шаге — чистая трата времени и лишний повод ошибиться.

  2. Сначала посчитай $m$ и $n$. Если уравнений меньше, чем неизвестных, нетривиальное решение есть гарантированно — иногда это и есть весь требуемый ответ. Например, «система из трёх уравнений с пятью неизвестными» отвечается мгновенно, без единого вычисления.

  3. Для квадратной системы начинай с определителя. Если $\det A \ne 0$ — ответ «только тривиальное решение», и никакой ступенчатый вид не нужен. Особенно выгодно на матрицах $2\times2$ и $3\times3$, где определитель считается за десять секунд.

  4. Ищи зависимость строк глазами. Прежде чем гнать прямой ход, проверь, не является ли одна строка суммой или кратным других. В задании 8 третья строка равнялась сумме первых двух — это сразу дало $\det = 0$ и ранг не больше 2, ещё до вычислений. То же самое: если сумма всех строк равна нулевой строке (как в сетевых балансах и в матрицах из заданий 21 и 23), ранг заведомо неполный.

  5. Доводи до RREF, а не до обычного ступенчатого вида. Лишние две-три операции сверху вниз избавляют от обратной подстановки: базисные переменные сразу выражаются через свободные, и ФСР выписывается прямо из матрицы, без арифметики. На системах с двумя-тремя свободными переменными это экономит больше, чем стоит.

  6. Проверяй каждый вектор ФСР подстановкой. Это занимает полминуты на вектор и ловит почти все арифметические ошибки. Проверять надо в исходной системе, а не в приведённой: ошибка могла закрасться в сами преобразования, и тогда проверка по ступенчатому виду её не увидит.

  7. Считай ядро один раз на матрицу. Если решаешь серию систем с одной и той же матрицей $A$ и разными правыми частями, ФСР находится однократно. Для каждой новой правой части остаётся найти только частное решение — обычно занулением свободных переменных.

  8. В задачах с параметром не останавливайся на корнях определителя. Найденные значения обязательно подставь обратно в матрицу и посчитай ранг: он может упасть не на единицу, а сразу на две, и тогда дефект будет больше. Кратный корень определителя — характерный признак того, что стоит присмотреться внимательнее.

  9. Сверяйся с кодом, но осознанно. sympy.Matrix(A).nullspace() даёт точный ответ в дробях и почти наверняка вернёт другую ФСР, чем получилась у тебя, — это нормально. Проверяй не совпадение векторов, а три пункта: решения, количество $n - r$, взаимная выразимость.

Однородные системы закрывают весь блок про системы линейных уравнений — и закрывают его аккуратно. Мы начинали с вопроса «сколько решений», прошли через Гаусса, Крамера и матричный метод, а закончили полным описанием: множество решений любой системы — это ядро матрицы, сдвинутое на одно частное решение. Всё, что дальше происходит в линейной алгебре, вырастает из этой картинки. Векторные пространства формализуют то, чем оказалось ядро; базис и размерность объяснят, почему ФСР устроена именно так; собственные векторы окажутся ядрами матриц вида $A - \lambda I$. Так что ощущение «наконец-то всё сошлось в одну схему» здесь совершенно уместное — но это ещё и трамплин, а не финиш.

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!