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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 99, средняя оценка - 4.84
Alexandr1966
26 / 26 / 1
Регистрация: 17.12.2012
Сообщений: 438
#1

Решение СЛАУ методом Гаусса - C++

04.02.2014, 14:12. Просмотров 17487. Ответов 17
Метки нет (Все метки)

Всем привет))) Друзья, сколько я уже лазию по инету и по этому форуму, я никак не могу найти правильно работающей программки. Может кто нибудь поможет в реализации, программа должна работать в консольном приложении Visual Studio 2008.
А задача такая:
Написать программу, которая решает систему линейных уравнений методом Гаусса, а также вычисляет определитель матрицы этим же методом.
То есть, пользователь должен вводить коэффициенты при x1, x2, x3 и y1 и так далее (пусть будет система из 3-х уравнений). И затем программа должна выдавать значения иксов и значение определителя.
Буду очень признателен, если кто-нибудь поможет)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2014, 14:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решение СЛАУ методом Гаусса (C++):

Решение СЛАУ методом Гаусса - C++
помогите разобраться!!ВЫдает 85 ошибок!!!! #include <stdio.h> #include <conio.h> #include <tchar.h> #include <iostream> #include...

Решение СЛАУ методом Гаусса - C++
У меня программа для решения слау методом Гаусса с выбором главного элемента по столбцам. Что-то мне не нравятся ответы, гляньте может в...

Реализовать решение СЛАУ методом Гаусса - C++
Не могу разобраться в чём проблема. Пытаюсь реализовать метод гаусса, вроде бы всё правильно, но приводит матрицу к не правильному...

Решение СЛАУ методом Гаусса, индексы - C++
Собственно программа решает слау методом гаусса. Как найти индексы главного элемента на второй итерации? #include <iostream.h> ...

Найти решение СЛАУ методом Гаусса (без перестановки строк) - C++
Итак, требуется найти решение СЛАУ методом Гаусса (без перестановки строк). Проще говоря, есть матрица А, умножаемая на матрицу Х,...

Почему программа прерывается с ошибкой? Реализовывал решение СЛАУ методом Гаусса - C++
#include <iostream> #include <cmath> using namespace std; int main() { int n=0; int m=0; int l1=5; int...

17
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,534
04.02.2014, 14:15 #2
Что уже сделали?
0
Ev_Hyper
Заблокирован
04.02.2014, 14:15 #3
Цитата Сообщение от Alexandr1966 Посмотреть сообщение
Друзья, сколько я уже лазию по инету и по этому форуму, я никак не могу найти правильно работающей программки
1. Покажите код программы, который вы нашли.
2. Дайте тестовый пример, который показывает, что реализация неправильная.
0
Alexandr1966
26 / 26 / 1
Регистрация: 17.12.2012
Сообщений: 438
04.02.2014, 14:28  [ТС] #4
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
#include "stdafx.h"
#include "iostream"
#include "math.h"
#include "stdlib.h"
#include "locale.h"
#include "conio.h"
using namespace std;
 
int main()
{
   int i, j, n, m;
   setlocale(LC_ALL, "rus");
//создаем массив
   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;
 getch();
   return 0;
}
вот например, 46 строка ругается

Добавлено через 3 минуты
Методом Гаусса решить систему n линейных алгебраических уравнений
вот еще ссылка
1
Ev_Hyper
Заблокирован
04.02.2014, 14:33 #5
Цитата Сообщение от Alexandr1966 Посмотреть сообщение
вот например, 46 строка ругается
C++
1
float  tmp, *xx = new float[m];
Добавлено через 1 минуту
Цитата Сообщение от Alexandr1966 Посмотреть сообщение
вот еще ссылка
послушайте, ссылок можно сколько угодно накидать. Вместе с неправильно работающим кодом оставляйте тестовый пример, который показывает, что реализация неправильная..

Добавлено через 55 секунд
По вашему коду:
Код
введи число уравнений: 2
введи число неизвестных: 2
Элемент [1 , 1]: 1
Элемент [1 , 2]: 2
Элемент [1 , 3]: 3
Элемент [2 , 1]: 4
Элемент [2 , 2]: 5
Элемент [2 , 3]: 6
matrix:
1 2 3
4 5 6

