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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 91, средняя оценка - 4.99
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
#1

Решение системы уравнений методом Гаусса - C++

14.11.2010, 20:03. Просмотров 11102. Ответов 8
Метки нет (Все метки)

Всем доброго времени суток. Нужно написать программу для решения СЛАУ методом Гаусса.
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
#include <stdio.h>
#include <stdlib.h>
#define n 4
void check(float mass[n][n],float sc[n], int i)
{
int j,t=0;
for (j=0;j<n;j++)
if (mass[i][j]!=0)
t=1;
if(t==0&&sc[i]==0){
printf("множество решений");
exit(0);}
if(t==0&&sc[i]!=0){
printf("система не совместна**");
exit(0);}
}
void check1(float mass[n][n],float sc[n],int i)
{
int j,k;
float b;
for (j=i+1;j<n-1;j++)
if (mass[j][i]!=0)
    {
    for (k=i;k<n;k++)
        {
        b=mass[i][k];
        mass[i][k]=mass[j][k];
        mass[j][k]=b;
        }
    b=sc[i];
    sc[i]=sc[j];
    sc[j]=b;
    return;
    }
}
void main()
{
float mass[n][n],sc[n],x[n];
float h=0;
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
    {
    printf("ввод матрицы:",i,j);
    scanf("%f",&mass[i][j]);
    }
for(i=0;i<n;i++)
    {
    printf("‚столбец свободных членов:",i);
    scanf("%f",&sc[i]);
    }
for(i=0;i<n;i++)
    {
    if(mass[i][i]==0)
    check1(mass,sc,i);
    for(j=i+1;j<n;j++)
        {
        h=mass[j][i]/mass[i][i];
        sc[j]=sc[j]-h*sc[i];
        for (k=i;k<n;k++)
        mass[j][k]=mass[j][k]-h*mass[i][k];
        h=0;
        }
    check(mass,sc,i);
    }
x[n-1]=sc[n-1]/mass[n-1][n-1];
for(i=n-2;i>=0;i--)
    {
    for(j=n-1;j>i;j--)
    sc[i]=sc[i]-mass[i][j]*x[j];
    x[i]=sc[i]/mass[i][i];
    }
for(i=0;i<n;i++)
printf("%2.1f\n",x[i]);
}
так вот. системы без перестановок (если не используется функция check1) она решает.типо
3 1 -1 -2
1 5 -1 8
2 0 3 1
но вот систему с перестановкой
0 1 0 -2 1
3 0 -3 2 1
2 -1 2 0 1
-5 0 1 0 1
которая должна быть не совместной, программа каким то образом вычисляет. что не так то?

Добавлено через 50 минут
ну помогите плиииз. я никак не могу понять где ошибка. если в check1 убрать return, то программа пишет что система не совместна. Но это будет ошибкой!

