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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 5.00
isu
6 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 64
#1

Решение СЛОУ методом Гаусса с выбором главного элемента по строке - C++

17.12.2013, 12:13. Просмотров 4392. Ответов 22
Метки нет (Все метки)

Задание:Решение СЛОУ методом Гаусса с выбором главного элемента по строке.Для тестирования решить систему.
Запускается,но вывод получается жуткий,даже проверить тяжело,как поправить бы,пожалуйста)
Вот,что получилось:
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
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main() {
    double array[5][5];
    array[0][0]=2; array[0][1]=-4; array[0][2]=6; array[0][3]=2; array[0][4]=-2; 
    array[1][0]=1; array[1][1]=-2; array[1][2]=1; array[1][3]=-1; array[1][4]=-1; 
    array[2][0]=-1; array[2][1]=3; array[2][2]=-2; array[2][3]=4; array[2][4]=3; 
    array[3][0]=-1; array[3][1]=4; array[3][2]=1; array[3][3]=-3; array[3][4]=2; 
    array[4][0]=1; array[4][1]=-2; array[4][2]=3; array[4][3]=4; array[4][4]=-6; 
    int r,l,i,j,k=0;
    int n=4;
    double x[5];
    double h[5];
    double max,c;
    for(int i=0;i<=n;i++){
        if(i>=1) cout << "\n"; 
        for(int j=0;j<=n;j++){
            cout << "mas"<<++i <<":"<<++j <<": ";i--;j--;
            cout<< array[i][j] << " ";
            
            
        }
    }
    for(int k=0;k<=n;k++){
        cout << n;
        cout << "\n==============";
        max = array[k][0];
        l=1;
            for(i=1;i>n;i++){
                if(array[k][i]>max) {      //Находим максимальный элемнт
                    max = array[k][i];
                    l=i;
                }
            }
    }
    if(l!=k){ // Меняем к-й столбец и столбец с минимальным элементом местами
        cout << "Замена: ";
        cout << "\n max: " << max;
        cout << "\n l: " << l;
        for(i=10;i<=n;i++) h[5]= array[i][k];//Записываем k-й столбец в отдельный массив
        for(i=10;i<=n;i++) array[i][k]= array[i][l];//Вместо k-го столбца помещаем столбец с минимальным                 
     //  элементом
        for(i=10;i<=n;i++) array[i][l]= h[i];//Вместо столбца с минимальным элементом помещаем матрицу h
    }
    
    if(l!=k) {
        for(i=0;i<=n;i++){
            for(j=0;j<=n;j++){
                cout << array[i][j];
            }
 
        }
    }
 
    for(j=0;j<=n;j++){
        array[k][j]=array[k][j]/max;
        for(i=k+1;i<=n;i++){
            max=array[i][k];
            array[i][j]=array[i][j]-max*array[k][j];
        }
        for(i=0;i<=n;i++){
            for(j=1;j<=n;j++){
                cout<< array[i][j];
            }
        }
    }
    cout << "Матрица после прямого хода";
    for(i=0;i<=n;i++){
        for(j=0;j<=n;j++){
            cout <<array[i][j];
        }
    }
    c=0;
    x[n]= array[n][n]/array[n][n];
    for(i=n;i>=n;i--){
        c=0;
        for(j=i;j<=n;j++) c=c+array[i][j]*x[j];
        x[i]=array[i][n]-c;
    }
    cout <<"Ответ\n";
    for(i=0;i<=n;i++){
        cout << x[i]<< "\n";
    }
    cout <<"\n";
    system("pause");
}
Добавлено через 17 часов 33 минуты
актуально
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2013, 12:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Решение СЛОУ методом Гаусса с выбором главного элемента по строке (C++):

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

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

Метод Гаусса с выбором главного элемента по строке - C++
Метод Гаусса с выбором главного элемента по строке. Помогите разобраться в чем косяки программы. #include &lt;iostream&gt; #include...