-1 2
Для продолжения нажмите любую клавишу . . .
1
Alexandr1966
26 / 26 / 1
Регистрация: 17.12.2012
Сообщений: 438
04.02.2014, 14:51  [ТС] #6
Спасибо большое за решение))
а как выводить на экран значение определителя матрицы????
вот допустим, на вашем примере матрица:
1 2
4 5
Определитель равен: 1*5-4*2 = -3
0
Ev_Hyper
Заблокирован
04.02.2014, 15:01 #7
Alexandr1966,
Матрицы. Определители
вам нужен 2.6. (3 способ)
0
Alexandr1966
26 / 26 / 1
Регистрация: 17.12.2012
Сообщений: 438
04.02.2014, 15:06  [ТС] #8
да, мне нужен этот способ, а как его программно реализовать, как добавить код в этой программе?
0
Ev_Hyper
Заблокирован
04.02.2014, 15:21 #9
Alexandr1966, покажите как вы это понимаете(реализовываете)
0
Alexandr1966
26 / 26 / 1
Регистрация: 17.12.2012
Сообщений: 438
04.02.2014, 15:27  [ТС] #10
я вот именно не знаю, как это программно реализовать, так то на бумаге посчитать я конечно же смогу
0
Ev_Hyper
Заблокирован
04.02.2014, 15:35 #11
Alexandr1966, а с чем конкретно сложности? вы ведь даже не пробуете сами выполнить задачу. Опишите словами, как вы понимаете общую формулу нахождения определителя.
0
alexey72033
1 / 1 / 1
Регистрация: 13.09.2017
Сообщений: 14
27.09.2017, 01:08 #12
Уважаемые программисты,прошу не бить больно новичка,я не программист,а мастер по ремонту бытовой техники,изучать си ++ начал только недавно.Набил на клавиатуре нечто похожее на решение системы линейных уравнений методом Гаусса,получилось слишком примитивно и коряво,но работает.Из-за примитивности программы комменты излишни

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{

int n,m;
cout << "Vvedite razmer matrizi n: ";
cin >> n;
m=n+1;

float array1[n][m];
float array2[n][m];
float y[n];
float a,b;
int i,j,k,l;

for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
cout << "array[" << i << "," << j << "]=" ;
cin >> array1[i][j];
array2[i][j]=array1[i][j];
}
}


for (k = 1; k < n; k++)
{
while (array1[k][k]==0)
{
l=k;
do
{
l=k+1;
if (l>n) goto end;
}
while (array1[l][k]==0);

for (j = k; j <= m; j++)
{
b = array1[k][j];
array1[k][j]=array1[l][j];
array1[l][j]= b;
}
}

a=array1[k][k];
for (i = k+1; i <= n; i++)
{
b=array1[i][k]/a;
for (j = k; j <= m; j++)
{
array1[i][j]= array1[i][j] - (b*array1[k][j]);
}
}
}

for (j = n; j >= 1; j--)
{
if (array1[j][j]==0) goto end;
a=array1[j][m] / array1[j][j];
b=array1[j][j] / array1[j][j];
for (i = j-1; i >= 1; i--)
{
array1[i][m]= array1[i][m]-(array1[i][j]*a);
array1[i][j]= array1[i][j]-(array1[i][j]*b);
}
}
// cout << "test" << endl;
//for (i = 1; i <= n; i++)
//{
//for (j = 1; j <= m; j++)
//{
//cout << "array[" << i << "," << j << "]=" << array1[i][j]<< endl;

//}
//}
//cout << "reshenie" << endl;

for (i = 1; i <= n; i++)
{

array1[i][m]=array1[i][m]/array1[i][i];
array1[i][i]=array1[i][i]/array1[i][i];

}

cout << "reshenie" << endl;

for (i = 1; i <= n; i++)
{
cout << "X[" << i << "]="<< array1[i][m]<< endl;
}

cout << "test" << endl;

for (i = 1; i <= n; i++)
{
y[i]=0;

for (j = 1; j <= n; j++)
{
y[i]=y[i]+(array2[i][j]*array1[j][m]);

}
}

for (i = 1; i <= n; i++)
{
cout << "test[" << i << "]="<< array2[i][m]-y[i] << endl;
}

end: system("pause");
return 0;
}
0
alexey72033
1 / 1 / 1
Регистрация: 13.09.2017
Сообщений: 14
29.09.2017, 13:27 #13
доработал предыдущую программу-добавил модуль вычисления определителя и небольшие комментарии

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
// ввод элементов матрицы n*n+1
int n,m;
cout << "Vvedite razmer matrizi n: ";
cin >> n;
m=n+1;

float array1[n][m];
float array2[n][m];
float y[n];
float a,b;
int i,j,k,l;

for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
cout << "array[" << i << "," << j << "]=" ;
cin >> array1[i][j];
array2[i][j]=array1[i][j]; //копирование для последующей проверки
}
}

// прямой ход
for (k = 1; k < n; k++)
{
// поиск и перестановка ненулевых элементов
while (array1[k][k]==0)
{
l=k;
do
{
l=k+1;
if (l>n) goto end; //выход если в столбце все нули
}
while (array1[l][k]==0);

for (j = k; j <= m; j++)
{
b = array1[k][j];
array1[k][j]=array1[l][j];
array1[l][j]= b;
}
}
// приведение к "треугольному" виду
a=array1[k][k];
for (i = k+1; i <= n; i++)
{
b=array1[i][k]/a;
for (j = k; j <= m; j++)
{
array1[i][j]= array1[i][j] - (b*array1[k][j]);
}
}
}

// обратный ход

for (j = n; j >= 1; j--)
{
if (array1[j][j]==0) goto end; // выход если система не имеет решения
a=array1[j][m] / array1[j][j];
b=array1[j][j] / array1[j][j];
for (i = j-1; i >= 1; i--)
{
array1[i][m]= array1[i][m]-(array1[i][j]*a);
array1[i][j]= array1[i][j]-(array1[i][j]*b);
}
}
// cout << "test" << endl;
//for (i = 1; i <= n; i++)
//{
//for (j = 1; j <= m; j++)
//{
//cout << "array[" << i << "," << j << "]=" << array1[i][j]<< endl;

//}
//}
//cout << "reshenie" << endl;

// вычисление определителя основной матрицы

a=1;
for (i = 1; i <= n; i++)
{
a=a*array1[i][i];
}

cout << "det=" << a << endl;

// нормировка

for (i = 1; i <= n; i++)
{

array1[i][m]=array1[i][m]/array1[i][i];
array1[i][i]=array1[i][i]/array1[i][i];

}

// вывод решения

cout << "reshenie" << endl;

for (i = 1; i <= n; i++)
{
cout << "X[" << i << "]="<< array1[i][m]<< endl;
}

cout << "test" << endl;

// проверка правильности вычисления подстановкой решений в исходную систему

for (i = 1; i <= n; i++)
{
y[i]=0;

for (j = 1; j <= n; j++)
{
y[i]=y[i]+(array2[i][j]*array1[j][m]);

}
}

//если все нули,то решение правильное

for (i = 1; i <= n; i++)
{
cout << "test[" << i << "]="<< array2[i][m]-y[i] << endl;
}

// конец

end: system("pause");
return 0;
}
0
alexey72033
1 / 1 / 1
Регистрация: 13.09.2017
Сообщений: 14
07.10.2017, 16:19 #14
Нахождение обратной матрицы методом Гаусса

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
// vvod razmernosti n
int n,m;
cout << "Vvedite razmer matrizi n: ";
cin >> n;
m=n+n;

float array1[n][m];
float array2[n][n];

float a,b;
int i,j,k,l;

// vvod elementov matrizi n*n
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
cout << "array[" << i << "," << j << "]=" ;
cin >> array1[i][j];

array2[i][j]=array1[i][j];

}
}


