Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/103: Рейтинг темы: голосов - 103, средняя оценка - 4.76
lp_4eva
Учусь...
59 / 2 / 2
Регистрация: 20.03.2010
Сообщений: 167
1

Методом Гаусса решить систему n линейных алгебраических уравнений

15.09.2011, 15:03. Просмотров 18886. Ответов 8
Метки нет (Все метки)

Помогите пожалуйста написать на с++ методом Гаусса решить систему n линейных алгебраических уравнений. Отсюда нашла именно ту тему там есть один код, он у меня нормально выходит. Только проблема в том что не могу разобрать код. помогите разобрать?!
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
#include <iostream>
#include <iomanip>
 
void swap(double &a, double &b)
{
    double temp = a;
    a = b;
    b = temp;
}
 
void Gauss(double **A, double *B, unsigned dim) //результат - вектор Х получам в векторе В
{
    for (unsigned k = 0; k < dim; ++k)
    {
        if (A[k][k] == 0.0)
        {
            for (unsigned i = k + 1; i < dim; ++i)
            {
                if (A[i][k] != 0.0)
                {
                    for (unsigned j = 0; j < dim; ++j)
                        swap(A[i][j], A[k][j]);
 
                    swap(B[i], B[k]);
 
                    break;
                }
            }
        }
 
        double div = A[k][k];
 
        for (unsigned j = 0; j < dim; ++j)
            A[k][j] /= div;
 
        B[k] /= div;
 
        for (unsigned i = k + 1; i < dim; ++i)
        {
            double multi = A[i][k];
 
            for (unsigned j = 0; j < dim; ++j)
                A[i][j] -= multi * A[k][j];
 
            B[i] -= multi * B[k];
        }
    }
 
    for (unsigned k = dim - 1; k > 0; --k)
    {
        for (unsigned i = k - 1; i + 1 > 0; --i)
        {
            double multi = A[i][k];
 
            for (unsigned j = 0; j < dim; ++j)
                A[i][j] -= multi * A[k][j];
 
            B[i] -= multi * B[k];
        }
    }
}
 
int main()
{
    double *A[5];
    double B[5] = {22.0, 14.0, 456.0, 0.0, 5.0};
 
    for (int i = 0; i < 5; ++i)
        A[i] = new double [5];
 
    A[0][0] = 2;          A[0][1] = 0;  A[0][2] = 0;    A[0][3] = -12;  A[0][4] = 3;
    A[1][0] = 0;          A[1][1] = 2;  A[1][2] = 0;    A[1][3] = 3;    A[1][4] = 2;
    A[2][0] = 0;          A[2][1] = 0;  A[2][2] = 38;   A[2][3] = 5;    A[2][4] = 7;
    A[3][0] = -12; A[3][1] = 13;        A[3][2] = 5;    A[3][3] = 0;    A[3][4] = 0;
    A[4][0] = 3;    A[4][1] = 2;    A[4][2] = 7;        A[4][3] = 0;    A[4][4] = 0;
 
    Gauss(A, B, 5);
 
    std::cout << "X = {"
           << B[0] << '\n'
              << B[1] << '\n'
              << B[2] << '\n'
           << B[3] << '\n'
           << B[4] 
              << "}" << std::endl;
 
    for (int i = 0; i < 5; ++i)
        delete [] A[i];
    std::getchar();
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2011, 15:03
Ответы с готовыми решениями:

Решить систему алгебраических уравнений методом Гаусса
Решить систему алгебраических уравнений методом Гаусса: 6X1-X2-X3=11,33,...

Решить систему линейных алгебраических уравнений
Решить CЛАУ 2A^tX=Y^2,где |2 1 5 6| |3| A= |5 2 2 6|...

Решение системы линейных алгебраических уравнений методом Гаусса
Решить систему n линейных алгебраических уравнений методом Гаусса. Использовать...

Решение систем линейных алгебраических уравнений методом Гаусса с выбором главного элемента
Помогите пожалуйста найти решение системы линейных уравнений с матричными...

Решить систему линейных уравнений вида Ax=b методом Зейделя
2)Решить систему линейных уравнений вида Ax=b методом Зейделя 6.9 0,0319...

8
-=ЮрА=-
Заблокирован
Автор FAQ
15.09.2011, 16:33 2
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от lp_4eva Посмотреть сообщение
Помогите пожалуйста написать на с++ методом Гаусса решить систему n линейных алгебраических уравнений.
- Вот код и результат работы
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
#include <windows.h>//malloc, system("pause")
#include <stdio.h>  //i/o
#include <conio.h>  //getch
#include <math.h>
 
void ShowVector(int n, double * vec);
void PryamoiHod(int n, double **a, double *b);
void ObratniHod(int n, double **a, double *b, double *x);
 
int main()
{
    int i,j,n;
    double **a, *b, *x;
    do
    {
        printf("Enter NUM of equations: ");
        scanf("%d",&n);
        //Выделяем память под матрицу А и векторы В и Х
        a = (double **)malloc(n*sizeof(double));
        b = (double *)malloc(n*sizeof(double));
        x = (double *)malloc(n*sizeof(double));
        for(i = 0; i < n; i++)
        {
            a[i] = (double *)malloc(n*sizeof(double));
            //Ввод a
            for(j = 0; j < n; j++)
            {
                printf("a[%d][%d] = ",i + 1,j + 1);
                scanf("%lf",&a[i][j]);
            }
        }
        //Ввод b
        for(i = 0; i < n; i++)
        {
            printf("b[%d] = ",i + 1);
            scanf("%lf",&b[i]);
        }
        
        printf("\tSee input\r\n");
        printf("Matrix A:\r\n");
        for(i = 0; i < n; i++)
            ShowVector(n, a[i]);
        printf("Vector B:\r\n");
        ShowVector(n, b);
        
        printf("\tSolving on Gauss method\r\n");
        PryamoiHod(n, a, b);
        printf("Forvard Gauss course\r\n");//Прямой ход
        printf("Matrix A:\r\n");
        for(i = 0; i < n; i++)
            ShowVector(n, a[i]);
        printf("Vector B:\r\n");
        ShowVector(n, b);
 
        ObratniHod(n, a, b, x);
        printf("Back Gauss course\r\n");//Обратный ход
        printf("Matrix A:\r\n");
        for(i = 0; i < n; i++)
            ShowVector(n, a[i]);
        printf("Vector B:\r\n");
        ShowVector(n, b);
 
        printf("Results :\r\n");
        ShowVector(n, x);
 
        printf("Press Y for new input\r\n");
        //Чистим память
        free((void *)a);
        free((void *)b);
        free((void *)x);
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
 
void ShowVector(int n, double * vec)
{
    for(int i = 0; i < n; i++)
        printf("%.3f ",vec[i]);
    printf("\r\n");
}
 
void PryamoiHod(int n, double **a, double *b)
{
        double v;
        for(int k = 0,i,j,im; k < n - 1; k++)
        {
                im = k;
                for(i = k + 1; i < n; i++)
                {
                        if(fabs(a[im][k]) < fabs(a[i][k]))
                        {
                                im = i;
                        }
                }
                if(im != k)
                {
                        for(j = 0; j < n; j++)
                        {
                                v                = a[im][j];
                                a[im][j] = a[k][j];
                                a[k][j]  = v;
                        }
                        v     = b[im];
                        b[im] = b[k];
                        b[k]  = v;
                }
                for(i = k + 1; i < n; i++)
                {
                        v               = 1.0*a[i][k]/a[k][k];
                        a[i][k] = 0;
                        b[i]    = b[i] - v*b[k];
                        if(v != 0)
                        for(j = k + 1; j < n; j++)
                        {
                                a[i][j] = a[i][j] - v*a[k][j];
                        }
                }
        }
}
 
void ObratniHod(int n, double **a, double *b, double *x)
{
        double s = 0;
        x[n - 1] = 1.0*b[n - 1]/a[n - 1][n - 1];
        for(int i = n - 2, j; 0 <= i; i--)
        {
                s = 0;
                for(j = i + 1; j < n; j++)
                {
                        s = s+a[i][j]*x[j];
                }
                x[i] = 1.0*(b[i] - s)/a[i][i];
        }
}
Результаты работы
Enter NUM of equations: 5
a[1][1] = 2
a[1][2] = 0
a[1][3] = 0
a[1][4] = -12
a[1][5] = 3
a[2][1] = 0
a[2][2] = 2
a[2][3] = 0
a[2][4] = 3
a[2][5] = 2
a[3][1] = 0
a[3][2] = 0
a[3][3] = 38
a[3][4] = 5
a[3][5] = 7
a[4][1] = -12
a[4][2] = 13
a[4][3] = 5
a[4][4] = 0
a[4][5] = 0
a[5][1] = 3
a[5][2] = 2
a[5][3] = 7
a[5][4] = 0
a[5][5] = 0
b[1] = 22
b[2] = 14
b[3] = 456
b[4] = 0
b[5] = 5
See input
Matrix A:
2.000 0.000 0.000 -12.000 3.000
0.000 2.000 0.000 3.000 2.000
0.000 0.000 38.000 5.000 7.000
-12.000 13.000 5.000 0.000 0.000
3.000 2.000 7.000 0.000 0.000
Vector B:
22.000 14.000 456.000 0.000 5.000
Solving on Gauss method
Forvard Gauss course
Matrix A:
-12.000 13.000 5.000 0.000 0.000
0.000 5.250 8.250 0.000 0.000
0.000 0.000 38.000 5.000 7.000
0.000 0.000 0.000 -11.662 3.474
0.000 0.000 0.000 0.000 3.596
Vector B:
0.000 5.000 456.000 50.794 64.678
Back Gauss course
Matrix A:
-12.000 13.000 5.000 0.000 0.000
0.000 5.250 8.250 0.000 0.000
0.000 0.000 38.000 5.000 7.000
0.000 0.000 0.000 -11.662 3.474
0.000 0.000 0.000 0.000 3.596
Vector B:
0.000 5.000 456.000 50.794 64.678
Results : <- Это ответы
-9.967 -12.491 8.555 1.002 17.987
Press Y for new input


 Комментарий модератора 
Сколько раз говорилось, такие полотна - под кат!


Добавлено через 45 минут
silent_1991,
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Сколько раз говорилось, такие полотна - под кат!
как делать такие поля для скрывания кода???В FAQ и инструкциях по форуму ничего не нашёл по управлению тегами - поэтому и не смог скрыть...
11
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
15.09.2011, 16:43 3
-=ЮрА=-, и как вы смотрели? Здесь пункт 4.
2
Миниатюры
Методом Гаусса решить систему n линейных алгебраических уравнений  
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 09:55 4
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
void PryamoiHod(int n, double **a, double *b)
строка
92 - 109, переставляем строки в системе чтобы модули элементов по главной диагонали стояли в убывающем порядке
110 - 119, зануляем элементы под главной диагональю
Подробней о методе Гаусса здесь
Решение систем линейных уравнений методом Гаусса
Обратный ход тривиален, находим корни от конца...
3
kaboom
0 / 0 / 0
Регистрация: 23.09.2013
Сообщений: 7
25.10.2013, 06:39 5
а почему вы расставляете элементы диагонали по убыванию?
0
-=ЮрА=-
Заблокирован
Автор FAQ
25.10.2013, 21:40 6
Цитата Сообщение от kaboom Посмотреть сообщение
а почему вы расставляете элементы диагонали по убыванию?
- оптимизация позволяющая исключить крайнее замедление алгоритма для сильно разрежённых СЛАУ
0
lamobot
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 2
27.10.2016, 21:18 7
хочется верить, что автора ответа заблокировали за переменные int a,b,c,k,d...
0
ChaeRin
0 / 0 / 0
Регистрация: 17.02.2016
Сообщений: 1
08.02.2017, 07:04 8
За что заблокировали автора ответа? как понимать... код ведь рабочий

Добавлено через 38 секунд
за что ему дали блок... код ведь верный
0
GTai
0 / 0 / 0
Регистрация: 16.09.2016
Сообщений: 1
26.05.2018, 00:34 9
Код не верный, к сожалению... напишите на листочке банальную матрицу 3х3... Обидно, а почти всё верно.
0
26.05.2018, 00:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2018, 00:34

Решить систему алгебраических линейных неоднородных уравнени
У меня есть система линейных уравнений. В ней 4000 уравнений. Киньте плиз код...

Решение линейных уравнений методом Гаусса
Всем привет. Поставлена задача создать программу, способную решать линейные...

Системы линейных уравнений методом Гаусса
День(ночь, утро, вечер) добрый(-ая, -ое) вопрос про метод Гаусса, как его...


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

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

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