СЛАУ методом Гаусса с выбором главного элемента в столбце - C++
СЛАУ методом Гаусса с выбором главного элемента по столбцу.Помогите пожалуйста с кодом программы,ошибки выдает #include &lt;locale&gt; ...

Исправить код С++ "Метод Гаусса с выбором главного элемента по строке" - C++
В данном коде есть где-то ошибки,помогите пожалуйста их найти #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include...

Метод Гаусса с выбором главного элемента - C++
Нужно написать программу, решающую СЛАУ методом Гаусса, так же надо учесть, что матрица может быть вырожденной, первый элемент может быть...

22
isu
6 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 64
23.12.2013, 14:01  [ТС] #16
Просто не очень хотелось особо вникать в чужой код,думал,что пара строчек только мешают,придется весь алгоритм менять?

Добавлено через 12 часов 8 минут
актуально,хочется уже доделать наконец)
0
MrGluck
Модератор
Эксперт CЭксперт С++
7800 / 4844 / 754
Регистрация: 29.11.2010
Сообщений: 13,211
23.12.2013, 15:40 #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
То что красным не можно методом Гаусса
-=ЮрА=-, почему же? Просто тогда обязательно принимаем одну из переменных за свободный член. Но решаем тем же способом.

Добавлено через 21 секунду
Цитата Сообщение от isu Посмотреть сообщение
актуально,хочется уже доделать наконец)
флаг вам в руки
0
isu
6 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 64
23.12.2013, 19:10  [ТС] #18
Последняя просьба,поправил,теперь работает с матрицами 3х3,проверьте,пожалуйста
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#include "stdafx.h"
#include <iostream>
#include <clocale>
#include <stdlib.h>
#include <iomanip>
#include <string>
#include <cstring>
#include <fstream>
#include <windows.h>
 
// Освобождает память из-под матрицы
template<typename T>
void FreeMemory(T** pmatrix, size_t const rows)
{
    for (size_t i = 0; i < rows; ++i)
    {
        delete[] pmatrix[i];
        pmatrix[i] = 0;
    }
    delete[] pmatrix;
    pmatrix = 0;
}
 
// Выделение памяти под матрицу
template<typename T>
T**& GetMemory(T**& pmatrix, size_t const rows, size_t const columns)
{
    size_t i = 0;
    try
    {
        pmatrix = new T*[rows];
        for (i = 0; i < rows; ++i)
            pmatrix[i] = 0;
        for (i = 0; i < rows; ++i)
            pmatrix[i] = new T[columns];
    }
    catch (std::bad_alloc const& exc)
    {
        std::cerr << "GetMemory: Exception: Неуспешное выделение памяти\n\n";
        FreeMemory(pmatrix, rows);
        throw;
    }
    return pmatrix;
}
 
// Заполняет матрицу из файла
template<typename T>
T**& FillFromFile(std::string const& filepath, T**& pmatrix, size_t& rows, size_t& columns)
{
    try
    {
        std::ifstream ifs(filepath.c_str());
        if (ifs.is_open())
        {
            ifs >> rows >> columns;
            if (!rows || !columns)
                throw "Ошибка чтения файла: !rows || !columns\n";
            GetMemory(pmatrix, rows, columns);
            for (size_t i = 0; i < rows; ++i)
            {
                for (size_t j = 0; j < columns; ++j)
                {
                    ifs >> pmatrix[i][j];
                }
            }
            if (!ifs)
                throw "Ошибка чтения файла: !ifs\n";
            ifs.close();
        }
        else
            std::cerr << "FillFromFile: неуспешное открытие файла\n";
    }
    catch (char const* e)
    {
        std::cerr << "FillFromFile: Exception: " << e << "\n\n";
        throw;
    }
    return pmatrix;
}
 
