Решение СЛАУ методом Гаусса - C (СИ)

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

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

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

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

textual
Листинг программы
//HOWTO solve system of linear equations
//ax=b
//where a[N][N] is square matrix,
//b[N] and x[N] are columns
 
//input data format:
//a_11 a_12 a_13... a_1N b_1
//a_21 a_22 a_23... a_2N b_2
//...
//a_N1 a_N2 a_N3... a_NN b_N
 
#include <stdio.h>
#include <process.h>
float **a, *b, *x;
int N;
 
void freematrix(){
   //free memory for matrixes
   int i;
   for(i=0; i<N; i++){
       delete [] a[i];
   }
   delete [] a;
   delete [] b;
   delete [] x;
}
 
void allocmatrix(){
   //allocate memory for matrixes
   int i,j;
   x = new float[N];
   b = new float[N];
   a = new float*[N];
   if(x==NULL || b==NULL || a==NULL){
       printf("\nNot enough memory to allocate for %d equations.\n", N);
       exit(-1);
   }
   for(i=0; i<N; i++){
       a[i] = new float[N];
       if(a[i]==NULL){
       printf("\nNot enough memory to allocate for %d equations.\n", N);
       }
   }
   for(i=0; i<N; i++){
       for(j=0; j<N; j++){
       a[i][j]=0;
       }
       b[i]=0;
       x[i]=0;
   }
}
 
void readmatrix(){
   int i=0,j=0;
   //read matrixes a and b from input data
   for(i=0; i<N; i++){
       for(j=0; j<N; j++){
       scanf("%f", &a[i][j]);
       }
       scanf("%f", &b[i]);
   }
}
 
void printmatrix(){
   //print matrix "a"
   int i=0,j=0;
   printf("\n");
   for(i=0; i<N; i++){
       for(j=0; j<N; j++){
       printf(" %+f*X%d", a[i][j], j);
       }
       printf(" =%f\n", b[i]);
   }
}
 
void printresult(){
   int i=0;
   printf("\n");
   printf("Result\n");
   for(i=0; i<N; i++){
       printf("X%d = %f\n", i, x[i]);
   }
}
 
void diagonal(){
   int i, j, k;
   float temp=0;
   for(i=0; i<N; i++){
       if(a[i][i]==0){
       for(j=0; j<N; j++){
           if(j==i) continue;
           if(a[j][i] !=0 && a[i][j]!=0){
           for(k=0; k<N; k++){
               temp = a[j][k];
               a[j][k] = a[i][k];
               a[i][k] = temp;
           }
           temp = b[j];
           b[j] = b[i];
           b[i] = temp;
           break;
           }
       }
       }
   }
}
 
void cls(){
   for(int i=0; i<25; i++) printf("\n");
}
 
void main(){
   int i=0, j=0, k=0;
   cls();
   printf("\nInput number of equations: ");
   scanf("%d", &N);
   allocmatrix();
   //read data
   printf("\nInput data according to the description in the begining of this cpp file:\n");
   readmatrix();
   //check if there are 0 on main diagonal and exchange rows in that case
   diagonal();
   printmatrix();
   //process rows
   for(k=0; k<N; k++){
       for(i=k+1; i<N; i++){
       if(a[k][k]==0){
           printf("\nSolution is not exist.\n");
           return;
       }
       float M = a[i][k] / a[k][k];
       for(j=k; j<N; j++){
           a[i][j] -= M * a[k][j];
       }
       b[i] -= M*b[k];
       }
   }
   printmatrix();
   for(i=N-1; i>=0; i--){
       float s = 0;
       for(j = i; j<N; j++){
       s = s+a[i][j]*x[j];
       }
       x[i] = (b[i] - s) / a[i][i];
   }
   printresult();
   freematrix();
}

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

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

  1. Объявлены переменные:
    • a - матрица коэффициентов (размерность NxN),
    • b - вектор правых частей (размерность Nx1),
    • x - вектор неизвестных (размерность Nx1).
  2. Выделены функции:
    • allocmatrix - выделяет память под матрицы и векторы,
    • readmatrix - считывает данные из стандартного ввода,
    • printmatrix - выводит матрицу a и вектор b,
    • printresult - выводит результат решения,
    • freematrix - освобождает память,
    • main - главная функция, считывает количество уравнений, вызывает функции работы с матрицами и выводит результат.
  3. Алгоритм решения:
    • Проверка наличия нулевых элементов на главной диагонали и перестановка строк в случае необходимости,
    • Вывод матрицы a и вектора b,
    • Цикл по всем строкам матрицы a,
    • Цикл по всем строкам, начиная с текущей строки + 1,
      • Если элемент на главной диагонали равен нулю, выводится сообщение об отсутствии решения и программа завершается,
      • Вычисление значения M для текущей строки,
      • Обновление матрицы a и вектора b для текущей строки и всех последующих строк,
    • Цикл по всем уравнениям (сверху вниз),
    • Вычисление значения s для текущего уравнения,
    • Вычисление значения x для текущего уравнения,
    • Вывод результата.
  4. Код не содержит ошибок компиляции, но для его работы необходимо подключение библиотеки process.h, которая не входит в стандартный набор библиотек C.

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


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

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

10   голосов , оценка 3.9 из 5
Похожие ответы