Написать программу которая находит решение СЛАУ методом Гаусса - C (СИ)
Формулировка задачи:
Помогите найти ошибку в коде.
Нужно написать программу которая находит решение СЛАУ методом Гаусса.
Получаются неверные ответы.
Блок-схема:
Судя по онлайн решению ответы должны быть такими.
x 1 = -4.5
x 2 = -9
x 3 = -10.5
x 4 = -9
x 5 = -4.5
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define N 5
#define Q -2.23
#define D 2
int main()
{
double a[5][5]={Q, 1, 0, 0, 0, //исходная матрица
1, -2, 1, 0, 0,
0, 1, -2, 1, 0,
0, 0, 1, -2, 1,
0, 0, 0, 1, Q};
double b[5]={0, D, D, D, 0}; //вектор свободных коофициэнтов
double x[5]={0};
double k, m, p, j, i; //счётчики
double r, c, s;
for(k=0;k<N-1;k++)
{
p=k;
//printf("%f\n\n", p);
//printf("k=%f\n\n", k);
for(m=k+1;m<N;m++)
{
//printf("%f and %f\n\n", a[p][k], a[m][k]);
// printf("m=%f\n\n",m );
if(fabs(a[p][k])<fabs(a[m][k]))
{
p=m;
//printf("%f and %f\n\n", a[p][k], a[m][k]);
}
}
for(j=k;j<N;j++)
{
//printf("j=%f\n\n", j);
r=a[k][j];
//printf("%f\n\n", a[k][j]);
a[k][j]=a[p][j];
//printf("%f\n\n", a[p][j]);
a[p][j]=r;
}
/*printf("\n\n\n\n");
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
{
printf("%10f", a[i][j]);
}
}*/
r=b[k];
b[k]=b[p];
b[p]=r;
/* printf("\n\n\n");
for(i=0;i<n;i++)
printf("%10f", b[i]); */
for(m=k+1;m<N;m++)
{
c=a[m][k]/a[k][k];
// printf("c=%10f\n", c);
b[m]=b[m]-c*b[k];
for(i=k;i<N;i++)
{
a[m][i]-=c*a[k][i];
}
}
}
x[N-1]=b[N-1]/a[N-1][m-1];
for(k=N-2;k!=0;k--)
{
s=0;
for(i=k-1;i<N-1;i++)
{
s=s+a[k][i]*x[i];
}
x[k]=(b[k]-s)/a[k][k];
}
//printf("s=%f", s);
printf("\n\n\n");
for(i=0;i<N;i++)
printf("%f ", x[i]);
getch();
return 0;
}Решение задачи: «Написать программу которая находит решение СЛАУ методом Гаусса»
textual
Листинг программы
#include<iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
int main()
{
int i, j, n, m;
//создаем массив
cout << "введи число уравнений: ";
cin >> n;
cout << "введи число неизвестных: ";
cin >> m;
m+=1;
float **matrix = new float *[n];
for (i=0; i<n; i++)
matrix[i] = new float [m];
//инициализируем
for (i = 0; i<n; i++)
for (j = 0; j<m; j++)
{
cout << "Элемент " << "[" << i+1 << " , " << j+1 << "]: " ;
cin >> matrix[i][j];
}
//выводим массив
cout << "matrix: " << endl;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
cout << matrix[i][j] << " ";
cout << endl;
}
cout << endl;
//Метод Гаусса
//Прямой ход, приведение к верхнетреугольному виду
float tmp, xx[m];
int k;
for (i=0; i<n; i++)
{
tmp=matrix[i][i];
for (j=n;j>=i;j--)
matrix[i][j]/=tmp;
for (j=i+1;j<n;j++)
{
tmp=matrix[j][i];
for (k=n;k>=i;k--)
matrix[j][k]-=tmp*matrix[i][k];
}
}
/*обратный ход*/
xx[n-1] = matrix[n-1][n];
for (i=n-2; i>=0; i--)
{
xx[i] = matrix[i][n];
for (j=i+1;j<n;j++) xx[i]-=matrix[i][j]*xx[j];
}
//Выводим решения
for (i=0; i<n; i++)
cout << xx[i] << " ";
cout << endl;
delete[] matrix;
return 0;
}
Объяснение кода листинга программы
В этом коде:
- Объявляются переменные для числа уравнений и неизвестных, а также для матрицы коэффициентов и правой части уравнений.
- Пользователю предлагается ввести коэффициенты матрицы и правой части уравнений.
- Код выполняет метод Гаусса для решения системы линейных уравнений.
- Прямой ход метода Гаусса приводит матрицу к верхнетреугольному виду.
- Обратный ход метода Гаусса используется для нахождения решений.
- Код выводит найденные решения.
- Удаляются динамические переменные, созданные для матрицы и правой части уравнений.
- Программа возвращает 0, что означает успешное выполнение.