0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
1

Решение СЛАУ методом Гаусса

28.09.2014, 20:43. Показов 7111. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня программа для решения слау методом Гаусса с выбором главного элемента по столбцам. Что-то мне не нравятся ответы, гляньте может в чём-то накосячел? Очень прошу помогите, уже сил нету((. Заранее спасибо.
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define N 4
int main(void)
{
    //double mas[N][N + 1];
    double x[N],s,r; //Корни системы
    int i, j, k, z,max=0;
    int n = 4;
    double mas[N][N + 1] =
    { { 45, 5, 7, 7, 3 },
    { 2, 0, 4, 4, 6 },
    { 7, 56, 7, -5, 2 },
    { 6000, 3, 4, 6, 1 },
    };
    //Вывод введенной системы
 
    printf("Sistema\n");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n + 1; j++)
            printf("%7.2f ", mas[i][j]);
        printf("\n");
    }
    for (k = 0; k < 3; k++){
        max = abs(mas[k][k]);
        z = k;
        for (int i = k + 1; i < n; i++)
            if (abs(mas[i][k]) > max){
                max = abs(mas[i][k]);
                z = i;
            }
        if (z != k){
            int c[5];
            for (j = k; j < n + 1; j++){
                c[j] = mas[z][j];
                mas[z][j] = mas[k][j];
                mas[k][j] = c[j];
            }
            }
        for (i = k + 1; i < n; i++){
                r = mas[i][k] / mas[k][k];
                for (j = k; j < n+1; j++)
                    mas[i][j] = mas[i][j] - mas[k][j] * r;
                }
        }
    /*x[3] = mas[3][4]/mas[3][3];
    for (i = 3; i <= 0;i--){
        for (j = i + 1; j < N + 1; j++)
            s += mas[i][j] * x[j];
        x[i] = ;
    }*/
    x[3] = mas[3][4] / mas[3][3];
    x[2] = (mas[2][4]-(x[3]*mas[2][3]))/mas[2][2];
    x[1] = (mas[1][4]-(x[3]*mas[1][3]+x[2]*mas[1][2])) / mas[1][1];
    x[0] = (mas[0][4]-(x[3]*mas[0][3]+x[2]*mas[0][2]+x[1]*mas[0][1])) / mas[0][0];
    //for (i = 2; i <= 0; i--){
    //      x[i] = (mas[i][4] - (x[3] * mas[i][3]+x[2]*mas[i][2]+x[1]*mas[i][1])) / mas[i][i];
    //}
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n + 1; j++)
            printf("%7.2f ", mas[i][j]);
        printf("\n");
    }
    for (i = 0; i < n;i++)
    printf(" x[%d]= %lf %d\n",i+1,x[i]);
    _getch();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2014, 20:43
Ответы с готовыми решениями:

Решение СЛАУ методом Гаусса
Всем привет))) Друзья, сколько я уже лазию по инету и по этому форуму, я никак не могу найти...

