29 / 29 / 2
Регистрация: 17.12.2012
Сообщений: 493
1

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

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

Всем привет))) Друзья, сколько я уже лазию по инету и по этому форуму, я никак не могу найти правильно работающей программки. Может кто нибудь поможет в реализации, программа должна работать в консольном приложении Visual Studio 2008.
А задача такая:
Написать программу, которая решает систему линейных уравнений методом Гаусса, а также вычисляет определитель матрицы этим же методом.
То есть, пользователь должен вводить коэффициенты при x1, x2, x3 и y1 и так далее (пусть будет система из 3-х уравнений). И затем программа должна выдавать значения иксов и значение определителя.
Буду очень признателен, если кто-нибудь поможет)
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2014, 14:12
Ответы с готовыми решениями:

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

Решение СЛАУ методом Гаусса
В институте задали написать программу решения СЛАУ методом Гаусса, но я абсолютный чайник (знаю,...

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

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

17
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,112
04.02.2014, 14:15 2
Что уже сделали?
0
Заблокирован
04.02.2014, 14:15 3
Цитата Сообщение от Alexandr1966 Посмотреть сообщение
Друзья, сколько я уже лазию по инету и по этому форуму, я никак не могу найти правильно работающей программки
1. Покажите код программы, который вы нашли.
2. Дайте тестовый пример, который показывает, что реализация неправильная.
0
29 / 29 / 2
Регистрация: 17.12.2012
Сообщений: 493
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
Заблокирован
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
29 / 29 / 2
Регистрация: 17.12.2012
Сообщений: 493
04.02.2014, 14:51  [ТС] 6
Спасибо большое за решение))
а как выводить на экран значение определителя матрицы????
вот допустим, на вашем примере матрица:
1 2
4 5
Определитель равен: 1*5-4*2 = -3
0
Заблокирован
04.02.2014, 15:01 7
Alexandr1966,
https://www.cyberforum.ru/post2450455.html
вам нужен 2.6. (3 способ)
0
29 / 29 / 2
Регистрация: 17.12.2012
Сообщений: 493
04.02.2014, 15:06  [ТС] 8
да, мне нужен этот способ, а как его программно реализовать, как добавить код в этой программе?
0
Заблокирован
04.02.2014, 15:21 9
Alexandr1966, покажите как вы это понимаете(реализовываете)
0
29 / 29 / 2
Регистрация: 17.12.2012
Сообщений: 493
04.02.2014, 15:27  [ТС] 10
я вот именно не знаю, как это программно реализовать, так то на бумаге посчитать я конечно же смогу
0
Заблокирован
04.02.2014, 15:35 11
Alexandr1966, а с чем конкретно сложности? вы ведь даже не пробуете сами выполнить задачу. Опишите словами, как вы понимаете общую формулу нахождения определителя.
0
2 / 2 / 1
Регистрация: 13.09.2017
Сообщений: 20
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
2 / 2 / 1
Регистрация: 13.09.2017
Сообщений: 20
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
2 / 2 / 1
Регистрация: 13.09.2017
Сообщений: 20
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
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
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
2 / 2 / 1
Регистрация: 13.09.2017
Сообщений: 20
08.10.2017, 17:35 16
этот код работает с компиллятором Dev-C++ 4.9.9.2 (скачал отсюда http://www.bloodshed.net ) ,если честно-компиллятор очень глючный и проблемный,может что приличнее посоветуете?
0
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
08.10.2017, 17:56 17
Бесплатные среды (IDE) для программирования на С/С++
Сам на Microsoft Visual Studio 2015 и не парюсь. А массивы объявите динамическими или в vector. О float забудьте, (используйте double) как и о конструкциях типа goto end.
1
2 / 2 / 1
Регистрация: 13.09.2017
Сообщений: 20
08.10.2017, 20:51 18
Согласен,с Dev-C++ придётся расставаться,пытался объявить переменные как double вместо float ,компилляция прошла,но на экзешник виндоуз начал ругаться,думаю это связано с неправильным использованием оперативной памяти компиллятором. Обнаружил ещё один глюк Dev-C++ 4.9.9.2 : если используешь в программе больше двух массивов,виндоуз тоже начинает ругаться на скомпилированный экзешник,поэтому пришлось использовать свободные места в уже созданных массивах.
Это последняя программа,написанная под этим компиллятором,она решает систему линейных уравнений,используя обратную матрицу,вычисленную методом Гаусса.

#include <iostream>
using namespace std;

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

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

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

// vvod elementov matrizi n*n
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n+1; 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;
}
}

// umnozenie

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


// vivod reshenia

cout << "reshenie" << endl;

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

//proverka-esli vse nuli to pravilno
cout << "test" << endl;

for (i = 1; i <= n; i++)
{
a=0;
for (j = 1; j <= n; j++)
{
a=a+array2[i][j]*array1[j][n+1];
}
b=a-array2[i][n+1];
cout << "test[" << i << "]=" << 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2017, 20:51
Помогаю со студенческими работами здесь

Решение СЛАУ методом Гаусса, индексы
Собственно программа решает слау методом гаусса. Как найти индексы главного элемента на второй...

Решение СЛАУ методом Гаусса с выбором ведущего элемента
1) Написать вычислительную программу на языке программирования С++ для решения СЛАУ методом Гаусса...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru