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

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

Войти
Регистрация
Восстановить пароль
 
lp_4eva
Учусь...
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
#1

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

15.09.2011, 15:03. Просмотров 18454. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Методом Гаусса решить систему n линейных алгебраических уравнений (C++):

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

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

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

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

Решить систему линейных уравнений вида Ax=b методом Зейделя - C++
2)Решить систему линейных уравнений вида Ax=b методом Зейделя 6.9 0,0319 0,039 0,461 0,0191 6,0 0,0333 0,405 0,0134 0,0205 5,1...

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

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
Эксперт С++
5005 / 3063 / 149
Регистрация: 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
Вчера, 00:34 #9
Код не верный, к сожалению... напишите на листочке банальную матрицу 3х3... Обидно, а почти всё верно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
Вчера, 00:34
Привет! Вот еще темы с ответами:

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

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

Решение линейных уравнений методом Гаусса - C++
Доброе утро! Вы могли бы помочь мне решить вариант №29

Системы линейных уравнений методом Гаусса - C++
Прошу помочь с составлением программы, позволяющей решать системы линейных уравнений методом Гаусса на языке C++ . Желателен наиболее...


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

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

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