Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KPN
4 / 4 / 1
Регистрация: 23.03.2012
Сообщений: 40
#1

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

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

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

вот что сделал:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2012, 16:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Системы линейных уравнений методом Гаусса (C++):

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

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

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

Найти решение системы линейных уравнений методом Гаусса с выбором главного элемента в столбце - C++
Решить систему линейных уравнений методом Гаусса с выбором главного элемента в столбце. Вот моя программа #include &quot;stdafx.h&quot; ...

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

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

11
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
12.05.2012, 16:56 #2
http://www.cyberforum.ru/faq/thread436065.html
Смотри 5 пункт оглавления FAQ
0
KPN
4 / 4 / 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;
}
3
axelhz
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 1
05.11.2014, 10:26 #4
спс, очень помог
0
Neptyn
16 / 16 / 3
Регистрация: 23.09.2014
Сообщений: 125
18.12.2014, 14:10 #5
Цитата Сообщение от KPN Посмотреть сообщение
все, разобрался. Вот рабочий код:
Код C++
А если матрица вырожденная?
0
Мотороллер
430 / 241 / 37
Регистрация: 05.08.2013
Сообщений: 1,656
Завершенные тесты: 1
12.01.2015, 16:23 #6
Цитата Сообщение от KPN Посмотреть сообщение
delete[] matrix;
утечка памяти.
0
StasBerkutov
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 36
05.04.2015, 18:48 #7
Возникла проблема с константным выражением и памятью. Подскажите, пожалуйста, как ее решить
Кликните здесь для просмотра всего текста
Системы линейных уравнений методом Гаусса
0
StasBerkutov
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 36
05.04.2015, 18:52 #8
KPN, Возникла проблема с константным выражением и памятью. Подскажите, пожалуйста, как ее решить. Фото в комментарии выше
0
Neptyn
16 / 16 / 3
Регистрация: 23.09.2014
Сообщений: 125
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
teQuila1410
0 / 0 / 1
Регистрация: 30.03.2016
Сообщений: 5
30.03.2016, 02:49 #10
вот как сделал я:

#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
TerroKot
0 / 0 / 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;
}
0
Андей
0 / 0 / 0
Регистрация: 20.09.2014
Сообщений: 188
19.12.2017, 20:51 #12
Я понимаю, что тема уже старая, но вдруг. Можно ли, как-нибудь сделать, чтобы программа решала уравнения, например, с 8 уравнениями и 4 неизвестными?
0
19.12.2017, 20:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2017, 20:51
Привет! Вот еще темы с ответами:

Решение систем линейных уравнений методом Гаусса - C++
Такая вот проблема вышла, не работает один случай и никак не могу найти - в чем ошибка. Возьмем к примеру такое уравнение: 0 0 0 1 2 ...

Методом Гаусса решить систему n линейных алгебраических уравнений - C++
Помогите пожалуйста написать на с++ методом Гаусса решить систему n линейных алгебраических уравнений. Отсюда нашла именно ту тему там...

Решение линейных уравнений методом Гаусса (error C2664) - C++
Ошибка как я понял заключается в переводе данных с масивов,но немогу исправить. Данная программа решает линейные уравнения методом...

Решение систем линейных алгебраических уравнений методом Гаусса с выбором главного элемента - C++
Помогите пожалуйста найти решение системы линейных уравнений с матричными элементами. Условия задания матрицы в файле.


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

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

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