// Вывод матрицы в поток
template<typename T>
std::ostream& MatrixToStream(T* const* const pmatrix, size_t const rows, size_t const columns, std::ostream& ost = std::cout)
{
    ost << "\n-------------------------MatrixToStream-------------------------------\n";
    ost << "Размер: " << rows << " x " << columns << "\n";
    for (size_t i = 0; i < rows; ++i)
    {
        for (size_t j = 0; j < columns; ++j)
        {
            ost << std::setw(13) << std::left << pmatrix[i][j];
        }
        ost << "\n\n";
    }
    ost << "\n----------------------------------------------------------------------\n";
    return ost;
}
 
// Умножение массива на число
double* MultiplicationArrayToNumber(double* parray, size_t const columns, double const number)
{
    for (size_t j = 0; j < columns; ++j)
    {
        parray[j] = parray[j] * number;
    }
    return parray;
}
 
// Вычитание массива 2 из массива 1 (они равной длины)
double* SubtractionOfArrays(double* parray1, double* parray2, size_t const columns)
{
    for (size_t j = 0; j < columns; ++j)
    {
        parray1[j] = parray1[j] - parray2[j];
    }
    return parray1;
}
 
// Обмен двух массивов
void SwapArrays(double* parray1, double* parray2, size_t const columns)
{
    double* ptmparray = new double[columns];
    memcpy(ptmparray, parray1, columns * sizeof(double));
    memcpy(parray1, parray2, columns * sizeof(double));
    memcpy(parray2, ptmparray, columns * sizeof(double));
    delete[] ptmparray;
    ptmparray = 0;
}
 
// Поиск строки среди текущей и нижележащих строк, содержащей в заданном столбце максимальный элемент
size_t MaxRowIndex(double** pdmatrix, size_t const rows, size_t const columnindex)
{
    size_t maxrowindex = columnindex, i, j;
    for (i = columnindex + 1; i < rows; ++i)
    {
        if (pdmatrix[i][columnindex] > pdmatrix[columnindex][columnindex])
            maxrowindex = i;
    }
    return maxrowindex;
}
 
// Приведение матрицы к верхнетреугольному виду
size_t MakeTriangularMatrix(double** pdmatrix, size_t const rows, size_t const columns)
{
    size_t rootnumber = rows;
    size_t i = 0, j = 0, k = 0, maxrowindex = 0;
    double* prowcopy = new double[columns];
    for (j = 0; j < rows - 1; ++j)
    {
        maxrowindex = MaxRowIndex(pdmatrix, rows, j);
        if (maxrowindex != j)
            SwapArrays(pdmatrix[maxrowindex], pdmatrix[j], columns);
        if (double(0) != pdmatrix[j][j])
        {
            MultiplicationArrayToNumber(pdmatrix[j], columns, 1 / pdmatrix[j][j]);
            for (i = j + 1; i < rows; ++i)
            {
                memcpy(prowcopy, pdmatrix[j], columns * sizeof(double));
                MultiplicationArrayToNumber(prowcopy, columns, pdmatrix[i][j]);
                SubtractionOfArrays(pdmatrix[i], prowcopy, columns);
            }
        }
    }
    delete[] prowcopy;
    prowcopy = 0;
    // Проверка системы на вырожденность
    for (i = 0; i < rows; ++i)
    {
        bool zerorow = true;
        for (j = 0; j < columns - 1; ++j)
        {
            if (pdmatrix[i][j] != double(0))
            {
                zerorow = false;
                break;
            }
        }
        if (zerorow && pdmatrix[i][columns - 1] != double(0))
        {
            std::cout << "\nCистема НЕСОВМЕСТНА\n\n";
            rootnumber = 0;
            break;
        }
        else if (zerorow && pdmatrix[i][columns - 1] == double(0))
        {
            std::cout << "\nCистема имеет БЕСКОНЕЧНОЕ МНОЖЕСТВО РЕШЕНИЙ\n\n";
            rootnumber = rows + 5;
            break;
        }
    }
    return rootnumber; // Возвращает число корней
}
 
//Вычисляет корни СЛАУ по верхнетреугольной матрице
double* GetRoots(double** pdmatrix, size_t const rows, double* pdroots)
{
    int i = 0, j = 0;
    for (i = rows - 1; i >= 0; --i)
    {
        double sum = 0;
        for (j = rows - 1; j > i; --j)
            sum += pdroots[j] * pdmatrix[i][j];
        pdroots[i] = (pdmatrix[i][rows] - sum) / pdmatrix[i][i];
    }
    return pdroots;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    std::string const filepath("in.txt"); // файл с матрицей
    size_t rows = 0, columns = 0, i = 0, j = 0;
    double** pdmatrix = 0;
    try
    {
        FillFromFile(filepath, pdmatrix, rows, columns);
        if (rows + 0 == columns)
        {
            std::cout << "\n\nИсходная матрица:\n";
            MatrixToStream(pdmatrix, rows, columns);
            size_t rootnumber = MakeTriangularMatrix(pdmatrix, rows, columns);
            std::cout << "\n\nТреугольная матрица:\n";
            MatrixToStream(pdmatrix, rows, columns);
            if (rows == rootnumber)
            {
                double* pdroots = new double[rows];
                GetRoots(pdmatrix, rows, pdroots);
                std::cout << "\n\nКорни системы:\n\n";
                for (i = 0; i < rows; ++i)
                    std::cout << "X" << i << ": " << pdroots[i] << '\n';
                delete[] pdroots;
                pdroots = 0;
            }
            else
                std::cout << "Матрица вырождена\n";
        }
        else
            std::cerr << "Не соблюдено: rows == columns\n";
        FreeMemory(pdmatrix, rows);
    }
    catch (...){}
    return 0;
}
0
-=ЮрА=-
23.12.2013, 20:56
  #19

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
-=ЮрА=-, почему же? Просто тогда обязательно принимаем одну из переменных за свободный член. Но решаем тем же способом.
читай внимательно мои ответы[quote="-=ЮрА=-;5532753"]То что красным не можно методом Гаусса (по крайней мере не полагая один из корней числу от балды)

0
-=ЮрА=-
Заблокирован
Автор FAQ
23.12.2013, 21:25 #20
Цитата Сообщение от isu Посмотреть сообщение
Последняя просьба,поправил,теперь работает с матрицами 3х3,проверьте,пожалуйста
3 х 3 отработала при условии что делишь каждую строку на максимальный элемент, 4х4 не считается
1
Миниатюры
Решение СЛОУ методом Гаусса с выбором главного элемента по строке   Решение СЛОУ методом Гаусса с выбором главного элемента по строке  
isu
6 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 64
23.12.2013, 22:33  [ТС] #21
Спасибо за помощь,главное чтобы 3 на 3 работала,только ничего,что первая строка в два раза меньше,чем у вас?
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.12.2013, 23:40 #22
Цитата Сообщение от isu Посмотреть сообщение
Спасибо за помощь,главное чтобы 3 на 3 работала,только ничего,что первая строка в два раза меньше,чем у вас?
- если разделить на максимальный элемент строки и свободный член то тождественность не изменится

Добавлено через 1 минуту

Не по теме:

ЗЫ: лучше не изобретай алокатор - возьми готовый std::vector, который без труда сможет хранить н-мерную матрицу

1
isu
6 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 64
24.12.2013, 00:05  [ТС] #23
Спасибо большое)
0
24.12.2013, 00:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2013, 00:05
Привет! Вот еще темы с ответами:

Метод Гаусса с выбором элемента по столбцу - C++
Здравствуйте! Если не трудно, может кто-нибудь скинуть уже написанный код на С++ по методу Гаусса с выбором элемента по столбцу. Просто...

Решение СЛУ методом Гаусса - C++
Напишите плз прогу, которая будет решать слу методом Гаусса. #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;conio.h&quot; using...

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

Решение матриц Методом Гаусса - C++
Ребят, не запускается программа на C++ для Решения матриц Методом Гаусса. Пожалуйста, запустите и выясните в чём проблема. И желательно...


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

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

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