Добавлено через 1 час 24 минуты
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 <stdio.h>
#include <stdlib.h>
#define n 4
void check(float mass[n][n],float sc[n],int i)
{
int j,t=0;
for (i;i<n;i++)
    {
    for (j=0;j<n;j++)
    if (mass[i][j]!=0)
    t=1;
    if(t==0&&sc[i]==0){
    printf("бЁб⥬* Ё¬ҐҐв ЎҐбзЁб«Ґ**®Ґ ¬*®¦Ґбвў® аҐиҐ*Ё©");
    exit(0);}
    if(t==0&&sc[i]!=0){
    printf("бЁб⥬* *Ґб®ў¬Ґбв**");
    exit(0);}t=0;
    }
}
void check1(float mass[n][n],float sc[n],int i)
{
int j,k;
float b;
for (j=i+1;j<n-1;j++)
if (mass[j][i]!=0)
    {
    for (k=i;k<n;k++)
        {
        b=mass[i][k];
        mass[i][k]=mass[j][k];
        mass[j][k]=b;
        }
    b=sc[i];
    sc[i]=sc[j];
    sc[j]=b;
    return;
    }
}
void main()
{
float mass[n][n],sc[n],x[n];
float h=0;
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
    {
    printf("‚ўҐ¤ЁвҐ н«Ґ¬Ґ*в A[%d,%d] :",i,j);
    scanf("%f",&mass[i][j]);
    }
for(i=0;i<n;i++)
    {
    printf("‚ўҐ¤ЁвҐ %d-н«Ґ¬Ґ*в бв®«Ўж* бў®Ў®¤*ле з«Ґ*®ў:",i);
    scanf("%f",&sc[i]);
    }
for(i=0;i<n;i++)
    {
    if(mass[i][i]==0)
    check1(mass,sc,i);
    for(j=i+1;j<n;j++)
        {
        h=mass[j][i]/mass[i][i];
        sc[j]=sc[j]-h*sc[i];
        for (k=i;k<n;k++)
        mass[j][k]=mass[j][k]-h*mass[i][k];
        h=0;
        }
    check(mass,sc,i);
    }
printf("\n");
for(i=1;i<=n;i++)
{
printf("|");
for(j=1;j<=n;j++)
{
printf("%2.1f ",mass[i][j]);
}
printf("|");
printf("%2.1f",sc[i]);
printf("\n");
}
 
x[n-1]=sc[n-1]/mass[n-1][n-1];
for(i=n-2;i>=0;i--)
    {
    for(j=n-1;j>i;j--)
    sc[i]=sc[i]-mass[i][j]*x[j];
    x[i]=sc[i]/mass[i][i];
    }
for(i=0;i<n;i++)
printf("%2.1f\n",x[i]);
}
Немного исправил, добавил вывод конечной матрицы и изменил кое что в проверке на совместность, но даже при этом, при выводе матрицы с 0 0 0 0 3 оно мне находит корни уравнения. как????? провернка должна завершать программу, а она не завершает=(

Добавлено через 53 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void check(float mass[n][n],float sc[n],int i)
{
int j,t=0;
for (i;i<n;i++)
    {
    for (j=0;j<n;j++)
    if (fabs(mass[i][j]<0.01))
    t=1;
    if(t==0&&sc[i]==0){
    printf("бЁб⥬* Ё¬ҐҐв ЎҐбзЁб«Ґ**®Ґ ¬*®¦Ґбвў® аҐиҐ*Ё©");
    exit(0);}
    if(t==0&&sc[i]!=0){
    printf("бЁб⥬* *Ґб®ў¬Ґбв**");
    exit(0);}t=0;
    }
}
новые изменения в коде. Вспомнив что в типе float 0 обычно никак не получишь, я изменил условие идентификатора, но оно все равно не работает=( подскажите плиз-почему!!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2010, 20:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решение системы уравнений методом Гаусса (C++):

Решение системы линейных уравнений методом Гаусса - C++
необходимо решить данную задачу в visual studio c++, если можно с комментариями, в консольном режиме Реализуйте функцию решения...

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

Найти решение системы линейных уравнений методом Гаусса с выбором главного элемента в столбце - C++
Решить систему линейных уравнений методом Гаусса с выбором главного элемента в столбце. Вот моя программа #include &quot;stdafx.h&quot; ...

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

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

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

8
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
14.11.2010, 20:08 #2
Цитата Сообщение от Гамбит Посмотреть сообщение
Нужно написать программу для решения СЛАУ методом Гаусса
Методов Гаусса здесь вагон и маленькая тележка) Воспользуйтесь поиском, может найдете уже готовый код.
0
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
14.11.2010, 20:10  [ТС] #3
УРА товарищи!!!! Вот работающая программа:dance3:. приятно осознавать, что написал её сам. Извините за беспокойство
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 <stdio.h>
#include <stdlib.h>
#include <math.h>
#define n 4
void check(float mass[n][n],float sc[n])
{
int j,i,t=0;
for (i=0;i<n;i++)
    {
    for (j=0;j<n;j++)
    if (fabs(mass[i][j]>0.00001))
    t=1;
    if(t==0&&sc[i]==0){
    printf("бЁб⥬* Ё¬ҐҐв ЎҐбзЁб«Ґ**®Ґ ¬*®¦Ґбвў® аҐиҐ*Ё©");
    exit(0);}
    if(t==0&&sc[i]!=0){
    printf("бЁб⥬* *Ґб®ў¬Ґбв**");
    exit(0);}t=0;
    }
}
void check1(float mass[n][n],float sc[n],int i)
{
int j,k;
int b;
for (j=i+1;j<n;j++)
if (mass[j][i]!=0)
    {
    for (k=i;k<n;k++)
        {
        b=mass[i][k];
        mass[i][k]=mass[j][k];
        mass[j][k]=b;
        }
    b=sc[i];
    sc[i]=sc[j];
    sc[j]=b;
    return;
    }
}
void main()
{
float mass[n][n],sc[n],x[n];
float h=0;
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
    {
    printf("‚ўҐ¤ЁвҐ н«Ґ¬Ґ*в A[%d,%d] :",i,j);
    scanf("%f",&mass[i][j]);
    }
for(i=0;i<n;i++)
    {
    printf("‚ўҐ¤ЁвҐ %d-н«Ґ¬Ґ*в бв®«Ўж* бў®Ў®¤*ле з«Ґ*®ў:",i);
    scanf("%f",&sc[i]);
    }
for(i=0;i<n;i++)
    {
    if(mass[i][i]==0)
    check1(mass,sc,i);
    for(j=i+1;j<n;j++)
        {
        h=mass[j][i]/mass[i][i];
        sc[j]=sc[j]-h*sc[i];
        for (k=i;k<n;k++)
        mass[j][k]=mass[j][k]-h*mass[i][k];
 
        }    check(mass,sc);
    }
printf("\n");
for(i=0;i<n;i++)
{
printf("|");
for(j=0;j<n;j++)
{
printf("%f ",mass[i][j]);
}
printf("|");
printf("%f",sc[i]);
printf("\n");
}
 
x[n-1]=sc[n-1]/mass[n-1][n-1];
for(i=n-2;i>=0;i--)
    {
    for(j=n-1;j>i;j--)
    sc[i]=sc[i]-mass[i][j]*x[j];
    x[i]=sc[i]/mass[i][i];
    }
for(i=0;i<n;i++)
printf("%f\n",x[i]);
}
Добавлено через 1 минуту
Методов Гаусса здесь вагон и маленькая тележка) Воспользуйтесь поиском, может найдете уже готовый код.
вагонов нам не надо, своё нужнее. Все таки прогером мне быть. Нельзяж всю жизнь с форумов таскать проги=)
1
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
14.11.2010, 20:15 #4
Цитата Сообщение от Гамбит Посмотреть сообщение
вагонов нам не надо, своё нужнее. Все таки прогером мне быть. Нельзяж всю жизнь с форумов таскать проги=)
Правильно, просто большинство сюда обращаются за готовыми программами, вот я и посоветовал сначала поискать
0
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
14.11.2010, 21:34  [ТС] #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
Правильно, просто большинство сюда обращаются за готовыми программами, вот я и посоветовал сначала поискать
я раньше тоже пытался за готовыми программами обращался=) но на 2 курсе появилось что-то типо проф. гордости=))) а выложил прогу. потому что она почти правильная, оставалось только несколько штрихов. и она меня порядком достала.
0
geek
24 / 24 / 3
Регистрация: 21.10.2009
Сообщений: 512
12.03.2011, 13:22 #6
Можешь объяснить мне этот код?
0
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
13.03.2011, 22:12  [ТС] #7
Цитата Сообщение от geek Посмотреть сообщение
Можешь объяснить мне этот код?
не уверен=) но можно попробывать. что не понятно?
0
manbI4
0 / 0 / 0
Регистрация: 29.11.2010
Сообщений: 14
07.04.2011, 17:21 #8
Как я понял Она Счетает погрешность, меняет местами элементы и умножает на вектор!?
0
Dimka4351
1 / 1 / 0
Регистрация: 08.10.2013
Сообщений: 22
14.01.2014, 21:44 #9
Гамбит, Здравствуйте! Не могли бы Вы пояснить, что делает функция check?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2014, 21:44
Привет! Вот еще темы с ответами:

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

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

Решение систем линейных уравнений методом Гаусса - C++
Такая вот проблема вышла, не работает один случай и никак не могу найти - в чем ошибка. Возьмем к примеру такое уравнение: 0 0 0 1 2 ...

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


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
14.01.2014, 21:44
Ответ Создать тему
Опции темы

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