Выбирают первый слева столбец матрицы, в котором есть хоть одно отличное от нуля значение.
Если самое верхнее число в этом столбце ноль, то меняют всю первую строку матрицы с другой строкой матрицы, где в этой колонке нет нуля.
Все элементы первой строки делят на верхний элемент выбранного столбца.
Из оставшихся строк вычитают первую строку, умноженную на первый элемент соответствующей строки, с целью получить первым элементом каждой строки (кроме первой) ноль.
Далее проводят такую же процедуру с матрицей, получающейся из исходной матрицы после вычёркивания первой строки и первого столбца.
Вычитают из предпоследней строки последнюю строку, умноженную на соответствующий коэффициент, с тем, чтобы в предпоследней строке осталась только 1 на главной диагонали.
Повторяют предыдущий шаг для последующих строк. В итоге получают единичную матрицу и решение на месте свободного вектора (с ним необходимо проводить все те же преобразования).
Расширенный алгоритм для нахождения обратной матрицы
Пусть дано:
Прямой ход (алгоритм образования нулей под главной диагональю)
Разделим первую строку матрицы А на получим: , j — столбец матрицы А.
Повторяем действия для матрицы I, по формуле: , s — столбец матрицы I
Получим:
Будем образовывать 0 в первом столбце :
Повторяем действия для матрицы І, по формулам :
Получим:
продолжаем выполнять аналогичные операции, используя формулы :
при условии, что
Повторяем действия для матрицы І, по формулам :
при условии, что
Получим :
Обратный ход (алгоритм образования нулей над главной диагональю)
Используем формулу: , при условии, что
Повторяем действия для матрицы І, по формуле : , при условии, что
Запишем её в виде матрицы 3×4, где последний столбец является свободным членом:
Проведём следующие действия:
К строке 2 добавим: −4 × Строку 1.
К строке 3 добавим: −9 × Строку 1.
Получим:
К строке 3 добавим: −3 × Строку 2.
Строку 2 делим на −2
К строке 1 добавим: −1 × Строку 3.
К строке 2 добавим: −3/2 × Строку 3.
К строке 1 добавим: −1 × Строку 2.
В правом столбце получаем решение:
.
Реализация алгоритма на языке программирования C#
namespaceGauss_Jordan_Method{classMaths{/// <summary>/// Метод Гаусса-Жордана (Обратная матрица)/// </summary>/// <param name="Matrix">Начальная матрица</param>/// <returns></returns>publicstaticdouble[,]GaussJordan(double[,]Matrix){intn=Matrix.GetLength(0);//Размерность начальной матрицыdouble[,]xirtaM=newdouble[n,n];//Единичная матрица (искомая обратная матрица)for(inti=0;i<n;i++)xirtaM[i,i]=1;double[,]Matrix_Big=newdouble[n,2*n];//Общая матрица, получаемая скреплением Начальной матрицы и единичнойfor(inti=0;i<n;i++)for(intj=0;j<n;j++){Matrix_Big[i,j]=Matrix[i,j];Matrix_Big[i,j+n]=xirtaM[i,j];}//Прямой ход (Зануление нижнего левого угла)for(intk=0;k<n;k++)//k-номер строки{for(inti=0;i<2*n;i++)//i-номер столбцаMatrix_Big[k,i]=Matrix_Big[k,i]/Matrix[k,k];//Деление k-строки на первый член !=0 для преобразования его в единицуfor(inti=k+1;i<n;i++)//i-номер следующей строки после k{doubleK=Matrix_Big[i,k]/Matrix_Big[k,k];//Коэффициентfor(intj=0;j<2*n;j++)//j-номер столбца следующей строки после kMatrix_Big[i,j]=Matrix_Big[i,j]-Matrix_Big[k,j]*K;//Зануление элементов матрицы ниже первого члена, преобразованного в единицу}for(inti=0;i<n;i++)//Обновление, внесение изменений в начальную матрицуfor(intj=0;j<n;j++)Matrix[i,j]=Matrix_Big[i,j];}//Обратный ход (Зануление верхнего правого угла)for(intk=n-1;k>-1;k--)//k-номер строки{for(inti=2*n-1;i>-1;i--)//i-номер столбцаMatrix_Big[k,i]=Matrix_Big[k,i]/Matrix[k,k];for(inti=k-1;i>-1;i--)//i-номер следующей строки после k{doubleK=Matrix_Big[i,k]/Matrix_Big[k,k];for(intj=2*n-1;j>-1;j--)//j-номер столбца следующей строки после kMatrix_Big[i,j]=Matrix_Big[i,j]-Matrix_Big[k,j]*K;}}//Отделяем от общей матрицыfor(inti=0;i<n;i++)for(intj=0;j<n;j++)xirtaM[i,j]=Matrix_Big[i,j+n];returnxirtaM;}}}
Примечания
↑Транскрипция фамилии Йордан как «Жордан» является ошибочной, но она общепринята и встречается в большинстве русскоязычных источников.
Lipson, Marc; Lipschutz, Seymour (2001), Schaum's outline of theory and problems of linear algebra, New York: McGraw-Hill, pp. 69–80, ISBN978-0-07-136200-9.
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, ISBN978-0-521-88068-8