Решение СЛАУ методом Гаусса - 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(); }
Объяснение кода листинга программы
Код реализует метод Гаусса для решения системы линейных уравнений.
- Объявлены переменные:
a
- матрица коэффициентов (размерность NxN),b
- вектор правых частей (размерность Nx1),x
- вектор неизвестных (размерность Nx1).
- Выделены функции:
allocmatrix
- выделяет память под матрицы и векторы,readmatrix
- считывает данные из стандартного ввода,printmatrix
- выводит матрицуa
и векторb
,printresult
- выводит результат решения,freematrix
- освобождает память,main
- главная функция, считывает количество уравнений, вызывает функции работы с матрицами и выводит результат.
- Алгоритм решения:
- Проверка наличия нулевых элементов на главной диагонали и перестановка строк в случае необходимости,
- Вывод матрицы
a
и вектораb
, - Цикл по всем строкам матрицы
a
, - Цикл по всем строкам, начиная с текущей строки + 1,
- Если элемент на главной диагонали равен нулю, выводится сообщение об отсутствии решения и программа завершается,
- Вычисление значения
M
для текущей строки, - Обновление матрицы
a
и вектораb
для текущей строки и всех последующих строк,
- Цикл по всем уравнениям (сверху вниз),
- Вычисление значения
s
для текущего уравнения, - Вычисление значения
x
для текущего уравнения, - Вывод результата.
- Код не содержит ошибок компиляции, но для его работы необходимо подключение библиотеки
process.h
, которая не входит в стандартный набор библиотек C.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д