Загрузка данных


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");
    }