Написать программу которая находит решение СЛАУ методом Гаусса - C (СИ)

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

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

Помогите найти ошибку в коде. Нужно написать программу которая находит решение СЛАУ методом Гаусса. Получаются неверные ответы. Блок-схема:
#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;
}
Судя по онлайн решению ответы должны быть такими. x 1 = -4.5 x 2 = -9 x 3 = -10.5 x 4 = -9 x 5 = -4.5

Решение задачи: «Написать программу которая находит решение СЛАУ методом Гаусса»

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;
}

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

В этом коде:

  1. Объявляются переменные для числа уравнений и неизвестных, а также для матрицы коэффициентов и правой части уравнений.
  2. Пользователю предлагается ввести коэффициенты матрицы и правой части уравнений.
  3. Код выполняет метод Гаусса для решения системы линейных уравнений.
  4. Прямой ход метода Гаусса приводит матрицу к верхнетреугольному виду.
  5. Обратный ход метода Гаусса используется для нахождения решений.
  6. Код выводит найденные решения.
  7. Удаляются динамические переменные, созданные для матрицы и правой части уравнений.
  8. Программа возвращает 0, что означает успешное выполнение.

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


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

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

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