Реализация алгоритма решения СЛАУ методом Гаусса - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Попрошу помочь в реализации алгоритма решения СЛАУ методом Гаусса на языке С (НЕ C++!). Заранее спасибо.

Решение задачи: «Реализация алгоритма решения СЛАУ методом Гаусса»

textual
Листинг программы
  1. long double *gauss(int size, long double **main_mat, long double *main_b)
  2. {
  3.     int i, j, k;
  4.     long double **mat = NULL;
  5.     long double *b = NULL;
  6.     long double *x = NULL;
  7.     int *order = NULL;
  8.     //делаем копии переданных данных
  9.     if(!(mat = malloc(sizeof(long double*) * size))
  10.         || !(b = malloc(sizeof(long double) * size))
  11.         || !(x = malloc(sizeof(long double) * size))
  12.         || !(order = malloc(sizeof(int) * size)))
  13.     {
  14.         free(mat);
  15.         free(b);
  16.         free(x);
  17.         free(order);
  18.         puts("!");
  19.         return NULL;
  20.     }
  21.     for(i = 0; i < size; i++)
  22.     {
  23.         if(!(mat[i] = malloc(sizeof(long double) * size)))
  24.         {
  25.             for(; i >=0; i--)
  26.                 free(mat[i]);
  27.             puts("!");
  28.             return NULL;
  29.         }
  30.         memcpy(mat[i], main_mat[i], sizeof(long double) * size);
  31.         order[i] = i;
  32.     }
  33.     memcpy(b, main_b, sizeof(long double) * size);
  34.    
  35.     puts("\nМетод Гаусса");
  36.     for(k = 0; k < size; k++)
  37.     {
  38.         putchar('\n');
  39.         long double max = fabsl(mat[k][k]);
  40.         int max_i = k, max_j = k;
  41.         if(k != size - 1)
  42.         {
  43.             //находим максимальный каэффициент
  44.             for(i = k; i < size; i++)
  45.             {
  46.                 for(j = k; j < size; j++)
  47.                 {
  48.                     if(fabsl(mat[i][order[j]]) > max)
  49.                     {
  50.                         max = fabsl(mat[i][order[j]]);
  51.                         max_i = i;
  52.                         max_j = j;
  53.                     }
  54.                 }
  55.             }
  56.             //он нулевой?..
  57.             if(max == 0)
  58.             {
  59.                 puts("Система ворожденная...");
  60.                 for(i = 0; i < size; i++)
  61.                 {
  62.                     free(mat[i]);
  63.                 }
  64.                 free(mat);
  65.                 free(b);
  66.                 free(x);
  67.                 free(order);
  68.                 return NULL;
  69.             }
  70.             printf("Оптимальное основание [%d][%d] = %Lf\n",
  71.                    max_i, max_j, mat[max_i][order[max_j]]);
  72.         }
  73.         else
  74.             puts("Итоговая матрица");
  75.         //по не обходимости меняем местами строки
  76.         if(max_i != k)
  77.         {
  78.             long double *ptr = mat[k];
  79.             mat[k] = mat[max_i];
  80.             mat[max_i] = ptr;
  81.             long double tmp = b[k];
  82.             b[k] = b[max_i];
  83.             b[max_i] = tmp;
  84.         }
  85.         //и/или переставляем столбцы
  86.         if(max_j != k)
  87.         {
  88.             int tmp = order[k];
  89.             order[k] = order[max_j];
  90.             order[max_j] = tmp;
  91.         }
  92.         //делим на основание
  93.         for(j = k + 1; j < size; j++)
  94.             mat[k][order[j]] /= mat[k][order[k]];
  95.         b[k] /= mat[k][order[k]];
  96.         mat[k][order[k]] = 1;
  97.         //вычитаем из оставшихся строк получившуюя с соответствующим коэффициентом
  98.         for(i = k + 1; i < size; i++)
  99.         {
  100.             long double factor = mat[i][order[k]];
  101.             for(j = k; j < size; j++)
  102.                 mat[i][order[j]] -= mat[k][order[j]] * factor;
  103.             b[i] -= b[k] * factor;
  104.         }
  105.         for(i = 0; i < size; i++)
  106.             printf(" x%-7d ", order[i]);
  107.         puts(" b");
  108.         for(i = 0; i < size; i++)
  109.         {
  110.             for(j = 0; j < size; j++)
  111.                 printf("% 8Lf ", mat[i][order[j]]);
  112.             printf("% 8Lf\n", b[i]);
  113.         }
  114.     }
  115.     //совстевенно, считаем искомый вектор
  116.     for(i = size - 1; i >= 0; i--)
  117.     {
  118.         for(j = i + 1; j < size; j++)
  119.             b[i] -= x[order[j]] * mat[i][order[j]];
  120.         x[order[i]] = b[i];
  121.     }
  122.     for(i = 0; i < size; i++)
  123.     {
  124.         free(mat[i]);
  125.     }
  126.     free(mat);
  127.     free(b);
  128.     free(order);
  129.     return x;
  130. }

Объяснение кода листинга программы

Данный код реализует алгоритм решения СЛАУ (системы линейных алгебраических уравнений) методом Гаусса.

  1. Создается функция gauss, которая принимает три аргумента: size - размер матрицы, main_mat - матрица коэффициентов, main_b - вектор правых частей.
  2. Внутри функции создаются матрица mat и вектор b для работы с исходной матрицей и вектором.
  3. Затем происходит инициализация матрицы mat и вектора b нулями.
  4. Далее, с помощью цикла for, производится инициализация подматрицы order, которая будет использоваться для хранения порядка строк.
  5. После этого, с помощью вложенного цикла for, происходит поиск максимального элемента в текущей подматрице.
  6. Если максимальное значение найдено, то оно заменяется на ноль, и происходит перестановка строк и столбцов, если это необходимо.
  7. Затем, с помощью вложенного цикла for, происходит деление каждой строки на максимальный элемент.
  8. После этого, с помощью вложенного цикла for, происходит вычитание из оставшихся строк получившейся строки с соответствующим коэффициентом.
  9. Затем, с помощью вложенного цикла for, происходит вывод на экран порядка строк и столбцов, а также значения матрицы и вектора правых частей.
  10. После этого, с помощью вложенного цикла for, происходит вычисление искомых значений вектора.
  11. В конце функции происходит освобождение памяти, выделенной под матрицу mat, вектор b и массив order.
  12. Функция возвращает искомый вектор x. Примечание: В данном коде не реализованы обработка ошибок и проверка на входные данные.

ИИ поможет Вам:


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

Оцени полезность:

6   голосов , оценка 4.333 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы