12
Мар
2021

Метод Крамера решения систем линейных уравнений

Программа неправильно выводит решения, хотелось бы понять в чем заключается ошибка или посмотреть как правильно реализуется данный код.

#include <stdio.h>
#include <math.h>
double Det(int n, double a[n][n]) {
    int i , j , k, count = 0;
    double det = 1.0, max;
        for(i = 0; i < n; i++)
            for(j = 0 ; j < n; j++)
                if(a[i][j] == 0)
                    count++;
        if(count == n*n) {
            puts("Det: 0");
            return 0;
        }
        for(i = 0; i < n; i++) {
            double max = fabs(a[i][i]);
            int idx = i;
            for(j = i+1; j < n; j++) {
                if(max < fabs(a[i][j])){
                    max = a[i][j];
                    idx = j;
                }
            }
                if(idx != i) {
                    for(j = i; j < n; j++) {
                        double t = a[j][i];
                        a[j][i] = a[j][idx];
                        a[j][idx] = t;
                    }
                    det *= -1 ;
                }
                for(k = i+1; k < n; k++) {
                    double t = a[k][i] / a[i][i];
                    for( j = i; j < n; j++) {
                        a[k][j] -= a[i][j] * t;
                    }
                }
        }
                for(i = 0 ; i < n; i++)
                    det *= a[i][i];

        return det;
}
double Operator(int n, int k, double a[n][n], double f[n]) {
    int i;
        for(i = 0 ; i < n; i++)
           a[i][k] = f[i];
        float Opr = Det(n, a);
        return Opr;
}
int main () {
    int n, i, j, k;
    scanf ("%d", &n);
    double a[n][n], f[n], x[n];
        for(i = 0; i < n; i++)
            for(j = 0 ; j < n; j++)
                scanf ("%lf", &a[i][j]);
        for(i = 0 ; i < n ;i++)
            scanf ("%lf", &f[i]);
            printf ("DET: %lf\n", Det(n, a));
            for(k = 0; k < n; k++)
                printf ("Oper: %lf\n", Operator(n, k, a, f));
         for(k = 0 ; k < n; k++) {
            x[k] = Operator(n, k, a, f);
            printf ("Solution: %lf\n", (x[k] / Det(n, a)));
        }
}

Источник: https://ru.stackoverflow.com/questions/1254966/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9A%D1%80%D0%B0%D0%BC%D0%B5%D1%80%D0%B0-%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC-%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85-%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9

Тебе может это понравится...

1 Ответ

  1. big-boss777:

    Дякую за цікавий матеріал.
    Допоможіть закодувати процес рішення задачінаступного характеру: при якому значенні параметра “a” система лінійних рівнянь має безліч розв’язків (задача 4 – http://www.mathros.net.ua/rozvjazok-systemy-linijnyh-algebraichnyh-rivnjan-metodom-kramera.html).

Добавить комментарий