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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.74
StalkerSmerch
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
#1

Вычисление определителя Методом Гаусса - C++

11.06.2012, 16:49. Просмотров 2964. Ответов 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
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <stdlib.h>
 
int main()
{
  setlocale(LC_ALL, "Russian");
  float a[50][51], t;
  int j, i, k, ra, n,pro=1;
  puts("Введите размерность матрицы:\n");
  scanf("%i",&n);
   for (i = 0; i < n; i++)
  {
    for (j = 0; j < n; j++){
     ra=rand()%10+1;
    a[i][j]=ra;
    }}
 
  printf("Матрица: \n \n");
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < n; j++)
    printf("%6.2f\t", a[i][j]);
    printf("\n");
    }
 
  for (i = 0; i < n; i++){
    if (a[i][j] == 0)
    {
      k = i;
      while ((a[k][i] == 0) && (k < n))
    k++;}
      if (a[k][i] != 0)
    for (j = 0; j < n; j++)
    {
      t = a[i][j];
      a[i][j] = a[k][j];
      a[k][j] = t;
    }
    }
  for (k = 0; k < n - 1; k++)
    for (i = k + 1; i < n; i++)
    {
      if (a[k][k] !=0)
      {
    t = a[i][k] / a[k][k];
    for (j = 0; j < n + 1; j++)
      a[i][j] = (-1)*(a[k][j] * t) + a[i][j];
      }}
 
  printf("\nМатрица сводится к треугольной форме:\n\n");
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < n ; j++)
      printf("%6.2f\t", a[i][j]);
    printf("\n");
  }
  for(i=0;i<n;i++){
  pro=a[i][i]*pro;
  }
  puts("\n Определитель = ");
  printf("%i",pro);
getch();
return 0;
}
Результат выводит нормальный, но если вбить самому матрицу
a[0][0]=1;
a[0][1]=2;
a[0][2]=3;
a[0][3]=4;
a[1][0]=1;
a[1][1]=2;
a[1][2]=3;
a[1][3]=3;
(все остальные элементы по старому рандому)
То решения нет, так как нету смены строк, помогите её сделать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2012, 16:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычисление определителя Методом Гаусса (C++):

Нахождение определителя матрицы методом гаусса - C++
Нахождение определителя методом гауса #include &lt;stdio.h&gt; #include&lt;locale.h&gt; #include&lt;math.h&gt; #include&lt;conio.h&gt; int main() { ...

Вычисление определенного интеграла методом Гаусса СИ - C++
хелп

Метод Гаусса для вычисления определителя - C++
Вычисляю обратную матрицу методом Гаусса. После приведения к верхнетреугольному виду считаю определитель, однако значение выдается...

Вычисление определителя - C++
Здравствуйте, дорогие форумчане! Помогите, пожалуйста, отладить программу вычисления определителя на Cи++ Текст программы: ...

Вычисление определителя матрицы N*N - C++
Дорогие форумчане, никто не подскажет как вычислить определитель квадратной матрицы, сам код не нужен, только алгоритм. Насколько я слышал...

Вычисление следа матрицы и определителя - C++
воббщем надо реализовать вычисление следа матрицы и определителя алгоритм для следа : #include &lt;stdio.h&gt; typedef int *pInt; ...

10
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 16:54 #2
Цитата Сообщение от StalkerSmerch Посмотреть сообщение
Как сделать обмен строк в этом методе?
А зачем он там?
0
StalkerSmerch
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
11.06.2012, 16:55  [ТС] #3
taras atavin, Для того что бы решить определитель.(то есть что бы на диагонали не было нулей.)
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 16:58 #4
А откуда они там возьмутся? И в методе Гаусса ни каких перестановок нет.
0
StalkerSmerch
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
11.06.2012, 17:13  [ТС] #5
taras atavin, я знаю, но преподаватель сказал что надо.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 17:34 #6
Тогда модификацию метода в студию. Словами.
0
StalkerSmerch
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
11.06.2012, 17:44  [ТС] #7
taras atavin, Как я понял главное что бы на диагонали не получить нули.а для этого нужно проверять следующий елемен на то что бы он при вычитании не был нулём, если он будет нулём то строчки меняем местами и опять проверяем.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 17:47 #8
Какие строки? Уменьшаемое с вычитаемым? Это гарантия той же пакости. Опиши подробно, а то я уже не помню. Делал реализацию с однократной перестановкой аж в 2001-м.
0
StalkerSmerch
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
11.06.2012, 17:53  [ТС] #9
taras atavin, Нет, мы меняем вычитаемой со следующей строкой, и так пока не конец массива или пока при вычитании строк слудующий элемент будет равен нулю.

Добавлено через 2 минуты
например у нас есть матрица
1 2 3 4
1 2 4 5
4 6 1 2

Так как при вычитании первой строки и второй элемент [1][1](по си) будет равен нулю, тогда меняем строки 2 и 3 местами.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 18:56 #10
Кажется начинаю вспоминать. Была у меня и многкратная. В тот же день.
Код
1 2 3 4
1 2 4 5
4 6 1 2
3 2 2 8

4 6 1 2
1 2 3 4
1 2 4 5
3 2 2 8

4  6   1    2
0  0,5 2,75 3,5
0  0,5 3,75 4,5
0 -2,5 1,25 6,5

4  6   1    2
0 -2,5 1,25 6,5
0  0,5 2,75 3,5
0  0,5 3,75 4,5

4  6   1    2
0 -2,5 1,25 6,5
0  0   3    4,8
0  0   4    5,8

4  6   1    2
0 -2,5 1,25 6,5
0  0   4    5,8
0  0   3    4,8

4  6   1    2
0 -2,5 1,25 6,5
0  0   4    5,8
0  0   0    0,45
. Свободный член не показан. На каждом шаге выполняется та перестановка, при которой на главную диагональ встаёт максимальный по модулю из коэффициентов не выше главной диагонали и только потом эта строка вычитается из остальных. С пяти диагональными матрицами до 130*130 эта модификация была наиболее стабильной из всех опробованных. Крамер провалился на всех порядках строго больше шести, так как переполнял стек. Простой Гаусс вылетал по нолям всегда. Однократная перестановка помогала раз в час. А многократная ни разу не вылетела.

Добавлено через 1 минуту
За недельку вспомню исходник, потом переведу.
0
StalkerSmerch
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
03.07.2012, 20:04  [ТС] #11
taras atavin, Я конечно не к месту это говорю, но пора бы уже скинуть)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2012, 20:04
Привет! Вот еще темы с ответами:

Функция класса(вычисление определителя произвольной матрицы) работает не правильно(постоянно определитель 0) - C++
void deterMatr(matr matrx) { if (matrx.rows == matrx.columns){ //приведение матрицы к треугольному виду int maxl, k; ...

Вычисление значения трех определенных интегралов методом трапеций или методом Симпсона - C++
Всем привет, нужна конкретная помощь по написанию проги по такому условию. Написать программу, вычисляющую значение трех определенных...

Вычисление интеграла по квадратурной формуле Гаусса - C++
Помогите, пожалуйста. Не нашел ничего схожего к требуемому заданию. Необходимо вычислить интеграл по квадратурной формуле Гаусса: ...

Задача методом Гаусса - C++
ребят помогите пожалуйста составить программу в С++ метод Гаусса )))


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
03.07.2012, 20:04
Ответ Создать тему
Опции темы

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