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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.94
Георгич
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 5
#1

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

05.02.2010, 10:02. Просмотров 6655. Ответов 13
Метки нет (Все метки)

Салют обитателям форума! Вот значит какое дело, у меня такое задание : "Решение уравнений методом Гаусса. Коэффициенты обрабатываются в двух матрицах: матрице модуля и матрице угла комплексного числа в символической форме."
Пытаюсь делать сам, для начала я разбил исходную матрицу на 2 двумерных массива(модуля и угла); перевел углы в радианы. Тут дело встало, нужно найти максимальный элемент, он как бы один на оба массива, должна быть какая-то формула, а где её взять не представляю. Кто шарит подскажите что за формула, заранее благодарю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2010, 10:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решание СЛАУ методом Гаусса в С++ (C++):

СЛАУ методом Гаусса - C++
Всем доброго времени суток. По-сколько я новичек в программирование, то вот скачал код, для решения СЛАУ методом Гауса. Выдает...

Решение СЛАУ методом Гаусса - C++
помогите разобраться!!ВЫдает 85 ошибок!!!! #include <stdio.h> #include <conio.h> #include <tchar.h> #include <iostream> #include...

Решение СЛАУ методом Гаусса - C++
У меня программа для решения слау методом Гаусса с выбором главного элемента по столбцам. Что-то мне не нравятся ответы, гляньте может в...

СЛАУ методом Жордана-Гаусса - C++
Нужна программа для решения СЛАУ методом Жордана-Гаусса с выбором главного элемента.

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

Решения СЛАУ методом Гаусса по шагу - C++
Добрый день! Очередной раз прошу советов! Имеется СЛАУ, которое требуется решить методом Гаусса на с++. Соответственно, на...

13
JKeeJ1e30
12 / 12 / 0
Регистрация: 04.02.2010
Сообщений: 45
05.02.2010, 10:17 #2
Тебе просто максимальный элемент от двумерного массива? Смотри:

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
int max,n,m,i,j;
int a[1000][1000]
 
using namespace std;
 
int main()
{
    cin >>n >>m;
    cin >>a[1][1];
    max=a[1][1];
    for(i=0; i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            cin >>a[i][j];
            if (a[i][j]>max)
            {
                max=a[i][j];
            }
        }
    }
    cout <<max;
    return 0;
}
0
Darky
Быдлокодер
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
05.02.2010, 12:45 #3
JKeeJ1e30, Ужас..
C++
1
int main =* std::max_element (A,A+N);
0
Георгич
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 5
05.02.2010, 15:48  [ТС] #4
Да просто найти макс элемент двумерного массива и я могу) Но только для моего задания(см.выше) этот элемент должен находится по какой-то формуле сразу из обоих массивов(массива модуля и массива угла комплексного числа в символической форме)
0
Darky
Быдлокодер
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
05.02.2010, 15:51 #5
Да даже если из двух массивов, в чем проблема?
Находишь максимум в обоих и сравниваешь их
0
JKeeJ1e30
12 / 12 / 0
Регистрация: 04.02.2010
Сообщений: 45
05.02.2010, 15:55 #6
Darky, Нах так?! У тебя времени полно?! Подключение доп. функции-это обращение к библиотеке, время работы самой функции и т.д. и т.п. Сортируешь ты с помощью qsort, чтоли?
Георгич, переведи комплексное число в символич вид и найди макс элемент из обеих матриц. Или я что-то недопонял? Объясни по нормальному
0
Darky
Быдлокодер
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
05.02.2010, 16:00 #7
JKeeJ1e30, Во-первых, Ваше решение нерационально.
Переменная m вообще нигде не используется, кроме как в нее записывается значение и ничего больше.
Во-вторых,
C++
1
cin >>a[1][1];
Это зачем?

А max_element это проверенный способ, и подключаемая библиотека помогает реализовать множество подобных алгоритмов, не только max_element
0
JKeeJ1e30
12 / 12 / 0
Регистрация: 04.02.2010
Сообщений: 45
05.02.2010, 16:08 #8
Цитата Сообщение от Darky Посмотреть сообщение
JKeeJ1e30, Во-первых, Ваше решение нерационально.
Переменная m вообще нигде не используется, кроме как в нее записывается значение и ничего больше.
Во-вторых,
C++
1
cin >>a[1][1];
Это зачем?

