Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
valery7
1 / 1 / 1
Регистрация: 11.04.2018
Сообщений: 43
1

Определить матрицы по методу Гаусса

03.05.2018, 13:18. Просмотров 348. Ответов 2
Метки нет (Все метки)

Здравствуйте, написала программу вычисления определителя методом Гаусса c поиском ведущего элемента по столбцу, но при выделении памяти через "new" работает не верно.

Если выделять память как в C через "malloc", то работает, а так нет. Не понимаю, в чем дело. Прошу помощи. Выделяю память вроде правильно, я уже очень много статей посмотрела, как выделить память.

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
#include <math.h>  
#include <clocale>
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
void delete_array(double **array, int row_count) 
{
    for (int r = 0; r < row_count; r++)
        delete[] array[r];
    delete[] array;
}
 
int get_matrix(ifstream &file, int size, double** arr, string fileName)
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
            file >> arr[i][j];
    }
    file.close();
    return 0;
}
 
int gaussMethod(int m, int n, double **a, double eps)
{
    int i, j, k, l;
    double r;
 
    i = 0; j = 0;
    while (i < m && j < n)
    {
        // Ищем максимальный элемент в j-м столбце,
        // начиная с i-й строки
        r = 0.0;
        for (k = i; k < m; ++k)
        {
            if (fabs(*a[k*n + j]) > r)
            {
                l = k;      // Запомним номер строки
                r = fabs(*a[k*n + j]); // и макс. эл-т
            }
        }
        if (r <= eps)
        {
            // Все элементы j-го столбца по абсолютной
            // величине не превосходят eps.
            // Обнулим столбец, начиная с i-й строки
            for (k = i; k < m; ++k)
                *a[k*n + j] = 0.0;
 
            j++;      // Увеличим индекс столбца
        }
 
        if (l != i)
        {
            // Меняем местами i-ю и l-ю строки
            for (k = j; k < n; ++k)
            {
                r = *a[i*n + k];
                *a[i*n + k] = *a[l*n + k];
                *a[l*n + k] = (-r); // Меняем знак строки
            }
        }
 
        // Обнуляем j-й столбец, начиная со строки i+1,
        // применяя элем. преобразования второго рода
        for (k = i + 1; k < m; ++k)
        {
            r = (-(*a[k*n + j]) / (*a[i*n + j]));
 
            // К k-й строке прибавляем i-ю, умноженную на r
            *a[k*n + j] = 0.0;
            for (l = j + 1; l < n; ++l)
                *a[k*n + l] += r * (*a[i*n + l]);
 
        }
 
        i++; j++;   // Переходим к следующему минору
    }
 
    return i; 
}
 
int main() 
{
    setlocale(LC_ALL, "rus");
    int m, n, i, j, rank;
    double **a;
    double eps, det;
 
    string fileName;
    cout << "Введите имя файла: ";
    cin >> fileName;
    ifstream file(fileName);
 
    file >> m >> n;
    a = new double*[n];
    for (int i = 0; i < n; i++)
        a[i] = new double[n];
 
    get_matrix(file, n, a, fileName);
    cout << "[Матрица]" << endl;
    cout << endl;
    cout << "Размерность матрицы матрицы: " << n << "x" << n << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << a[i][j] << "\t";
        }
        cout << endl;
    }
 
    file >> eps;
 
    rank = gaussMethod(m, n, a, eps);
 
    cout << "Ранг " << rank;
 
    det = 1.0;
    for (i = 0; i < m; ++i) 
        det *= *a[i*n + i];
        
    cout << det << endl;
 
 
    delete_array(a, n);
    return 0;  
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2018, 13:18
Ответы с готовыми решениями:

СЛАУ по методу Гаусса
Доброго времени суток! Нужна помощь в написании программы на с++. Условия:...

Написать программу па методу Гаусса
Кто может написать программу па методе Гаусса

Нахождение определителя прибегая к методу Гаусса
Программа почти готова, однако имеет один недостаток. Она оставляет на главной диагонали единицы...

Нахождение матрицы 3x3 по методу Гаусса
Здравствуйте! У меня проблема, она заключается в том, что программа работает, выдает правильные...

Определить минимум функции по методу Гаусса-Зейделя
Дана функция, надо определить её минимум по методу Гаусса-Зейделя. Вот что получилось, но...

2
SpBerkut
Объявлятель переменных
950 / 276 / 276
Регистрация: 24.09.2011
Сообщений: 1,009
Завершенные тесты: 2
03.05.2018, 13:41 2
У Вас массив объявлен как двумерный, а в функции вычисления определителя Вы с ним пытаетесь работать как с линейным.

Поправил на скорую руку. Вроде работает.
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
int gaussMethod(int m, int n, double **a, double eps)
{
    int i, j, k, l;
    double r;
 
    i = 0; j = 0;
    while (i < m && j < n)
    {
        // Ищем максимальный элемент в j-м столбце,
        // начиная с i-й строки
        r = 0.0;
        for (k = i; k < m; ++k)
        {
            if (fabs(a[k][j]) > r)
            {
                l = k;      // Запомним номер строки
                r = fabs(a[k][j]); // и макс. эл-т
            }
        }
        if (r <= eps)
        {
            // Все элементы j-го столбца по абсолютной
            // величине не превосходят eps.
            // Обнулим столбец, начиная с i-й строки
            for (k = i; k < m; ++k)
                a[k][j] = 0.0;
 
            j++;      // Увеличим индекс столбца
        }
 
        if (l != i)
        {
            // Меняем местами i-ю и l-ю строки
            for (k = j; k < n; ++k)
            {
                r = a[i][k];
                a[i][k] = a[l][k];
                a[l][k] = (-r); // Меняем знак строки
            }
        }
 
        // Обнуляем j-й столбец, начиная со строки i+1,
        // применяя элем. преобразования второго рода
        for (k = i + 1; k < m; ++k)
        {
            r = (-(a[k][j]) / (a[i][j]));
 
            // К k-й строке прибавляем i-ю, умноженную на r
            a[k][j] = 0.0;
            for (l = j + 1; l < n; ++l)
                a[k][l] += r * (a[i][l]);
 
        }
 
        i++; j++;   // Переходим к следующему минору
    }
 
    return i; 
}
1
valery7
1 / 1 / 1
Регистрация: 11.04.2018
Сообщений: 43
03.05.2018, 14:10  [ТС] 3
SpBerkut, Огромное вам спасибо, в самой программе тоже подправила вычисление определителя, теперь все верно работает.
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2018, 14:10

Решить по методу Гаусса
Решить по методу Гаусса система уравнений x-y-z=1 x+y+z=1 2x-3y+4z=9

СЛАУ по методу Гаусса
решил систему уравнений по методу Гаусса получил вот такой ответ что делать дальше дело в том...

Решение СЛАУ по методу Гаусса
Доброго вечера господа! У меня возникла проблема при написании программы, а конкретно: при запуске...


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

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

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