
Odwracanie macierzy (Java)
Macierz odwrotna
Macierz odwrotna A-1, to taka macierz, że po jej pomnożeniu przez A otrzymamy macierz jednostkową I:
A⋅A-1=A-1⋅A = I
Macierz odwrotna do macierzy A:
![]()
gdzie D jest transponowaną macierzą dopełnień algebraicznych odpowiadających elementów macierzy A.
Kroki przy odwracaniu macierzy:
- Pobieramy wszystkie podmacierze macierzy odwracanej
- Dla każdej podmacierzy obliczamy minor
- Obliczamy dopełnienie algebraiczne każdego minora
- Dopełnienia umieszczamy w macierzy
- Transformujemy macierz dopełnień
- Obliczamy wyznacznik macierzy odwracanej
- Mnożymy transformowaną macierz dopełnień przez odwrotność wyznacznika
Odwracanie macierzy
Załóżmy, że mamy do odwrócenia macierz:

Pobieramy podmacierz ![]()
Obliczamy minor ![]()
Obliczamy dopełnienie algebraiczne minora = -3
Wstawiamy dopełnienie do macierzy dopełnień

Powtarzamy operację dla wszystkich podmacierzy i otrzymujemy macierz dopełnień:

Transponujemy macierz dopełnień. Otrzymujemy macierz transponowaną:

Obliczamy wyznacznik macierzy odwracanej.
Wyznacznik macierzy wyjściowej wynosi -3.
Mnożymy macierz transponowaną przez skalar (odwrotność wyznacznika macierzy wyjściowej)

Sprawdzenie
A=

A-1=

Ponieważ wynik mnożenia jest macierzą jednostkową, tzn. że macierz A-1 jest macierzą odwrotną do macierzy A.
Obliczenie w klasie Matrix034.
double[][] array = {{2, 2, 3}, {4, 5, 6}, {7, 8, 9}};
Matrix matrix = new Matrix(array);
matrix.printToConsole();
Util.print("");
Matrix matrixac = new Matrix(matrix.getRowCount(),
matrix.getColCount());
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
double ac = MatrixUtil.algComplement(matrix, i, j);
try {
matrixac.setCell(i, j, ac);
} catch (MatrixException e) {
e.printStackTrace();
}
}
}
Matrix matrix1 = MatrixUtil.transpose(matrixac);
double det = 0.0;
try {
det = matrix.det();
} catch (MatrixException e) {
e.printStackTrace();
}
Matrix matrixt = matrix1.mult2(1 / det);
matrixt.printToConsole();
Util.print("");
Matrix finalm = matrix.multiply2(matrixt);
finalm.printToConsole();
Po uruchomieniu klasy na konsoli zobaczymy:
2.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 0.5 -1.0 0.5 -1.0 0.5 0.0 0.5 0.3333333333333333 -0.3333333333333333 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5
W klasie Matrix035 pokazano użycie metody inverse do odwracania macierzy
Eliminacja Gaussa – Jordana
Jeżeli będziemy wykonywali operacje elementarne tylko na wierszach, to każdą macierz nieosobliwą można sprowadzić do macierzy jednostkowej.
Jeżeli dla danej macierzy przyjmiemy macierz jednostkową o tym samym rozmiarze, to jeśli wykonamy operacje elementarne zarówno na macierzy wyjściowej, jak i na macierzy elementarnej, to macierz wyjściowa przekształci się w macierz jednostkową, a macierz jednostkowa – w macierz odwrotną.
Mamy macierz:

Wyznacznik macierzy
, czyli macierz jest nieosobliwa, a jako taka ma macierz odwrotną.
Tworzymy macierz blokową [A|I] zawierającą macierz A oraz macierz jednostkową I.
Używając operacji elementarnych wyłącznie na wierszach sprowadzamy macierz blokową do postaci [I|B], gdzie macierz B jest macierzą odwrotną a-1.
1.0 -1.0 2.0 1.0 0.0 0.0 -1.0 2.0 0.0 0.0 1.0 0.0 2.0 -3.0 1.0 0.0 0.0 1.0 1.0 -1.0 2.0 1.0 0.0 0.0 0.0 1.0 2.0 1.0 1.0 0.0 2.0 -3.0 1.0 0.0 0.0 1.0 1.0 -1.0 2.0 1.0 0.0 0.0 0.0 1.0 2.0 1.0 1.0 0.0 0.0 -1.0 -3.0 -2.0 0.0 1.0 1.0 -1.0 2.0 1.0 0.0 0.0 0.0 1.0 2.0 1.0 1.0 0.0 0.0 0.0 -1.0 -1.0 1.0 1.0 1.0 -1.0 2.0 1.0 0.0 0.0 0.0 1.0 2.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 -1.0 -1.0 1.0 -1.0 2.0 1.0 0.0 0.0 0.0 1.0 0.0 -1.0 3.0 2.0 0.0 0.0 1.0 1.0 -1.0 -1.0 1.0 -1.0 0.0 -1.0 2.0 2.0 0.0 1.0 0.0 -1.0 3.0 2.0 0.0 0.0 1.0 1.0 -1.0 -1.0 1.0 0.0 0.0 -2.0 5.0 4.0 0.0 1.0 0.0 -1.0 3.0 2.0 0.0 0.0 1.0 1.0 -1.0 -1.0
Jeżeli pomnożymy macierz wejściową przez wyjściową otrzymamy macierz elementarną.

Operacja sprowadzania macierzy do postaci jednostkowej składa się z dwóch etapów:
- przekształcenie macierzy nieosobliwej w macierz górnotrójkątną – ten sposób opisano w podrozdziale poświęconym wyznacznikowi macierzy oraz przy omawianiu eliminacji Gaussa
- sprowadzenie macierzy górnotrójkątnej do macierzy jednostkowej
Zauważmy, że w tej metodzie nie martwimy się ani o znak wyznacznika w przypadku zamiany wierszy, ani o podzielenie wyznacznika przez skalar, którego użyliśmy do pomnożenia elementów wiersza.
Przykład w klasie Matrix077:
double[][] A = {{1, -1, 2}, {-1, 2, 0}, {2, -3, 1}};
Matrix m = new Matrix(A);
m.printToConsole();
Util.print("");
Matrix m1 = MatrixUtil.inverseGauss(m);
m1.printToConsole(2);
Util.print("");
Matrix m2 = MatrixUtil.multiply3(m, m1);
m2.printToConsole(1);
Util.print("");
Po uruchomieniu klasy na konsoli zobaczymy:
1.0 -1.0 2.0 -1.0 2.0 0.0 2.0 -3.0 1.0 -2.0 5.0 4.0 -1.0 3.0 2.0 1.0 -1.0 -1.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0
Pliki do ściągnięcia
Moduł matrices – aktualny stan projektu = 023;