А max_element это проверенный способ, и подключаемая библиотека помогает реализовать множество подобных алгоритмов, не только max_element
насчет m правильно заметил-ее нужно во 2 цикле поставить вместо n
cin >>a[1][1](вернее, cin >>a[0][0]. Я никогда проги не писал с первого раза правильно) нужен, чтобы задать начальное значение max(по дефолту ведь он равен нулю, а вдруг у нас матрица вся из сплошь отрицательных элементов? Программа будет работать некорректно. Можно конечно было задать минимальное значение инта, но я его не помню. Можно было двигать единицу по разрядям но это тупо.

Добавлено через 1 минуту
А про библиотеку я и говорю-подключение ее это дополнительное системное время. Ты ведь, надеюсь, не сортируешь элементы с помощью тупой и медленной qsort?
0
Георгич
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 5
05.02.2010, 17:13  [ТС] #9
Да поймите, что собой представляют эти массивы). Соответствующие числа обоих массивов на самом деле одно и тоже КОМПЛЕКСНОЕ число. Есть фаил, для ввода данных, в этом файле записана СЛАУ, она же матрица. Выглядит матрица примерно так: возьмем матрицу комплексных чисел второго порядка
1 2 1 2 1 2
1 2 1 2 1 2
где 1-действительные части комплексного числа(модуля), их мы путем нехитрого перебора помещаем в созданный нами двумерный массив.
2-мнимая часть,записанная в градусах(угол комплексного числа), заполняем ими второй двумерный массив, и переводим в радианы.
Так вот видно что нужно искать не наибольшее в каждом массиве, а потом сравнивать их, а максимум нужно найти один, максимум начальной матрицы, который будет представлен соответствующими элементами обоих массивов. Вроде так должно быть понятнее=) И спасибо тем кто помогает=)
0
JKeeJ1e30
12 / 12 / 0
Регистрация: 04.02.2010
Сообщений: 45
05.02.2010, 17:26 #10
Парень, мне 3 года долбали-сначала на физике в школе еще, потом на матане и алгеме-что комплексные числа сравнивать НЕЛЬЗЯ. По каким принципам ты их собираешься сравнивать? Удаленность от точки (0,0)?
0
Георгич
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 5
05.02.2010, 17:39  [ТС] #11
Ну так их и нужно сравнить по отдельности=) Наверно, ы) Я скоро ап стену обьюсь с этой задачей)))
Чтобы решать Гауссом нужно найти максимальный элемент, а как это сделать хз( Рас препод задал, значит решается как-то=)
0
JKeeJ1e30
12 / 12 / 0
Регистрация: 04.02.2010
Сообщений: 45
05.02.2010, 17:42 #12
Скажи своему преподу чтобы за учебники садился. Комплексные числа НЕ СРАВНИВАЮТСЯ. В ПРИНЦИПЕ
0
jung
2 / 2 / 1
Регистрация: 25.11.2009
Сообщений: 40
05.02.2010, 18:50 #13
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <conio.h>
 
#include <stdio.h>
 
#include <iostream.h>
 
#include <math.h>
 
const int N = 40
 
//Решение системы линейных уравнений
 
int main() {
 
int n;
 
bool ocenka=true, bl;
 
const eps=1.0e-30; //Точность решения
 
int nmk,j,ip,np1mj,np1,ipivot,ic,i,k,ir;
 
double pivot,b; //pivot - опорное значение
 
/*Расширенная матрица неизвестных и свободных членов */
 
double a[N+1][N+2]; 
 
printf("Решение системы линейных уравнений \n");
 
printf("Введите размерность системы уравнений: \n");
 
cin>>n;
 
for (i=1;i<=n;i++) {
 
printf("\nВводите через пробел элементы");
 
printf(" и свободный член уравнения %d\n",i);
 
for (j=1;j<=n+1;j++)
 
cin>>a[i][j];
 
}
 
 
np1=n+1; // Имя столбца свободных членов
 
ic=1;
 
ir=1;
 
do {
 
pivot=a[ir][ic]; // Выбор опорного значения
 
ipivot=ir; // Опорная строка
 
for (i=ir;i<=n;i++)
 
if (fabs(a[i][ic])>fabs(pivot)) //Опорное значение = макс. в столбце
 
{
 
pivot=a[i][ic];
 
ipivot=i; //Опорная строка
 
}
 
if (fabs(pivot)<=eps ) //Если все коэффициенты столбца ≈ 0
 
{
 
printf("Определитель равен нулю. Решения нет");
 
ocenka=false;
 
getch();
 
return !ocenka; // Останов программы
 
}
 
if (ipivot!=ir) // Перемещение опорной строки
 
for (k=ic;k<=np1;k++)
 
{
 
b=a[ipivot][k];
 
a[ipivot][k]=a[ir][k];
 
a[ir][k]=b;
 
}
 
 
for (k=ic;k<=np1;k++) // Приведение строки к общему знаменателю
 
a[ir][k]=a[ir][k]/pivot;
 
bl=(ir!=n);
 
if (bl)
 
{
 
for (ip=ir+1;ip<=n;ip++)
 
{
 
b=a[ip][ic];
 
if (fabs(b)>eps)
 
for (k=ic;k<=np1;k++)
 
a[ip][k]=a[ip][k]-a[ir][k]*b; // Сокращение элемента
 
}
 
ir++; //Переход к сокращению элемента
 
ic++; //в следующей строке
 
}
 
} while (bl);
 
for (k=1;k<=n-1;k++) // Цикл вычисления неизвестных
 
{ //(ими замещаются свободные члены)
 
nmk=n-k;
 
for (j=1;j<=k;j++)
 
{
 
np1mj=np1-j;
 
a[nmk][np1]=a[nmk][np1]-a[nmk][np1mj]*a[np1mj][np1];
 
}
 
}
 
printf("Решение:\n") // Печать результата;
 
for (i=1;i<=n;i++) {
 
printf("x(%2i)=%10.5lf\n",i,a[i][n+1]);
 
};
 
printf("press eny key for quit");
 
getch();
 
return !ocenka;
 
}
0
Георгич
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 5
06.02.2010, 18:57  [ТС] #14
я понял что нужно сделать=)
для начала из символьной формы превращаем в алгебраическую вот по таким формулам:
Re[i][j]=((Mo[i][j])/(sqrt(tan(Yg[i][j])*tan(Yg[i][j])+1)));
Im[i][j]=((Mo[i][j]*tan(Yg[i][j]))/(sqrt(tan(Yg[i][j])*tan(Yg[i][j])+1)));
где Re и Im - действительная и мнимая части в алгебраической форме, а Mo и Yg - действительная и мнимая части в символьной форме (они же модуль и угол).
А потом для нахождения максимума запускаем цикл и юзаем сею функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
double Max(double Re[N][N+1],double Im[N][N+1],int n,int k,int &p,int &m)
    {
       double max;
       max = 0;
 
               if (max < sqrt(Re[i][j]*Re[i][j]+Im[i][j]*Im[i][j]))
                   {
                     max=sqrt(a[i][j]*a[i][j]+ia[i][j]*ia[i][j]);
                 p=i;
                 m=j;
               }
     return max;
    }
Добавлено через 4 минуты
темку не закрывайте плиз, а то задача еще не решена. Возникнут по ней еще вопросы, чтобы новую тему не создавать сюда напишу.
0
06.02.2010, 18:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2010, 18:57
Привет! Вот еще темы с ответами:

Ошибка в решении СЛАУ методом Гаусса - C++
Ребят, помогите пожайлуйста найти ошибку у меня в программе метод Гаусса Вроде прямой ход правильный, может ошибка в обратном? Буду...

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

Решение СЛАУ методом Гаусса, индексы - C++
Собственно программа решает слау методом гаусса. Как найти индексы главного элемента на второй итерации? #include &lt;iostream.h&gt; ...

Решить СЛАУ методом Гаусса (проверить) - C++
Есть код!компилируется без ошибок.Задача программы решить СЛАУ методом Гаусса Но я не понимаю почему вывод информации осуществляется...


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

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

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