Перейти к содержанию

Метод Гаусса

Материал из Мегавики — свободной энциклопедии

Ме́тод Га́усса (англ. Row reduction) — метод последовательного исключения неизвестных для нахождения решений системы линейных алгебраических уравнений (СЛАУ). Назван в честь немецкого математика Карла Фридриха Гаусса. Это метод последовательного исключения неизвестных, когда используя диагональные элементы (ведущий элемент), с помощью элементарных преобразований система уравнений приводится к равносильной системе верхнего треугольного вида, которая может быть представлена как матрица в ступенчатом виде. Из этого приведенного вида последовательно, начиная с последних (по номеру), находятся все неизвестные системы[1].

Описание метода[править]

Для решения системы состоящей из m линейных уравнений надо получить m ведущих элементов. Ноль не может выступать ведущим элементом. Ведущие элементы располагаются на диагонали верхней треугольной матрицы после применения элементарных преобразований.

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

{a11x1++a1nxn=b1am1x1++amnxn=bm

Её можно записать в матричном виде:

Ax=b,

где

A=(a11a1nam1amn),x=(x1xn),b=(b1bm).(1)

Матрица A называется основной матрицей системы, b — столбцом свободных членов.

Также используется написание расширенной матрицы (англ. augmented matrix), в которой вертикальная черта ставится там, где должен быть символ равенства: [a11a1nb1am1amnbm]

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

{α1j1xj1+α1j2xj2++α1jrxjr++α1jnxjn=β1α2j2xj2++α2jrxjr++α2jnxjn=β2αrjrxjr++αrjnxjn=βr0=βr+10=βm,

где α1j1,,αrjr0.

При этом будем считать, что базисный минор (ненулевой минор максимального порядка) основной матрицы находится в верхнем левом углу, то есть в него входят только коэффициенты при переменных xj1,,xjr[2].

Тогда переменные xj1,,xjr называются главными переменными. Все остальные называются свободными.

Если хотя бы одно число βi0, где i>r, то рассматриваемая система несовместна, т. е. у неё нет ни одного решения.

Пусть βi=0 для любых i>r.

Перенесём свободные переменные за знаки равенств и поделим каждое из уравнений системы на свой коэффициент при самом левом x (αiji,i=1,,r, где i — номер строки):

{xj1+α^1j2xj2++α^1jrxjr=β^1α^1jr+1xjr+1α^1jnxjnxj2++α^2jrxjr=β^2α^2jr+1xjr+1α^2jnxjnxjr=β^rα^rjr+1xjr+1α^rjnxjn,β^i=βiαiji,α^ijk=αijkαiji(2),

где i=1,,r,k=i+1,,n.

Если свободным переменным системы (2) придавать все возможные значения и решать новую систему относительно главных неизвестных снизу вверх (то есть от нижнего уравнения к верхнему), то мы получим все решения этой СЛАУ. Так как эта система получена путём элементарных преобразований над исходной системой (1), то по теореме об эквивалентности при элементарных преобразованиях системы (1) и (2) эквивалентны, то есть множества их решений совпадают.

Следствия:
1: Если в совместной системе все переменные главные, то такая система является определённой.

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

Критерий совместности[править]

Упомянутое выше условие βi=0 для всех i>r может быть сформулировано в качестве необходимого и достаточного условия совместности:

Напомним, что рангом совместной системы называется ранг её основной матрицы (либо расширенной, так как они равны).

Ноль не может выступать как ведущий элемент в матрице, иначе соответствующая система линейных уравнений является несовместной.

Теорема Кронекера — Капелли.
Система совместна тогда и только тогда, когда ранг её основной матрицы равен рангу её расширенной матрицы.

Следствия:

  • Количество главных переменных равно рангу системы и не зависит от её решения.
  • Если ранг совместной системы равен числу переменных данной системы, то она определена.

Алгоритм[править]

Блок-схема представлена на рисунке. Данный рисунок — адаптированный для написания программы на языке C/C++, где a — расширенная матрица, последний столбец в которой — столбец свободных членов. Количество строк — n.

Алгоритм Гаусса для решения СЛАУ

Для избежания ошибок округления (roundoff errors) рекомендуется при последовательном исключении переменных выбирать максимальный ведущего элемента в столбце (partial pivoting) (См. Выбор максимального в столбце ведущего элемента (partial pivoting)).

Описание[править]

Алгоритм решения СЛАУ методом Гаусса подразделяется на два этапа.

  • На первом этапе осуществляется так называемый прямой ход, когда путём элементарных преобразований над строками систему приводят к ступенчатой или треугольной форме, либо устанавливают, что система несовместна. Для этого среди элементов первого столбца матрицы выбирают ненулевой, перемещают содержащую его строку в крайнее верхнее положение, делая эту строку первой. Далее ненулевые элементы первого столбца всех нижележащих строк обнуляются путём вычитания из каждой строки первой строки, домноженной на отношение первого элемента этих строк к первому элементу первой строки. После того, как указанные преобразования были совершены, первую строку и первый столбец мысленно вычёркивают и продолжают, пока не останется матрица нулевого размера. Если на какой-то из итераций среди элементов первого столбца не нашёлся ненулевой, то переходят к следующему столбцу и проделывают аналогичную операцию.
  1. Осуществить перестановку, на место первой строки поместить ту строку, которая содержит элемент, не равный нулю, находящийся левее элементов других строк (если необходимо)
  2. Произвести умножение первой строки таким образом, чтобы ее первый элемент стал равен 1.
  3. Осуществить прибавление первой строки, умноженной на число, к строкам расположенным ниже первой таким образом, чтобы все элементы находящиеся ниже этого элемента 1 стали равны 0.
  4. Осуществить перестановку, на место второй строки поместить ту строку из расположенных ниже, которая содержит элемент, не равный нулю, находящийся левее элементов других строк.
  5. Произвести умножение второй строки таким образом, чтобы ее первый ненулевой элемент стал равен 1.
  6. Осуществить прибавление второй строки, умноженной на число, к строкам расположенным ниже второй таким образом, чтобы все элементы находящиеся ниже этого элемента 1 стали равны 0.
  7. Осуществить перестановку, на место третей строки поместить ту строку из расположенных ниже, которая содержит элемент находящийся левее элементов других строк.

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

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

Метод Гаусса требует O(n3) арифметических операций.

Этот метод опирается на:

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

Простейший случай[править]

В простейшем случае алгоритм выглядит так:

{a11x1+a12x2++a1nxn=b1(1)a21x1+a22x2++a2nxn=b2(2)am1x1+am2x2++amnxn=bm(m)
  • Прямой ход:
(2)(2)(1)(a21a11):a22x2+a23x3++a2nxn=b2(3)(3)(1)(a31a11):a32x2+a33x3++a3nxn=b3(m)(m)(1)(am1a11):am2x2+am3x3++amnxn=bn(3)(3)(2)(a32a22):a33x3++a3nxn=b3(m)(m)(m1)(am,n1(m2)am1,n1(m2)):amm(m1)xm++amn(m1)xn=bm(m1)
  • Обратный ход. Из последнего ненулевого уравнения выражаем базисную переменную через небазисные и подставляем в предыдущие уравнения. Повторяя эту процедуру для всех базисных переменных, получаем фундаментальное решение.

Пример 1[править]

Покажем, как методом Гаусса можно решить следующую систему:

{2x+yz=83xy+2z=112x+y+2z=3

Обнулим коэффициенты при x во второй и третьей строчках. Для этого прибавим к ним первую строчку, умноженную на 32 и 1, соответственно:

{2x+yz=812y+12z=12y+z=5

Теперь обнулим коэффициент при y в третьей строке, вычтя из неё вторую строку, умноженную на 4:

{2x+yz=812y+12z=1z=1

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

На втором этапе разрешим полученные уравнения в обратном порядке. Имеем:

z=1 из третьего;
y=3 из второго, подставив полученное z
x=2 из первого, подставив полученные z и y.

Таким образом, исходная система решена.

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

Пример 2[править]

Запишем систему уравнений в форме расширенной матрицы:

{x+2y+3z=62x3y+2z=143x+yz=2в форме расширенной матрицы[1236232143112]

Исключение переменной из равенства означает приведение к нулю той части расширенной матрицы, которая расположена слева от вертикальной линии. Сначала мы приводим к нулю элементы в первом столбце (то есть исключая x). Для этого мы применим элементарное преобразование матрицы - прибавление, вычтя из второй строки первую строку умноженную на 2. А затем из третьей строки вычтем первую строку, умноженную на 3:

Невозможно разобрать выражение (неизвестная функция «\def»): {\displaystyle \def\r{\color{red}} \begin{split} \left[\begin{array}{ccc|c} 1& 2& 3& 6\\ 2& -3& 2& 14\\ 3& 1& -1& -2 \end{array}\right] \quad\xrightarrow{R_2=R_2-2R_1}\quad &\left[\begin{array}{ccc|c} 1& 2& 3& 6\\ \r0& -7& -4& 2\\ 3& 1& -1& -2 \end{array}\right]\\ {}\quad\xrightarrow{R_3=R_3-3R_1}\quad &\left[\begin{array}{ccc|c} 1 & 2 & 3 & 6\\ 0 & -7 & -4 & 2\\ \r0 & -5 & -10 & -20 \end{array}\right] \end{split} }

Эти элементарные преобразования матрицы были несложными, поскольку верхний-правый элемент матрицы равен 1. Для этих преобразований достаточно было умножить первую строку на число, расположенное ниже, и произвести вычитание. Для того чтобы исключить y таким же образом, нам необходимо получить 1 во втором столбце. Для этого мы можем разделить второй ряд на Невозможно разобрать выражение (синтаксическая ошибка): {\displaystyle − 7} , но тогда мы получим дробь, поэтому лучше произведем деление на Невозможно разобрать выражение (синтаксическая ошибка): {\displaystyle − 5} .

Невозможно разобрать выражение (неизвестная функция «\def»): {\displaystyle \def\r{\color{red}} \begin{split} \left[\begin{array}{ccc|c} 1& 2& 3& 6\\ 0& -7& -4& 2\\ 0& -5& -10& -20 \end{array}\right] \quad\xrightarrow{R_3=R_3\div-5}\quad &\left[\begin{array}{ccc|c} 1 & 2& 3& 6\\ 0& -7& -4& 2\\ 0& \r1& 2& 4 \end{array}\right] \\ {}\quad\xrightarrow{R_2\longleftrightarrow R_3}\quad &\left[\begin{array}{ccc|c} 1& 2& 3& 6\\ 0& 1& 2& 4\\ 0& -7& -4& 2 \end{array}\right] \\ {}\quad\xrightarrow{R_3 = R_3+7R_2}\quad &\left[\begin{array}{ccc|c} 1& 2& 3& 6\\ 0& 1& 2& 4\\ 0& \r0& 10& 30 \end{array}\right] \\ {}\quad\xrightarrow{R_3 = R_3\div 10}\quad &\left[\begin{array}{ccc|c} 1& 2& 3& 6\\ 0& 1& 2& 4\\ 0& 0& \r1& 3 \end{array}\right] \end{split}}

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

Невозможно разобрать выражение (синтаксическая ошибка): {\displaystyle \left[\begin{array}{ccc|c} 1 & 2 & 3 & 6\\ 0 & 1 & 2 & 4\\ 0 & 0 & 1 & 3 \end{array}\right] \quad\xrightarrow{\text{}}\quad \begin{cases}\begin{alignat}{7} x &\;+&\; 2y &\;+ &\;3z &\;= &\;6\\ &\;&\; y&\; + &\;2z &\;= &\;4\\ &\; &\;&\;&\;z &\;= &\;3\end{alignat}\end{cases}}

Следовательно z=3; подстановка дает решение этой системы линейных уравнений (x,y,z)=(1,2,3).

Реализация алгоритма на языке программирования C#[править]

namespace Gauss_Method
{
    class Maths
    {
        /// <summary>
        /// Метод Гаусса (Решение СЛАУ)
        /// </summary>
        /// <param name="Matrix">Начальная матрица</param>
        /// <returns></returns>
        public static double[] Gauss(double[,] Matrix)
        {
            int n = Matrix.GetLength(0); //Размерность начальной матрицы (строки)
            double[,] Matrix_Clone = new double[n, n + 1]; //Матрица-дублер
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n + 1; j++)
                    Matrix_Clone[i, j] = Matrix[i, j];

            // Прямой ход (Зануление нижнего левого угла)
            for (int k = 0; k < n; k++) //k-номер строки
            {
                for (int i = 0; i < n + 1; i++) //i-номер столбца
                    Matrix_Clone[k, i] = Matrix_Clone[k, i] / Matrix[k, k]; //Деление k-строки на первый член !=0 для преобразования его в единицу
                for (int i = k + 1; i < n; i++) //i-номер следующей строки после k
                {
                    double K = Matrix_Clone[i, k] / Matrix_Clone[k, k]; //Коэффициент
                    for (int j = 0; j < n + 1; j++) //j-номер столбца следующей строки после k
                        Matrix_Clone[i, j] = Matrix_Clone[i, j] - Matrix_Clone[k, j] * K; //Зануление элементов матрицы ниже первого члена, преобразованного в единицу
                }
                for (int i = 0; i < n; i++) //Обновление, внесение изменений в начальную матрицу
                    for (int j = 0; j < n + 1; j++)
                        Matrix[i, j] = Matrix_Clone[i, j];
            }

            // Обратный ход (Зануление верхнего правого угла)
            for (int k = n - 1; k > -1; k--) //k-номер строки
            {
                for (int i = n; i > -1; i--) //i-номер столбца
                    Matrix_Clone[k, i] = Matrix_Clone[k, i] / Matrix[k, k];
                for (int i = k - 1; i > -1; i--) //i-номер следующей строки после k
                {
                    double K = Matrix_Clone[i, k] / Matrix_Clone[k, k];
                    for (int j = n; j > -1; j--) //j-номер столбца следующей строки после k
                        Matrix_Clone[i, j] = Matrix_Clone[i, j] - Matrix_Clone[k, j] * K;
                }
            }

            // Отделяем от общей матрицы ответы
            double[] Answer = new double[n];
            for (int i = 0; i < n; i++)
                Answer[i] = Matrix_Clone[i, n];

            return Answer;
        }
    }
}

Применение и модификации[править]

Помимо аналитического решения СЛАУ, метод Гаусса также применяется для:

  • нахождения матрицы, обратной к данной (к матрице справа приписывается единичная такого же размера, что и исходная: [A|E], после чего A приводится к виду единичной матрицы методом Гаусса—Жордана; в результате на месте изначальной единичной матрицы справа оказывается обратная к исходной матрица: [E|A1]);
  • определения ранга матрицы (согласно следствию из теоремы Кронекера — Капелли ранг матрицы равен числу её главных переменных);
  • численного решения СЛАУ в технических приложениях (для уменьшения погрешности вычислений используется Метод Гаусса с выделением главного элемента, суть которого заключена в том, чтобы на каждом шаге в качестве главной переменной выбирать ту, при которой среди оставшихся после вычёркивания очередных строк и столбцов стоит максимальный по модулю коэффициент).

Достоинства метода[править]

  • Для матриц ограниченного размера — менее трудоёмкий по сравнению с другими методами.
  • Позволяет однозначно установить, совместна система или нет, и если совместна, найти её решение.
  • Позволяет найти максимальное число линейно независимых уравнений — ранг матрицы системы[3].

Устойчивость метода Гаусса[править]

Метод Гаусса для плохо обусловленных матриц коэффициентов является вычислительно неустойчивым. Например, для матриц Гильберта метод приводит к очень большим ошибкам даже при небольшой размерности этих матриц. Уменьшить вычислительную ошибку можно с помощью метода Гаусса с выделением главного элемента, который является условно устойчивым[4]. Широкое применение метода Гаусса связано с тем, что плохо обусловленные матрицы встречаются на практике относительно редко.

Неоптимальность метода Гаусса[править]

В 1969 году Штрассен доказал, что большие матрицы можно перемножить за время O(nlog27)=O(n2,81)Шаблон:Source-ref. Отсюда вытекает, что обращение матриц и решение СЛАУ можно осуществлять алгоритмами асимптотически более быстрыми по порядку, чем метод Гаусса. Таким образом, для больших СЛАУ метод Гаусса не оптимален по скорости.

История[править]

Хотя в настоящее время данный метод повсеместно называется методом Гаусса, он был известен и до К. Ф. Гаусса. Первое известное описание данного метода — в китайском трактате «Математика в девяти книгах».

См. также[править]

Примечания[править]

  1. Н. Ш. Кремер, 2.3. «Метод Гаусса», стр. 44
  2. Такого расположения минора можно добиться перестановкой столбцов основной матрицы и соответствующей перенумерацией переменных.
  3. Н. Ш. Кремер, 2.4. «Система m линейных уравнений с n переменными», стр. 49
  4. УСТОЙЧИВОСТЬ И ТОЧНОСТЬ ПРЯМЫХ МЕТОДОВ (недоступная ссылка)

Литература[править]

  • И. М. Виноградов. Гаусса метод // Математическая энциклопедия. — М.: Советская энциклопедия. — 1977—1985.
  • Ильин В. А., Позняк Э. Г. Линейная алгебра: Учебник для вузов. — 6-е изд., стер. — М.: ФИЗМАТЛИТ, 2004. — 280 с.
  • Амосов А. А., Дубинский Ю. А., Копченова Н. П. Вычислительные методы для инженеров. — М.: Мир, 1998.
  • Бахвалов Н. С., Жидков Н. П., Кобельков Г. Г. Численные методы. — 8-е изд.|место = М. |издательство = Лаборатория Базовых Знаний |год = 2000 |страницы = |isbn =}}
  • Волков Е. А. Численные методы. — М.: Физматлит, 2003.
  • Корн Г., Корн Т. Справочник по математике для научных работников и инженеров. — М.: Наука, 1970. — С. 575—576.
  • Кремер Н. Ш., Путко Б. А., Тришин И. М., Фридман М. Н. Высшая математика для экономистов / Под ред. Н. Ш. Кремера. — 3-е изд. — М.: ЮНИТИ-ДАНА, 2007. — 479 с. — ISBN 5-238-00991-7.

Ссылки[править]

  • Press, WH; Teukolsky, SA; Vetterling, WT & Flannery, BP (2007), Section 2.2, Numerical Recipes: The Art of Scientific Computing (3rd ed.), New York: Cambridge University Press, ISBN 978-0-521-88068-8