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

Реализовать решение СЛАУ методом Гаусса

25.09.2016, 22:00. Показов 3866. Ответов 14
Метки нет (Все метки)

Не могу разобраться в чём проблема. Пытаюсь реализовать метод гаусса, вроде бы всё правильно, но приводит матрицу к не правильному верхнетреугольному виду. Вот код прямого хода.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void straight_way(double **mas, int n) 
    double first, u;
    for (int k = 0; k < n; k++)   
    {
        first = mas[k][k];
        for (int j = k; j < n + 1; j++) 
        {
            u = mas[k][j] /= first;             
            for (int i = k + 1; i < n; i++) 
            {
                mas[i][j] -= u * mas[i][k];  
            }
        }
 
    
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2016, 22:00
Ответы с готовыми решениями:

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

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

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

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

14
Объявлятель переменных
1201 / 389 / 316
Регистрация: 24.09.2011
Сообщений: 1,229
25.09.2016, 23:15 2
Если первым идёт индекс строки, а потом столбца, то вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void straight_way(double **mas, int n){ 
    double first, u;
    for (int k = 0; k < n; k++)   
    {
        first = mas[k][k];
        for (int j = k+1; j < n; j++) 
        {
            u = mas[j][k] / first;             
            for (int i = k; i < n; i++) 
            {
                mas[j][i] -= u * mas[k][i];  
            }
        }
    }
}
0
Фрилансер
3701 / 2073 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
25.09.2016, 23:23 3
Неплохо бы еще проверить, что mas[k][k] не окажется нулём, иначе может понадобиться перестановка уравнений (строк матрицы)
1
Объявлятель переменных
1201 / 389 / 316
Регистрация: 24.09.2011
Сообщений: 1,229
25.09.2016, 23:29 4
Цитата Сообщение от Black Fregat Посмотреть сообщение
что mas[k][k] не окажется нулём
А вот это да. Ещё хуже, если матрица окажется вырожденной.
0
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,117
25.09.2016, 23:47 5
А еще стоит учитывать вычислительную ошибку и не использовать данный метод.

P.S В C++ лучше использовать не C-массивы а STL-контейнеры.
0
11 / 11 / 2
Регистрация: 15.07.2016
Сообщений: 132
26.09.2016, 02:01 6
Можно не вычислять все строки, а только интересующие нас элементы. Это сокращает количество итераций и операций в разы. Другими словами не нужно приводить весь массив к нужному виду, а только элементы
0 0
1 1
2 2
и т.д.
в итоге должно получится: ( для 3 неизвестных)
1 @ @=10
@ 1 @ =15
@ @ 1 =20
@ - это числа на которые мы не обращаем внимания в ходе вычислений.
За одно и отпадает надобность в обратном ходе.
0
Фрилансер
3701 / 2073 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
26.09.2016, 02:34 7
Pavel Rem, поясните, пожалуйста, свою мысль, что-то она для меня слишком глубока..
0
11 / 11 / 2
Регистрация: 15.07.2016
Сообщений: 132
26.09.2016, 03:36 8
Совсем не давно делал эту же задачу, к сожалению не могу найти код о котором я говорю, а по новой писать лень.
Суть в том, что бы преобразовывать только элементы с индексами 00, 11, 22, и столбец свободных членов, а не все строки полностью, используя правила преобразований систем уравнений.
Например для уравнения:
5x+2y+7z=9;
3x+4y+2z=6;
6x+2y+8z=7;
Массив:
5 2 7 9
3 4 2 6
6 2 8 7
Меняя только нужные нам элементы привести массив в такой вид:
1 2 7 -7.2
3 1 2 4.3
6 2 1 5.2
Без обратного хода сразу получаем значения искомых переменных:
x1 = -7.2
x2 = 4.3
x3 = 5.2
P.S я описал на С++ алгоритм показанный на сайте http://ru.onlinemschool.com/ma... tion/gaus/
и немного его доработал. Если найду код, обязательно выложу.
0
_Ivana
26.09.2016, 03:43
  #9

Не по теме:

Тоже сильно. Я подозревал, что если человек в соседней теме не может выйти из цикла, а в этой делает по одной ошибке в среднем на 10 слов, то скорее всего он не откроет Америку и в данном вопросе, но, похоже, он ее таки открыл :)

