Нахождение обратной матрицы методом Гаусса - Жордана | Комплект 2
Для данной матрицы задача состоит в том, чтобы найти обратную матрицу, используя метод Гаусса-Жордана.
Что такое матрица?
Матрица - это упорядоченный прямоугольный массив чисел.
С матрицей можно выполнять следующие операции : сложение, вычитание, умножение или транспонирование матрицы и т. Д.
Обратная матрица:
Дана квадратная матрица A, которая не является сингулярной (означает, что определитель A отличен от нуля); Тогда существует матрица
которая называется обратной к матрице A.
Инверсия матрицы возможна только при соблюдении следующих свойств:
- Матрица должна быть квадратной матрицей.
- Матрица должна быть невырожденной матрицей и,
- Существует матрица идентичности I, для которой
В общем, матрица A, обратная n X n, может быть найдена с помощью этой простой формулы:
где Adj (A) обозначает сопряженный элемент матрицы, а Det (A) - определитель матрицы A.
Методы поиска обратной матрицы:
Найти обратную матрицу 2 × 2 - простая задача, но найти обратную матрицу большего размера (например, 3 × 3, 4 × 4 и т. Д.) - сложная задача, поэтому можно использовать следующие методы:
- Операция с элементарной строкой (метод Гаусса-Жордана) (эффективный)
- Миноры, кофакторы и метод адъюгата (неэффективный)
Операция с элементарной строкой (метод Гаусса - Джордана):
Метод Гаусса-Жордана - это вариант метода исключения Гаусса, при котором выполняется операция сокращения строки для нахождения обратной матрицы.
Шаги, чтобы найти обратную матрицу с помощью метода Гаусса-Жордана:
Чтобы найти обратную матрицу, необходимо выполнить следующие шаги:
- Сформируйте расширенную матрицу с помощью единичной матрицы.
- Выполните операцию сокращения строк на этой расширенной матрице, чтобы сгенерировать эшелонированную форму матрицы с сокращенными строками.
- При необходимости над расширенной матрицей выполняются следующие операции со строками:
- Поменяйте местами любые два ряда.
- Умножьте каждый элемент строки на ненулевое целое число.
- Замените строку суммой самой себя и постоянной кратной другой строки матрицы.
Пример:
- Расширенная матрица формируется как A: B
- После применения метода исключения Гаусса-Жордана:
Ниже приведена программа на C ++ для поиска обратной матрицы с помощью метода Гаусса-Жордана:
CPP
// C++ program to find the inverse of Matrix. #include <iostream> #include <vector> using namespace std; // Function to Print matrix. void PrintMatrix( float ** ar, int n, int m) { for ( int i = 0; i < n; i++) { for ( int j = 0; j < m; j++) { cout << ar[i][j] << " " ; } printf ( "
" ); } return ; } // Function to Print inverse matrix void PrintInverse( float ** ar, int n, int m) { for ( int i = 0; i < n; i++) { for ( int j = n; j < m; j++) { printf ( "%.3f " , ar[i][j]); } printf ( "
" ); } return ; } // Function to perform the inverse operation on the matrix. void InverseOfMatrix( float ** matrix, int order) { // Matrix Declaration. temp; float // PrintMatrix function to print the element // of the matrix. printf ( "=== Matrix ===
" ); PrintMatrix(matrix, order, order); // Create the augmented matrix // Add the identity matrix // of order at the end of original matrix. for ( int i = 0; i < order; i++) { for ( int j = 0; j < 2 * order; j++) { // Add '1' at the diagonal places of // the matrix to create a identity matirx if (j == (i + order)) matrix[i][j] = 1; } } // Interchange the row of matrix, // interchanging of row will start from the last row for ( int i = order - 1; i > 0; i--) { // Swapping each and every element of the two rows // if (matrix[i - 1][0] < matrix[i][0]) // for (int j = 0; j < 2 * order; j++) { // // // Swapping of the row, if above // // condition satisfied. // temp = matrix[i][j]; // matrix[i][j] = matrix[i - 1][j]; // matrix[i - 1][j] = temp; // } // Directly swapping the rows using pointers saves // time if (matrix[i - 1][0] < matrix[i][0]) { float * temp = matrix[i]; matrix[i] = matrix[i - 1]; matrix[i - 1] = temp; } } // Print matrix after interchange operations. printf ( "
=== Augmented Matrix ===
" ); PrintMatrix(matrix, order, order * 2); // Replace a row by sum of itself and a // constant multiple of another row of the matrix for ( int i = 0; i < order; i++) { for ( int j = 0; j < order; j++) { if (j != i) { temp = matrix[j][i] / matrix[i][i]; for ( int k = 0; k < 2 * order; k++) { matrix[j][k] -= matrix[i][k] * temp; } } } } // Multiply each row by a nonzero integer. // Divide row element by the diagonal element for ( int i = 0; i < order; i++) { temp = matrix[i][i]; for ( int j = 0; j < 2 * order; j++) { matrix[i][j] = matrix[i][j] / temp; } } // print the resultant Inverse matrix. printf ( "
=== Inverse Matrix ===
" ); PrintInverse(matrix, order, 2 * order); return ; } // Driver code int main() { int order; // Order of the matrix // The matrix must be a square a matrix order = 3; /* float matrix[20][20] = { { 5, 7, 9 }, { 4, 3, 8 }, { 7, 5, 6 }, { 0 } }; */ float ** matrix = new float *[20]; for ( int i = 0; i < 20; i++) matrix[i] = new float [20]; matrix[0][0] = 5; matrix[0][1] = 7; matrix[0][2] = 9; matrix[1][0] = 4; matrix[1][1] = 3; matrix[1][2] = 8; matrix[2][0] = 7; matrix[2][1] = 5; matrix[2][2] = 6; // Get the inverse of matrix InverseOfMatrix(matrix, order); return 0; } |
=== Матрица === 5 7 9 4 3 8 7 5 6 === Дополненная матрица === 7 5 6 0 0 1 5 7 9 1 0 0 4 3 8 0 1 0 === Обратная матрица === -0,210 0,029 0,276 0,305 -0,314 -0,038 -0,010 0,229 -0,124