Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/548: Рейтинг темы: голосов - 548, средняя оценка - 4.83
5 / 5 / 1
Регистрация: 23.03.2012
Сообщений: 40
1

Системы линейных уравнений методом Гаусса

12.05.2012, 16:48. Просмотров 111167. Ответов 12
Метки нет (Все метки)

День(ночь, утро, вечер) добрый(-ая, -ое)
вопрос про метод Гаусса, как его реализовать на С++???
что-то совсем запутался...

вот что сделал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<iostream>
using namespace std;
 
int main()
{
   int i, j, n, m;
//создаем массив
   cout << "введи число уравнений: ";
         cin >> n;
         cout << "введи число неизвестных: ";
         cin >> m;
         m+=1;
    int **matrix = new int *[n];
         for (i=0; i<n; i++)
             matrix[i] = new int [m];
 
//инициализируем
   cout << "vvedi element" << endl;
    for (i = 0; i<n; i++)
        for (j = 0; j<m; j++)
            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;
 
//Метод Гаусса
//Прямой ход, приведение к верхнетреугольному виду
 
 
/*Обратный ход,
методом исключения неизвестных
в обратном порядке решаем уравнения
*/
 
 
 
 
//Выводим решения
 
     delete[] matrix;
return 0;
}
на форуме нашел подобную тему, но там со статическим массивом( нужно с динамическим)
вот как там реализовано:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 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];
     }
пробовал это совсестить с тем что я написал, не работает... при выводе решений пишет одни нули.

хелп, что не так делаю???

Добавлено через 8 часов 0 минут
сделал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<iostream>
using namespace std;
 
int main()
{
   int i, j, n, m;
//создаем массив
   cout << "введи число уравнений: ";
         cin >> n;
         cout << "введи число неизвестных: ";
         cin >> m;
         m+=1;
    int **matrix = new int *[n];
         for (i=0; i<n; i++)
             matrix[i] = new int [m];
 
//инициализируем
   cout << "vvedi element" << endl;
    for (i = 0; i<n; i++)
        for (j = 0; j<m; j++)
            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;
}
ответ выводится не верный.
где неправильно???

вот рабочий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define N    3
#define N1    N+1
using namespace std;
float matrix[N][N1]={{2,-1,3,2},
                                  {1,-2,1,3},
                                  {3,-1,3,4}};
 
float epsilon=0.001;
 
void ShowMatrix(void)
{
cout << "SLAU:" << endl;
  int i,j;
    for (i=0 ;i<N; i++)
      {
        for (j=0; j<N; j++)
          printf("%+3.3f*x%d",matrix[i][j],i+1);
        printf("=%3.3f\n",matrix[i][N]);
      }
}
 
int main()
{
  float tmp, xx[N1];
  short int i, j, k;
 
  ShowMatrix();
 
/*Метод Гаусса*/
/*прямой ход*/
  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];
     }
/*вывод решения*/
printf("\nMetod Gaussa:\n");
  for (i=0; i<N; i++)
    printf("x%d=%3.3f\n", i+1, xx[i]);
 
 return 0;
}
но здесь со статическим массивом.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2012, 16:48
Ответы с готовыми решениями:

Системы линейных уравнений методом Гаусса
Прошу помочь с составлением программы, позволяющей решать системы линейных уравнений методом Гаусса...

Решение системы линейных уравнений методом Гаусса
Всем привет! Ребята, пожалуйста помогите мне с решением системы линейных уравнений с помощью метода...

Решение системы линейных уравнений методом Гаусса
необходимо решить данную задачу в visual studio c++, если можно с комментариями, в консольном...

Решение системы линейных уравнений методом Гаусса
помогите найти ошибку, выводит результат, но не точный. Например в системе 10 9 19 9 8 17...

12
1065 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
12.05.2012, 16:56 2
https://www.cyberforum.ru/faq/thread436065.html
Смотри 5 пункт оглавления FAQ
0
5 / 5 / 1
Регистрация: 23.03.2012
Сообщений: 40
16.05.2012, 15:20  [ТС] 3
а тот код рабочей программы что выше но со статическим массивом как прикрутить чтобы работало с динамическим???
ввод динамического массива я сделал, как приделать метод Гаусса???

Добавлено через 58 минут
все, разобрался. Вот рабочий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#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;
}
4
axelhz
05.11.2014, 10:26 4
спс, очень помог
16 / 16 / 10
Регистрация: 23.09.2014
Сообщений: 135
18.12.2014, 14:10 5
Цитата Сообщение от KPN Посмотреть сообщение
все, разобрался. Вот рабочий код:
Код C++
А если матрица вырожденная?
0
434 / 245 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
12.01.2015, 16:23 6
Цитата Сообщение от KPN Посмотреть сообщение
delete[] matrix;
утечка памяти.
0
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 36
05.04.2015, 18:48 7
Возникла проблема с константным выражением и памятью. Подскажите, пожалуйста, как ее решить
Кликните здесь для просмотра всего текста
Системы линейных уравнений методом Гаусса
0
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 36
05.04.2015, 18:52 8
KPN, Возникла проблема с константным выражением и памятью. Подскажите, пожалуйста, как ее решить. Фото в комментарии выше
0
16 / 16 / 10
Регистрация: 23.09.2014
Сообщений: 135
07.05.2015, 14:22 9
Цитата Сообщение от StasBerkutov Посмотреть сообщение
Возникла проблема с константным выражением и памятью. Подскажите, пожалуйста, как ее решить
xx ты объявляешь как статический. Компилятор для статического массива выделяет место в памяти где хранится сам код поэтому он должен знать его размер до начала компиляции. Отсюда следует, что m должно быть константой:
C++
1
2
const m = 100; // 100 -- размер массива
float xx[m];
Место под динамический массив выделяется в куче(heap). То есть его можно создавать во время выполнения программы. В native C++(родной) объявляют его через указатель:
C++
1
float *xx = new float [100];
А в стандарте CLI 2011 года с помощью оператора gcnew:
C++
1
2
array<float, 2>^ xx2 = gcnew array<float, 2>(100, 100); //двухмерный
array<float>^ xx = gcnew array<float>(100); //одномерный
0
0 / 0 / 1
Регистрация: 30.03.2016
Сообщений: 5
30.03.2016, 02:49 10
вот как сделал я:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <ctime>
 