//dopolnenie k osnovnoi matrize
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (j==i)
{
array1[i][j+n]=1;
}
else
{
array1[i][j+n]=0;
}
}
}


// pruamoi hod
for (k = 1; k < n; k++)
{
//poisk i perestanovka nenulevih elementov
while (array1[k][k]==0)
{
l=k;
do
{
l=k+1;
if (l>n) goto end; //vihod esli v stolbze vse nuli
}
while (array1[l][k]==0);

for (j = k; j <= m; j++)
{
b = array1[k][j];
array1[k][j]=array1[l][j];
array1[l][j]= b;
}
}

// privedenie k treugolnomu vidu
a=array1[k][k];
for (i = k+1; i <= n; i++)
{
b=array1[i][k]/a;
for (j = k; j <= m; j++)
{
array1[i][j]= array1[i][j] - (b*array1[k][j]);
}
}
}

// obratniy hod

for (k = n; k >= 1; k--)
{
if (array1[k][k]==0) goto end; // vihod esli sistema he imeet reshenia
b=array1[k][k] / array1[k][k];
for (i = k-1; i >= 1; i--)
{
a=array1[i][k] / array1[k][k];
for (j = n+1; j <= m; j++)
{
array1[i][j]= array1[i][j]-(array1[k][j]*a);
}
array1[i][k]= array1[i][k]-(array1[i][k]*b);
}
}



// vichislenie opredelitelua osnovnoy matrizi

a=1;
for (i = 1; i <= n; i++)
{
a=a*array1[i][i];
}

cout << "det=" << a << endl;


// normirovka

for (i = 1; i <= n; i++)
{
for (j = n+1; j <= m; j++)
{
array1[i][j]=array1[i][j]/array1[i][i];
}
array1[i][i]=array1[i][i]/array1[i][i];
}


// peremeshenie

for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
a=array1[i][j];
array1[i][j]=array1[i][j+n];
array1[i][j+n]=a;
}
}



// vivod reshenia

cout << "reshenie" << endl;

for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
cout << "array*[" << i << "," << j << "]=" << array1[i][j] << endl;
}
}


cout << "test" << endl;

for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
a=0;
for (k = 1; k <= n; k++)
{
a=a+array2[i][k]*array1[k][j];
}

b=array1[i][j+n]-a;
cout << "test[" << i << "," << j << "]=" << b << endl;
}
}



//cout << "test" << endl;

//for (i = 1; i <= n; i++)
//{
//for (j = 1; j <= n; j++)
//{
//cout << "array1[" << i << "," << j << "]=" << array1[i][j] << endl;
//}
//}

// konez

end: system("pause");
return 0;
}
0
мановар
906 / 340 / 75
Регистрация: 12.03.2016
Сообщений: 1,340
Завершенные тесты: 1
08.10.2017, 07:35 #15
alexey72033, и как, если не секрет, вот эта часть кода работает? (И выделяйте код тэгами)
C++
1
2
3
4
5
6
7
8
9
10
11
// ввод элементов матрицы n*n+1 
int n,m; 
cout << "Vvedite razmer matrizi n: ";
cin >> n;
m=n+1;
 
float array1[n][m];
float array2[n][m];
float y[n];
float a,b;
int i,j,k,l;
0
08.10.2017, 07:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2017, 07:35
Привет! Вот еще темы с ответами:

СЛАУ методом Гаусса - C++
Всем доброго времени суток. По-сколько я новичек в программирование, то вот скачал код, для решения СЛАУ методом Гауса. Выдает...

СЛАУ методом Жордана-Гаусса - C++
Нужна программа для решения СЛАУ методом Жордана-Гаусса с выбором главного элемента.

Решание СЛАУ методом Гаусса в С++ - C++
Салют обитателям форума! Вот значит какое дело, у меня такое задание : &quot;Решение уравнений методом Гаусса. Коэффициенты обрабатываются в...

Решить СЛАУ методом Гаусса (проверить) - C++
Есть код!компилируется без ошибок.Задача программы решить СЛАУ методом Гаусса Но я не понимаю почему вывод информации осуществляется...


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

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

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