Решение СЛАУ методом Гаусса
В институте задали написать программу решения СЛАУ методом Гаусса, но я абсолютный чайник (знаю,...

Решение СЛАУ методом Гаусса
помогите разобраться!!ВЫдает 85 ошибок!!!! #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include...

Реализовать решение СЛАУ методом Гаусса
Не могу разобраться в чём проблема. Пытаюсь реализовать метод гаусса, вроде бы всё правильно, но...

10
69 / 57 / 14
Регистрация: 20.12.2013
Сообщений: 623
29.09.2014, 01:40 2
Mansu,
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
int _tmain(int argc, _TCHAR* argv[])
{
    const int n=4;
    double r;
    int i, j, k, z, max, tmp;
    int masI[n];  //Массив индексов
 
    double mas[n][n + 1] =
    { { 45, 5, 7, 7, 3 },
      { 2, 0, 4, 4, 6 },
      { 7, 56, 7, -5, 2 },
      { 6000, 3, 4, 6, 1 }};
 
    for(i=0; i<n; ++i) masI[i]= i;
    //Вывод введенной системы
 
    printf("Sistema\n");
    for (i = 0; i < n; i++)
    {
     for (j = 0; j < n + 1; j++) printf("%7.2f ", mas[i][j]);
     printf("\n");
    };
 
    for (k = 0; k < n; k++)
    {
        max = fabs(mas[masI[k]][k]);
        z = k;
        for (int i = k + 1; i < n; i++)
            if (fabs(mas[masI[i]][k]) > max)
            {
             max = fabs(mas[masI[i]][k]);
             z = i;
            };
 
        if (z!=k)
        {
         tmp= masI[k];
         masI[k]= masI[z];
         masI[z]= tmp;
        };
 
        r= mas[masI[k]][k];
        for (j = k; j < n+1; j++) mas[masI[k]][j]/= r;
        for (i = 0; i < n; i++)
        {
         r = mas[i][k];
         if(i!=masI[k]) for (j = k; j < n+1; j++) mas[i][j]-= mas[masI[k]][j] * r;
        };
    };
 
    for (i = 0; i < n; i++)
    {
     for (j = 0; j < n + 1; j++) printf("%7.4f ", mas[masI[i]][j]);
     printf("\n");
    };
 
    _getch();
}
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
29.09.2014, 08:40  [ТС] 3
Можете именно мою, а Вашу. Я сам нашел в интернете кучу рабочих прог, но хочу просто свою сделать.
0
69 / 57 / 14
Регистрация: 20.12.2013
Сообщений: 623
29.09.2014, 18:44 4
Цитата Сообщение от Mansu Посмотреть сообщение
Можете именно мою, а Вашу. Я сам нашел в интернете кучу рабочих прог, но хочу просто свою сделать.
Mansu, как минимум в строках 55-58 неправильно написано (попытка сделать обратный ход в методе Гаусса) - почему не записать в общем виде, как и прямой ход? Ведь очень тяжело понять. Кстати, Вам, вроде, надо же было без перестановок метод делать? У меня как раз с выбором главного элемента без перестановок.
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
29.09.2014, 20:14  [ТС] 5
А почему у него только главная диагональ 1? Это ж метод LU

Добавлено через 1 минуту
В гауссе должни бить 0 под главной диагональю.

Добавлено через 57 секунд
Вот у меня уже моя программа рабочая, только с перестановками, если поможете переделать, буду благодарен.
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define N 4
int main(void)
{
    //double mas[N][N + 1];
    double x[N],s,r,bnb[N]; //Корни системы
    int i, j, k, z,max=0;
    const int n = 4;
    double a[n] = {3,6,2,1};
    double mas[n][n] =
    { { 45, 5, 7, 7 },
    { 2, 0, 4, 4 },
    { 7, 56, 7, -5 },
    { 6000, 3, 4, 6 },
    };
    double c[n]; 
    for (i = 0; i<n; ++i) c[i] = i;
    //Вывод введенной системы
    printf("Sistema\n");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n ; j++)
            printf("%7.2f ", mas[i][j]);
        printf("%7.2f\n",a[i]);
    }
    for (k = 0; k < 3; k++){
        for (j = 0; j < n; j++)
            c[j] = mas[j][k];
        max = fabs(mas[k][k]);
        z = k;
        for (int i = k + 1; i < n; i++)
            if (abs(mas[i][k]) > max){
                max = abs(mas[i][k]);
                z = i;
            }
        if (z != k){
            int m;
            c[z] = m;
            c[z] = c[0];
            c[0] = m;
            /*for (j = k; j < n; j++){
                c = mas[k][j];
                mas[k][j] = mas[z][j];
                mas[z][j] = c;
            }
            c = a[k]; a[k] = a[z]; a[z] = c;*/
        }
        for (i = k + 1; i < n; i++){
                r = mas[c[i]][k] / mas[c[k]][k];
                for (j = k; j < n; j++)
                    mas[i][j] = mas[i][j] - mas[k][j] * r;
                a[i] = a[i] - a[k] * r;
        }
        }
    x[3] = a[3] / mas[3][3];
    for (i = 2; i >= 0; i--){
        s = 0;
        for (j = i + 1; j < n; j++)
            s = s + mas[i][j] * x[j];
        x[i] = (a[i] - s) / mas[i][i];
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j <n ; j++)
            printf("%7.2f ", mas[i][j]);
        printf("%7.2f\n",a[i]);
    }
    for (i = 0; i < n; i++){
        s = 0;
        for (j = 1; j < n;j++)
            s = s + mas[i][j] * x[j];
        bnb[i] = s - a[i];
    }
    for (i = 0; i < n; i++){
        printf(" x[%d]= %lf %d\n", i + 1, x[i]);
        printf(" bnb[%d]= %1.7lf %d\n", i + 1, bnb[i]);
    }
    _getch();
}
Добавлено через 38 минут
Я понял, у Вас последнем столбце ответы. Правильно?
0
69 / 57 / 14
Регистрация: 20.12.2013
Сообщений: 623
29.09.2014, 20:20 6
Так, извиняюсь, строки 55-58 правильные, ошибка только в строке 36 - замените int на double.
Не успел))

