Ранг матрицы и совместность системы
Ранг говорит, сколько «настоящих» уравнений в системе, а сравнение рангов — есть ли у неё решение.
Ранг матрицы — число линейно независимых строк (оно же равно числу независимых столбцов); это «эффективное» число уравнений.
Не все уравнения в системе несут новую информацию: одно может быть следствием других. Ранг измеряет, сколько в системе по-настоящему независимых ограничений. Сравнивая ранги, мы строго определяем, совместна система или нет.
Что такое ранг
Приведём матрицу методом Гаусса к ступенчатому виду и посчитаем ненулевые строки — это и есть ранг. Если из трёх уравнений одно оказалось комбинацией двух других, после исключения оно превратится в строку из нулей, и ранг будет равен 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])$.
- Если этот общий ранг меньше числа неизвестных — решений бесконечно много.