0
Объявлятель переменных
1201 / 389 / 316
Регистрация: 24.09.2011
Сообщений: 1,229
26.09.2016, 07:45 10
Цитата Сообщение от Pavel Rem Посмотреть сообщение
Без обратного хода сразу получаем значения искомых переменных:
x1 = -7.2
x2 = 4.3
x3 = 5.2
Ну, x1, x2 и x3 может и имеют такие значения. Вот только в системе уравнений использовались x, y и z, которые Вы забыли вычислить. Я взял на себя смелость сделать это за Вас. Проверяйте: x = 8/9, y = 16/27, z = 13/27.
0
11 / 11 / 2
Регистрация: 15.07.2016
Сообщений: 132
26.09.2016, 08:15 11
Цитата Сообщение от Pavel Rem Посмотреть сообщение
x1 = -7.2
x2 = 4.3
x3 = 5.2
Это всего лишь опечатка, вместо x1, x2, x3 там x, y, z. Сути это не меняет. И результат там именно:
x= -7.2
y= 4.3
z=5.2
Можете проверить на этом калькуляторе http://ru.onlinemschool.com/ma... tion/gaus/
0
Объявлятель переменных
1201 / 389 / 316
Регистрация: 24.09.2011
Сообщений: 1,229
26.09.2016, 08:33 12
Цитата Сообщение от Pavel Rem Посмотреть сообщение
Можете проверить на этом калькуляторе
Воспользовался Вашим советом. Результат, вместе с расчётом MathCAD'а, ниже:
Миниатюры
Реализовать решение СЛАУ методом Гаусса  
0
137 / 107 / 23
Регистрация: 06.10.2008
Сообщений: 451
26.09.2016, 10:17 13
Цитата Сообщение от Pavel Rem Посмотреть сообщение
Меняя только нужные нам элементы привести массив в такой вид:
1 2 7 -7.2
3 1 2 4.3
6 2 1 5.2
Откуда эти массивы?
1*(-7,2) + 2*4,3+7*5,2 = -7,2+8,6+36,4 = -7,2 ?? Не правда
3*(-7,2) + 1 * 4,3 + 2 * 5,2 = -21,6 + 4,3 + 10,4 = 6 ?? Тоже не правда
В третьей строчке тоже не правильно
А в статье которую Вы указали приведено правильное, но не очевидное ля С++, решение:
1 0 0 -7.2
0 1 0 4.3
0 0 1 5.2
Цитата Сообщение от SpBerkut Посмотреть сообщение
Воспользовался Вашим советом
А(3,3) = 8 а у Вас 1
0
Объявлятель переменных
1201 / 389 / 316
Регистрация: 24.09.2011
Сообщений: 1,229
26.09.2016, 10:20 14
Цитата Сообщение от mevn Посмотреть сообщение
А(3,3) = 8 а у Вас 1
Щьёрт!.. Виноват. Недоглядел. Pavel Rem, прошу прощения за язвительность.
0
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 20
26.09.2016, 11:51  [ТС] 15
Чуваки, вот рабочий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void straight_way(double **mas, int n) //приводим к верхнетреугольному виду
{
    double first, u, first_next;
    for (int k = 0; k < n; k++)   // шаги
    {
        first = mas[k][k];
        for (int j = k; j < n + 1; j++)
        {
            mas[k][j] /= first; //делим строку на 1ый элемент 
        }
        for (int i = k + 1; i < n; i++)
        {
            first_next = mas[i][k];
            cout << first_next << endl;
            for (int j = k; j < n + 1; j++)
            {
                mas[i][j] -= mas[k][j] * first_next;
            }
        }
        outputter(mas, n);
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2016, 11:51
Помогаю со студенческими работами здесь

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

Реализовать программу, решающую СЛАУ методом Гаусса
Реализовать программу, решающую СЛАУ методом Гаусса. Требования: 1. Программа должна выдавать...

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

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


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

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

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