Написать программу которая находит решение СЛАУ методом Гаусса - 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, что означает успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д