Метод Гаусса — Жордана (метод полного исключения неизвестных) — метод, который используется для решения квадратных систем линейных алгебраических уравнений, нахождения обратной матрицы, нахождения координат вектора в заданном базисе или отыскания ранга матрицы. Метод является модификацией метода Гаусса. Назван в честь К. Ф. Гаусса и немецкого геодезиста и математика Вильгельма ЙорданаТранскрипция фамилии Йордан как «Жордан» является ошибочной, но она общепринята и встречается в большинстве русскоязычных источников..

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

Расширенный алгоритм для нахождения только обратной матрицы Пусть дано:

Прямой ход (алгоритм образования нулей под главной диагональю) Разделим первую строку матрицы А на получим: , j — столбец матрицы А. Повторяем действия для матрицы I, по формуле: , s — столбец матрицы I Получим:

Будем образовывать 0 в первом столбце : Повторяем действия для матрицы І, по формулам : Получим:

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

Обратный ход (алгоритм образования нулей над главной диагональю) Используем формулу: , при условии, что

Повторяем действия для матрицы І, по формуле : , при условии, что

Окончательно получаем :

Пример Пример решения сокращённым методом Гаусса-Джордана только СЛАУ с присоединённым вектором свободных членов , вместо единичной матрицы , без вычисления определителя исходной матрицы и без вычисления обращённой матрицы Решение СЛАУ сокращённым методом Гаусса-Джордана. Куликов А. С. https://dzen.ru/a/aJOaIgraZgnENlAe. Для решения следующей системы уравнений:

Запишем её в виде матрицы 3×4, где последний столбец является свободным членом:

Проведём следующие действия: Обнуление (исключение) элементов матрицы под главной диагональю: К строке 2 добавим: −4 × Строку 1. (Обнуление второго элемента первого столбца) К строке 3 добавим: −9 × Строку 1. (Обнуление третьего элемента первого столбца)

Получим:

К строке 3 добавим: −3 × Строку 2. (Обнуление третьего элемента второго столбца) Строку 2 делим на −2 (Приведение второго элемента второй строки к 1)

Обнуление (исключение) элементов матрицы над главной диагональю: К строке 1 добавим: −1 × Строку 3. (Обнуление первого элемента третьего столбца) К строке 2 добавим: −3/2 × Строку 3. (Обнуление второго элемента третьего столбца)

К строке 1 добавим: −1 × Строку 2. (Обнуление первого элемента второго столбца)

В правом столбце получаем решение: .

Реализация алгоритма на языке программирования C# namespace Gauss_Jordan_Method { class Maths

/// <summary> /// Метод Гаусса-Жордана (Обратная матрица) /// </summary> /// <param name="Matrix">Начальная матрица</param> /// <returns></returns> public static double[,] GaussJordan(double[,] Matrix)

int n = Matrix.GetLength(0); //Размерность начальной матрицы

double[,] xirtaM = new double[n, n]; //Единичная матрица (искомая обратная матрица) for (int i = 0; i < n; i++) xirtaM[i, i] = 1;

double[,] Matrix_Big = new double[n, 2*n]; //Общая матрица, получаемая скреплением Начальной матрицы и единичной for (int i = 0; i < n; i++) for (int j = 0; j < n; j++)

Matrix_Big[i, j] = Matrix[i, j]; Matrix_Big[i, j + n] = xirtaM[i, j];

//Прямой ход (Зануление нижнего левого угла) for (int k = 0; k < n; k++) //k-номер строки

for (int i = 0; i < 2*n; i++) //i-номер столбца Matrix_Big[k, i] = Matrix_Big[k, i] / Matrix[k, k]; //Деление k-строки на первый член !=0 для преобразования его в единицу for (int i = k + 1; i < n; i++) //i-номер следующей строки после k

double K = Matrix_Big[i, k] / Matrix_Big[k, k]; //Коэффициент for (int j = 0; j < 2*n; j++) //j-номер столбца следующей строки после k Matrix_Big[i, j] = Matrix_Big[i, j] - Matrix_Big[k, j] * K; //Зануление элементов матрицы ниже первого члена, преобразованного в единицу

for (int i = 0; i < n; i++) //Обновление, внесение изменений в начальную матрицу for (int j = 0; j < n; j++) Matrix[i, j] = Matrix_Big[i, j];

//Обратный ход (Зануление верхнего правого угла) for (int k = n - 1; k > -1; k--) //k-номер строки

for (int i = 2*n - 1; i > -1; i--) //i-номер столбца Matrix_Big[k, i] = Matrix_Big[k, i] / Matrix[k, k]; for (int i = k - 1; i > -1; i--) //i-номер следующей строки после k

double K = Matrix_Big[i, k] / Matrix_Big[k, k]; for (int j = 2*n - 1; j > -1; j--) //j-номер столбца следующей строки после k Matrix_Big[i, j] = Matrix_Big[i, j] - Matrix_Big[k, j] * K;

//Отделяем от общей матрицы for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) xirtaM[i, j] = Matrix_Big[i, j + n];

return xirtaM;

Примечания

Литература . . .

. .

Ссылки Algorithm for Gauss-Jordan elimination in Python

Категория:Методы решения СЛАУ Категория:Объекты, названные в честь Карла Фридриха Гаусса