using namespace std;
 
class Matr
{
private:
    int size;
    double **mas;
    double *mas1;
public:
    Matr()
    {
        size = 0;
        mas = NULL;
        mas1 = NULL;
    }
    Matr(int l)
    {
        size = l;
        mas = new double*[l];
        for (int i = 0;i < l;i++)
            mas[i] = new double[l];
        mas1 = new double[l];
    }
    void Add()
    {
        for (int i = 0;i < size;i++)
            for (int j = 0;j < size;j++)
                mas[i][j] = rand() % 9;
        for (int i = 0;i < size;i++)
            mas1[i] = rand() % 10;
    }
    void Print()
    {
        for (int i = 0;i < size;i++)
        {
            
            for (int j = 0;j < size;j++)
            {
                printf("%4.f", mas[i][j]);
            }
            cout << "    ";
            printf("%4.f", mas1[i]);
            cout << endl;
                /*cout << mas[i][j] << " ";
            cout<< "         "<<mas1[i] << endl;*/
        }
    }
 
    void Koff()
    {
        double temp;
        for (int k = 1; k < size; k++)
        {
            for (int j = k; j < size; j++)
            {
                temp = mas[j][k - 1] / mas[k - 1][k - 1];
                for (int i = 0; i < size; i++)
                {
                    mas[j][i] = mas[j][i] - temp * mas[k - 1][i];
                }
                mas1[j] = mas1[j] - temp * mas1[k - 1];
            }
        }
    }
 
    void Gaus()
    {
        double sum=0;
        double *x = new double[size];
        for (int i = 0;i < size;i++)
            x[i] = 0;
        for (int i = size-1;i >= 0;i--)
        {
            
            x[i] = (mas1[i] - sum) / mas[i][i];
            sum = 0;
            if (i > 0)
            {
                for (int j = size - 1;j >= i;j--)
                    sum = sum + x[j] * mas[i - 1][j]; //2:24 a.m. 30.03.2016
            }
        }
        
        for (int i = 0;i < size;i++)
            cout <<"x"<<i+1<<"="<< x[i]<<" "<<endl;
    }
 
    ~Matr()
    {
        for (int i = 0;i < size;i++)
            delete mas[i];
        delete mas;
    }
};
 
int main()
{
    Matr a(10);
    a.Add();
    a.Print();
    a.Koff();
    cout << endl << endl << endl;
    a.Print();
    cout << endl << endl << endl;
    a.Gaus();
}
Добавлено через 58 секунд
вот как сделал я:
0
1 / 1 / 0
Регистрация: 27.09.2017
Сообщений: 1
27.09.2017, 03:57 11
Выдает ошибку.
C++
1
float  xx[m];
т.к. "m" должно быть константой.
Это новый массив и нужно выделить память.
C++
1
float *xx = new float [m];
Добавлено через 3 минуты
[quote="KPN;3039265"]все, разобрался. Вот рабочий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#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;
}

************************************************
Собственно рабочий вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
 
int main()
{
    int i, j, n, m;
    //создаем массив
    cout << "Number of equations: ";
    cin >> n;
    cout << "Number of variables: ";
    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 << " Element " << "[" << 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;
    int k;
    float *xx = new float [m];
 
    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;
    system("pause");
    return 0;
}
1
1 / 1 / 1
Регистрация: 20.09.2014
Сообщений: 310
19.12.2017, 20:51 12
Я понимаю, что тема уже старая, но вдруг. Можно ли, как-нибудь сделать, чтобы программа решала уравнения, например, с 8 уравнениями и 4 неизвестными?
0
0 / 0 / 0
Регистрация: 28.10.2018
Сообщений: 78
14.10.2020, 14:20 13
Как исправить ошибку ?
0
Миниатюры
Системы линейных уравнений методом Гаусса  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2020, 14:20

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Решение системы линейных алгебраических уравнений методом Гаусса
Решить систему n линейных алгебраических уравнений методом Гаусса. Использовать указатели.

Найти решение системы линейных уравнений методом Гаусса с выбором главного элемента в столбце
Решить систему линейных уравнений методом Гаусса с выбором главного элемента в столбце. Вот моя...

Решение линейных уравнений методом Гаусса
Всем привет. Поставлена задача создать программу, способную решать линейные уравнения методом...

Решение линейных уравнений методом Гаусса
Доброе утро! Вы могли бы помочь мне решить вариант №29


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.