Решение СЛАУ методом Гаусса - 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.