Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 301, средняя оценка - 4.65
KPN
 Аватар для KPN
3 / 3 / 1
Регистрация: 23.03.2012
Сообщений: 40
12.05.2012, 16:48     Системы линейных уравнений методом Гаусса #1
День(ночь, утро, вечер) добрый(-ая, -ое)
вопрос про метод Гаусса, как его реализовать на С++???
что-то совсем запутался...

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

C++ Решение системы линейных уравнений методом главных элементов
C++ Методом Гаусса решить систему n линейных алгебраических уравнений
Найти решение системы линейных уравнений методом Гаусса с выбором главного элемента в столбце C++
Системы линейных уравнений методом Гаусса C++
C++ Решение системы линейных уравнений матричным методом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
12.05.2012, 16:56     Системы линейных уравнений методом Гаусса #2
http://www.cyberforum.ru/faq/thread436065.html
Смотри 5 пункт оглавления FAQ
KPN
 Аватар для KPN
3 / 3 / 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;
}
axelhz
Сообщений: n/a
05.11.2014, 10:26     Системы линейных уравнений методом Гаусса #4
спс, очень помог
Neptyn
16 / 16 / 3
Регистрация: 23.09.2014
Сообщений: 124
18.12.2014, 14:10     Системы линейных уравнений методом Гаусса #5
Цитата Сообщение от KPN Посмотреть сообщение
все, разобрался. Вот рабочий код:
Код C++
А если матрица вырожденная?
Мотороллер
428 / 240 / 37
Регистрация: 05.08.2013
Сообщений: 1,629
Завершенные тесты: 1
12.01.2015, 16:23     Системы линейных уравнений методом Гаусса #6
Цитата Сообщение от KPN Посмотреть сообщение
delete[] matrix;
утечка памяти.
StasBerkutov
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 36
05.04.2015, 18:48     Системы линейных уравнений методом Гаусса #7
Возникла проблема с константным выражением и памятью. Подскажите, пожалуйста, как ее решить
Кликните здесь для просмотра всего текста
Системы линейных уравнений методом Гаусса
StasBerkutov
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 36
05.04.2015, 18:52     Системы линейных уравнений методом Гаусса #8
KPN, Возникла проблема с константным выражением и памятью. Подскажите, пожалуйста, как ее решить. Фото в комментарии выше
Neptyn
16 / 16 / 3
Регистрация: 23.09.2014
Сообщений: 124
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); //одномерный
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2016, 02:49     Системы линейных уравнений методом Гаусса
Еще ссылки по теме:

Решение систем линейных уравнений методом Гаусса C++
C++ Решение системы линейных алгебраических уравнений методом Гаусса

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

Или воспользуйтесь поиском по форуму:
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 секунд
вот как сделал я:
Yandex
Объявления
30.03.2016, 02:49     Системы линейных уравнений методом Гаусса
Ответ Создать тему
Опции темы

Текущее время: 01:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru