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

Решение СЛАУ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.95
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
30.09.2012, 00:03     Решение СЛАУ #1
Доброго времени суток . Пишу программу , которая должна решать системы линейных уравнений методом Гаусса(методом ведущего элемента в столбце) . Код написан , но почему-то возникают проблемы "на ровном месте" , например , неправильно находит ведущий элемент , хотя алгоритм вроде бы правильный . Буду благодарен за любую помощь .
C++ (Qt)
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
#include<iostream.h>
#include<math.h>
 
void swap_rows(double **, int, int, int);
void swap(double *, int, int);
void div_row(double **, int, int, double);
void Gauss_method(double **, double *, double *, int); 
 
int main(){
    int i, j, n;
    cout<<"System : Ax=b (A - n x n, b - n x 1)\n";
    cout<<"Enter n : "; 
    cin>>n;
    double ** A = new double * [n];
    for(i = 0; i < n; ++i) {
        A[i] = new double [n];
    }
    double * b = new double[n];
    cout<<"Enter the matrix A : \n";
    for(i = 0; i < n; ++i) {
        for(j = 0; j < n; ++j) {
            cin>>A[i][j];
        }
    }
    cout<<"Enter the vector b : \n";
    for(i = 0; i < n; ++i) {
        cin>>b[i];
    }
    // Решение системы
    double * x = new double [n];
    Gauss_method(A, b, x, n);
    cout<<"The solution : \n";
    for(i = 0; i < n; ++i) {
        cout<<"x_"<<i+1<<" = "<<x[i]<<"\n";
    }
    cout<<endl;
    // Очистка памяти  
    for(i = 0; i < n; ++i) {
        delete  A[i];
    }
    delete [] A;
    delete [] b;
    delete [] x;
 
    return 0;
}
 
void swap_rows(double ** A, int n, int i, int j) {
    double tmp = 0;
    for(int k = 0; k < n; ++k) {
        tmp = A[i][k];
        A[i][k] = A[j][k];
        A[j][k] = tmp;
    }
}
 
void swap(double * b, int i, int j) {
    double tmp = b[i];
    b[i] = b[j];
    b[j] = tmp;
}
 
void div_row(double ** A, int n, int i, double d) {
    for(int k = 0; k < n; ++k){
        A[i][k] /= d;
    }
}
 
void Gauss_method(double ** A, double * b, double * x, int n) {
    int i, j, k;
    int row;
    double d = 0, tmp = 0;
    for(k = 0; k < n; ++k) {
        for(i = k; i < n; ++i) {
            if(fabs(A[i][k]) > d){
                d = fabs(A[i][k]);
                row = i;
            }
        }
        if(row != k) {
            swap(b, row, k);
            swap_rows(A, n, row, k);
        }
        b[k] /= A[k][k];
        div_row(A, n, k, A[k][k]);
        for(i = k + 1; i < n; ++i){
            tmp = A[i][k];
            b[i] -= tmp * b[k];
            for(j = k; j < n; ++j) {
                A[i][j] -= tmp * A[k][j];
            }
        }
    }
    for(i = n - 1; i >= 0; --i) {
        x[i] = b[i];
        for(j = i+1; j < n; ++j){
            x[i] -= x[j] * A[i][j];
        }
    }
}
Добавлено через 1 час 27 минут
сам нашел ошибку. нужно было перед каждой итерацией внешнего цикла в функции обнулять переменную d .
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2012, 00:03     Решение СЛАУ
Посмотрите здесь:

C++ Решение слау.
Решение специфичной СЛАУ C++
C++ Решение СЛАУ методом Якоби
C++ решение Слау
Решение СЛАУ методом отражений C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
30.09.2012, 10:10     Решение СЛАУ #2
Поверьте, это еще не все. А если у вас ноль на главной диагонали возникнет?
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
30.09.2012, 10:21     Решение СЛАУ #3
Цитата Сообщение от UFO94 Посмотреть сообщение
Поверьте, это еще не все. А если у вас ноль на главной диагонали возникнет?
верное замечание, поэтому меняйте местами строки, спуская вниз нулевую, только не забывайте что реузльтат от этого будет менятся на -1^n где n количество перестановок, + система может быть вырождена и решений будет бесконечно много, я код внимательно не смотрел , но если там этого не учтено то надо бы учесть
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
30.09.2012, 11:20  [ТС]     Решение СЛАУ #4
Да , забыл сказать , что систему надо было решить в предположении , что матрица А невырождена (чтобы было единственное решение) , а тогда на диагонали нулей быть не может , т.к. в каждом столбце можно будет выбрать отличный от 0 элемент .
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
30.09.2012, 11:24     Решение СЛАУ #5
Цитата Сообщение от dota Посмотреть сообщение
Да , забыл сказать , что систему надо было решить в предположении , что матрица А невырождена (чтобы было единственное решение) , а тогда на диагонали нулей быть не может , т.к. в каждом столбце можно будет выбрать отличный от 0 элемент .
неверно на диагонали может изночально и быть 0, и матрица будет иметь определитель
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
30.09.2012, 15:30  [ТС]     Решение СЛАУ #6
я понимаю , что могут быть нули , и не только на диагонали . я имею в виду в моем алгоритме , если она будет иметь ноль на диагонали, то в силу невырожденности под диагональю найдется ненулевой элемент (если такого не найдется , то матрица вырождена , причем это верно на любом шаге , т.к. формально мы все равно приведем матрицу к верхнетреугольному виду , а тогда определитель будет произведением диагональных элементов , среди которых есть нули) . потом мы просто меняем соответствующие строки местами , чтобы на диагонали нулей не было .
Yandex
Объявления
30.09.2012, 15:30     Решение СЛАУ
Ответ Создать тему
Опции темы

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