Три товара, три чека
В магазине три товара: хлеб, молоко, сыр. Три покупателя:
Первый купил 2 хлеба, 1 молоко, 1 сыр — заплатил 500 ₽.
Второй: 1 хлеб, 3 молока, 2 сыра — 900 ₽.
Третий: 1 хлеб, 1 молоко, 3 сыра — 1100 ₽.
Задача: сколько стоит каждый товар?
В прошлом уроке мы решали A·x = b через обратную матрицу: x = A⁻¹·b. Это элегантно, но работает только когда A квадратная и det(A) ≠ 0. А если уравнений больше, чем неизвестных? Или меньше? Или определитель ноль?
Нужен метод, который справится с любой ситуацией. Он называется метод Гаусса — и ему больше 200 лет. Начнём с простой системы двух уравнений:
2x + y = 5
x − y = 1
Идея Гаусса: превратить систему в такую, где ответ видно сразу. Делаем это поэтапными преобразованиями — вычитаем одно уравнение из другого, чтобы убрать неизвестные.
Запишем систему как матрицу — расширенную матрицу, где правая часть приписана через вертикальную черту:
[[2, 1 | 5],
[1, −1 | 1]]
Теперь работаем только с числами, не с буквами. Цель — получить нули под главной диагональю.
Шаг 1: поменяем строки местами, чтобы слева вверху была единица (так удобнее):
[[1, −1 | 1],
[2, 1 | 5]]
Шаг 2: из второй строки вычтем первую, умноженную на 2 (чтобы убить двойку в левом нижнем углу):
строка₂ − 2·строка₁: (2−2, 1−(−2), 5−2) = (0, 3, 3)
[[1, −1 | 1],
[0, 3 | 3]]
Готово. Под диагональю — ноль. Нижняя строка говорит: 3y = 3, значит y = 1. Подставляем в первую: x − 1 = 1, значит x = 2.
Теперь система 3×3 — из задачи про магазин. Обозначим: x — хлеб, y — молоко, z — сыр.
2x + y + z = 500
x + 3y + 2z = 900
x + y + 3z = 1100
Расширенная матрица:
[[2, 1, 1 | 500],
[1, 3, 2 | 900],
[1, 1, 3 | 1100]]
Шаг 1: поменяем строку 1 и строку 2 (чтобы единица была вверху):
[[1, 3, 2 | 900],
[2, 1, 1 | 500],
[1, 1, 3 | 1100]]
Шаг 2: строка₂ − 2·строка₁, строка₃ − строка₁:
[[1, 3, 2 | 900],
[0, −5, −3 | −1300],
[0, −2, 1 | 200]]
Шаг 3: строка₃ − (2/5)·строка₂:
строка₃: (0−0, −2−(−2), 1−(−6/5), 200−(−520))
= (0, 0, 1+1.2, 200+520) = (0, 0, 2.2, 720)
Умножим на 5 для аккуратности — пересчитаем точнее:
строка₃ · 5 = (0, −10, 5, 1000)
строка₂ · 2 = (0, −10, −6, −2600)
строка₃·5 − строка₂·2 = (0, 0, 11, 3600)
[[1, 3, 2 | 900],
[0, −5, −3 | −1300],
[0, 0, 11 | 3600]]
Ступенчатый вид. Читаем снизу вверх:
11z = 3600 → z ≈ 327.3
Хм, дробное число для цены — некрасиво. Давайте возьмём более ровные числа. Изменим задачу: пусть третий покупатель заплатил 1000 ₽ вместо 1100 ₽:
[[1, 3, 2 | 900],
[0, −5, −3 | −1300],
[0, −2, 1 | 100]]
Строка₃·5 − строка₂·2:
(0, −10, 5, 500) − (0, −10, −6, −2600) = (0, 0, 11, 3100)
Нет, тоже некрасиво.
Ладно — сила метода Гаусса не в красивых числах, а в том, что он работает всегда. Вернёмся к оригинальной задаче и решим до конца:
11z = 3600 → z = 3600/11
−5y − 3·(3600/11) = −1300
−5y = −1300 + 10800/11 = (−14300 + 10800)/11 = −3500/11
y = 700/11
x + 3·(700/11) + 2·(3600/11) = 900
x = 900 − 2100/11 − 7200/11 = (9900 − 9300)/11 = 600/11
Не целые числа — но это нормально. Метод Гаусса нашёл точное решение для любых входных данных. В реальных задачах числа почти никогда не бывают красивыми.
Метод Гаусса хорош ещё и тем, что сразу показывает, когда система не имеет решения. Вот пример:
x + y = 3
2x + 2y = 8
Расширенная матрица:
[[1, 1 | 3],
[2, 2 | 8]]
Строка₂ − 2·строка₁:
[[1, 1 | 3],
[0, 0 | 2]]
Нижняя строка говорит: 0·x + 0·y = 2. Ноль равен двум? Абсурд. Система несовместна — решений нет. Геометрически это две параллельные прямые: x + y = 3 и x + y = 4. Они не пересекаются.
А если правая часть тоже обнулилась?
x + y = 3
2x + 2y = 6 → строка₂ − 2·строка₁:
[[1, 1 | 3],
[0, 0 | 0]]
Нижняя строка: 0 = 0. Не абсурд, но и не информация. Одно уравнение, два неизвестных — бесконечно много решений. Любая пара (x, 3−x) подходит: (0, 3), (1, 2), (−5, 8)... Итого метод Гаусса после приведения к ступенчатому виду даёт один из трёх результатов:
1. Ступеньки в каждом столбце → единственное решение
2. Строка вида (0 0 ... 0 | число≠0) → решений нет
3. Нулевые строки, свободные переменные → бесконечно много решений
Расширенная матрица — матрица системы с приписанным столбцом правых частей.
Метод Гаусса: элементарными операциями со строками привести к ступенчатому виду, затем обратный ход.
Три исхода: единственное решение (полная ступенька), нет решений (строка 0=число), бесконечно много (свободные переменные).