Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/44: Рейтинг темы: голосов - 44, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 5
1

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

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

Author24 — интернет-сервис помощи студентам
Салют обитателям форума! Вот значит какое дело, у меня такое задание : "Решение уравнений методом Гаусса. Коэффициенты обрабатываются в двух матрицах: матрице модуля и матрице угла комплексного числа в символической форме."
Пытаюсь делать сам, для начала я разбил исходную матрицу на 2 двумерных массива(модуля и угла); перевел углы в радианы. Тут дело встало, нужно найти максимальный элемент, он как бы один на оба массива, должна быть какая-то формула, а где её взять не представляю. Кто шарит подскажите что за формула, заранее благодарю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2010, 10:02
Ответы с готовыми решениями:

СЛАУ методом Гаусса
Здравствуйте! Алгоритм понимаю. Нужно привести к треугольному виду, затем осуществить обратный ход....

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

СЛАУ методом Гаусса
Здравствуйте, подскажите пожалуйста, решаю СЛАУ методом Гаусса, но решение зависит от параметра...

СЛАУ методом Гаусса
Написал комменты к имеющейся проге, и хочу понять, верно ли я понял её. В общем и целом ход...

13
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
Быдлокодер
512 / 298 / 85
Регистрация: 22.11.2009
Сообщений: 892
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
Быдлокодер
512 / 298 / 85
Регистрация: 22.11.2009
Сообщений: 892
05.02.2010, 15:51 5
Да даже если из двух массивов, в чем проблема?
Находишь максимум в обоих и сравниваешь их
0
12 / 12 / 0
Регистрация: 04.02.2010
Сообщений: 45
05.02.2010, 15:55 6
Darky, Нах так?! У тебя времени полно?! Подключение доп. функции-это обращение к библиотеке, время работы самой функции и т.д. и т.п. Сортируешь ты с помощью qsort, чтоли?
Георгич, переведи комплексное число в символич вид и найди макс элемент из обеих матриц. Или я что-то недопонял? Объясни по нормальному
0
Быдлокодер
512 / 298 / 85
Регистрация: 22.11.2009
Сообщений: 892
05.02.2010, 16:00 7
JKeeJ1e30, Во-первых, Ваше решение нерационально.
Переменная m вообще нигде не используется, кроме как в нее записывается значение и ничего больше.
Во-вторых,
C++
1
cin >>a[1][1];
Это зачем?

А max_element это проверенный способ, и подключаемая библиотека помогает реализовать множество подобных алгоритмов, не только max_element
0
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
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
12 / 12 / 0
Регистрация: 04.02.2010
Сообщений: 45
05.02.2010, 17:42 12
Скажи своему преподу чтобы за учебники садился. Комплексные числа НЕ СРАВНИВАЮТСЯ. В ПРИНЦИПЕ
0
2 / 2 / 4
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2010, 18:57
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru