printf("--- 3. Обратная матрица ---\n\n");
// Расширенная матрица [A | E] 4 x 8
double aug[4][8];
// Заполняем: слева — исходная A, справа — единичная E
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
aug[i][j] = A[i][j];
aug[i][j + n] = (i == j) ? 1.0 : 0.0;
}
}
// Приводим левую часть к единичной
for (k = 0; k < n; k++) {
// Ищем главный элемент
maxRow = k;
maxVal = aug[k][k];
if (maxVal < 0) maxVal = -maxVal;
for (i = k + 1; i < n; i++) {
double modul = aug[i][k];
if (modul < 0) modul = -modul;
if (modul > maxVal) {
maxVal = modul;
maxRow = i;
}
}
// Перестановка строк во ВСЕЙ расширенной матрице
if (maxRow != k) {
for (j = 0; j < 2 * n; j++) {
temp = aug[k][j];
aug[k][j] = aug[maxRow][j];
aug[maxRow][j] = temp;
}
}
// Нормируем строку (делим на ведущий элемент)
double pivot = aug[k][k];
for (j = 0; j < 2 * n; j++) {
aug[k][j] = aug[k][j] / pivot;
}
// Обнуляем столбец k во всех остальных строках
for (i = 0; i < n; i++) {
if (i != k) {
factor = aug[i][k];
for (j = 0; j < 2 * n; j++) {
aug[i][j] = aug[i][j] - factor * aug[k][j];
}
}
}
}
// Печатаем правую часть — это и есть A^(-1)
printf("Обратная матрица A^(-1):\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%10.4f ", aug[i][j + n]);
}
printf("\n");
}