Ранг матрицы и совместность системы

Ранг говорит, сколько «настоящих» уравнений в системе, а сравнение рангов — есть ли у неё решение.

Ранг матрицы — число линейно независимых строк (оно же равно числу независимых столбцов); это «эффективное» число уравнений.

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

Что такое ранг

Приведём матрицу методом Гаусса к ступенчатому виду и посчитаем ненулевые строки — это и есть ранг. Если из трёх уравнений одно оказалось комбинацией двух других, после исключения оно превратится в строку из нулей, и ранг будет равен 2, а не 3.

Критерий совместности

Сравниваем ранг матрицы коэффициентов $A$ и ранг расширенной матрицы $[A \mid \vec{b}]$ (теорема Кронекера–Капелли):

$$\text{rank}(A) = \text{rank}([A \mid b]) = n \;\Rightarrow\; \text{единственное решение}$$

$$\text{rank}(A) = \text{rank}([A \mid b]) \lt n \;\Rightarrow\; \text{бесконечно много}$$

$$\text{rank}(A) \lt \text{rank}([A \mid b]) \;\Rightarrow\; \text{решений нет}$$

def rank(M, eps=1e-9):
    M = [row[:] for row in M]
    rows, cols = len(M), len(M[0])
    r = 0
    for col in range(cols):
        piv = None
        for i in range(r, rows):
            if abs(M[i][col]) > eps:
                piv = i
                break
        if piv is None:
            continue
        M[r], M[piv] = M[piv], M[r]
        pv = M[r][col]
        for i in range(rows):
            if i != r and abs(M[i][col]) > eps:
                f = M[i][col] / pv
                for c in range(col, cols):
                    M[i][c] -= f * M[r][c]
        r += 1
    return r

A = [[1, 2, 3], [2, 4, 6], [1, 1, 1]]  # вторая строка = 2 x первой
print("rank(A) =", rank(A))

Вывод:

rank(A) = 2

Где спряталась зависимость

Вторая строка $(2, 4, 6)$ — ровно удвоенная первая $(1, 2, 3)$, поэтому она не добавляет нового и при исключении обнуляется. Остаётся 2 независимые строки, ранг равен 2. Если бы все три строки были независимы, ранг был бы 3 и матрица была бы невырожденной.

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

Функция rank — это тот же прямой ход метода Гаусса, но мы не решаем систему, а лишь считаем, сколько ведущих элементов (pivots) удалось найти. Каждый pivot отвечает одной независимой строке. Параметр eps нужен потому, что в числах с плавающей точкой «ноль» почти никогда не бывает идеальным: элемент, который теоретически равен нулю, на практике может быть $10^{-16}$, и его нужно считать нулём. Замечательный факт линейной алгебры: ранг по строкам всегда равен рангу по столбцам.

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

  • Считать ранг по числу строк матрицы. Ранг — число независимых строк, оно может быть меньше.
  • Сравнивать только размеры, забыв про расширенную матрицу. Совместность определяется сравнением $\text{rank}(A)$ и $\text{rank}([A \mid b])$, а не просто формой $A$.
  • Использовать строгое сравнение с нулём для чисел с плавающей точкой. Нужен порог eps, иначе крошечные остатки округления исказят ранг.

Итог

  • Ранг — число линейно независимых строк (= столбцов) матрицы.
  • Считают ранг, приводя матрицу к ступенчатому виду и подсчитывая ненулевые строки.
  • Кронекер–Капелли: система совместна ⇔ $\text{rank}(A) = \text{rank}([A \mid b])$.
  • Если этот общий ранг меньше числа неизвестных — решений бесконечно много.
Проверьте себя
1. Ранг матрицы — это:
Aчисло всех её строк
Bчисло линейно независимых строк (или столбцов)
Cсумма элементов диагонали
Dнаибольший элемент
2. По теореме Кронекера-Капелли система несовместна (нет решений), когда:
Arank(A) = rank([A|b])
Brank(A) < rank([A|b])
Crank(A) > n
Dопределитель равен 1
3. Почему при подсчёте ранга чисел с плавающей точкой нужен порог eps?
Aдля скорости
Bпотому что теоретический ноль на практике может быть крошечным ненулевым числом из-за округления
Cчтобы получить целый ранг
Deps не нужен