Добавлено через 2 минуты
Цитата Сообщение от Mansu Посмотреть сообщение
Я понял, у Вас последнем столбце ответы. Правильно?
да.
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
29.09.2014, 20:25  [ТС] 7
Это в какой программе изменить?

Добавлено через 1 минуту
И как мне сделать вектор отклонений?

Добавлено через 1 минуту
В моей программе он так считается.
C++
1
2
3
4
5
6
for (i = 0; i < n; i++){
        s = 0;
        for (j = 1; j < n;j++)
            s = s + mas[i][j] * x[j];
        bnb[i] = s - a[i];
    }
А в Вашей я набросал
C++
1
2
3
4
5
6
7
for (i = 0; i < n;i++){
         s = 0;
        for (j = 0; j < n; j++)
            s = s + mas[masI[k]][j] * mas[masI[i]][n];
        bnb[i] = s - (последний столбик, я не знаю как он у Вас обозначен);
        printf("%lf\n",bnb[i]);
    }
0
69 / 57 / 14
Регистрация: 20.12.2013
Сообщений: 623
29.09.2014, 20:25 8
Цитата Сообщение от Mansu Посмотреть сообщение
Это в какой программе изменить?
в самой первой
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
29.09.2014, 20:27  [ТС] 9
Да ладно, оно первая, я почти в Вашей разобрался. И как все-таки красиво вывести обработанную матрицу, как в моей 2 проге. И помогите с этим методом отклонений, он важен. По нему я пойму насколько точны подсчёты.
0
69 / 57 / 14
Регистрация: 20.12.2013
Сообщений: 623
29.09.2014, 21:01 10
А Вы уверены, что вторая Ваша программа рабочая? У меня не запускается - для индексов Вы используете действительную переменную (массив c).

Добавлено через 25 минут
Цитата Сообщение от Mansu Посмотреть сообщение
По нему я пойму насколько точны подсчёты.
И точность проще проверить просто подставив результат в уравнения.
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
29.09.2014, 21:22  [ТС] 11
Так правильно?
C++
1
bnb[i] = a[i] - mas[masI[i]][j] * mas[masI[i]][n];
где int a[n] = {3,6,2,1};???????????

Добавлено через 4 минуты
AndrSlav, Она работает, только там с перестановкой.

Добавлено через 2 минуты
Оно не правильно, но блин как написать?

Добавлено через 3 минуты
Где находится столбец переменных ,которые мы множем на r. Это они mas[i][n]???

Добавлено через 1 минуту
AndrSlav, Помогите пожалуйста, я уже потерялся((((
0
29.09.2014, 21:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2014, 21:22
Помогаю со студенческими работами здесь

Решение СЛАУ методом Гаусса, индексы
Собственно программа решает слау методом гаусса. Как найти индексы главного элемента на второй...

Решение СЛАУ методом Гаусса с выбором ведущего элемента
1) Написать вычислительную программу на языке программирования С++ для решения СЛАУ методом Гаусса...

Найти решение СЛАУ методом Гаусса (без перестановки строк)
Итак, требуется найти решение СЛАУ методом Гаусса (без перестановки строк). Проще говоря, есть...

Почему программа прерывается с ошибкой? Реализовывал решение СЛАУ методом Гаусса
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { int n=0; int...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru