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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.63
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Крамер для коллекции - C++

19.03.2010, 08:26. Просмотров 5453. Ответов 2
Метки нет (Все метки)

Дано: матрица a коэффициентов системы уравнений в в виде линерализованного массива (a[0][0], a[1][0], a[2][0]... a[n-1][0], a[0][1], a[1][1], a[2][1]...a[n-1][1], a[0][2], a[1][2], a[2][2]...a[n-1][2]...a[0][n-1], a[1][n-1], a[2][n-1]...a[n-1][n-1]), вектор-столбец b свободных членов той же системы уравнений и число уравнений. Матрица квадратная, число элементов вектора равно числу строк матрицы. Система эквивалентна матричному уравнению a*x=b. n<=6. Требуется найти: вектор x решений системы уравнений. Если система не имеет однозначного решения, вернуть
пустой указатель на массив x.
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
void Minor (double *a, unsigned short int n, double *&m, unsigned short int r, unsigned short int c) // Минор. Дана матрица а (в том же виде, как и для Крамера), надо найти и в том же видже поместить в m её минор без строки № r и столбца № с
{
 unsigned short int i1, j1, i2, j2,n2;
 idf (m)
 {
  delete [] m;
 }
 if ((n>1)&(n<=6))
 {
  m=new double [n*n];
  if (m)
  {
   n2=n-1;
   for (i1=n2; i1>=0; --i1)
   {
    if (i1<r)
    {
     i2=i1;
    }
    if (i1>r)
    else
    {
     i2=i1-1;
    }
    if (i1==r)
    {
     break;
    }
    for (j1=n2; j1>=0; --j1)
    {
     if (j1<c)
     {
      j2=j1;
     }
     if (j1>c)
     {
      j2=j1-1;
     }
     if (j1==c)
     {
      break;
     }
     m[j2+i2*2]=a[j1+i1*n]; // m[i2][j2]=a[i1][j1]
    }
   }
  }
 }
}
double Det (double *a, unsigned short int n) // Определитель матрицы. Дана матрица а (в том же виде, как и для Крамера), порядок матрицы n<=6, надо вычислить её опеределитель.
{
 unsigned short int i,n2;
 double  s;
 double  r;
 double *b; 
 if (n==2) // 2x2
 {
  return a[0]*a[3]-a[2]*a[1]; // a[0][0]*a[1][1]-a[1][0]*a[0][1];
 }
 if (n==1)
 {
  return a[0]; // Число, а не матрица, но вренём для единобезобразия
 }
 n2=n-1;
 // Раскладываем матрицу по нулевой строке
 for (s=1.0, i=0, Minor(a,n,m,0,i), r=Det(m,n2); i<n; s*=-1.0m, ++i, Minor(a,n,m,0,i), r+=s*Det(m,n2));
 return r;
};
void Kramer(double *a, double *b, double *&x, unsigned short int n) // а - матрица коэффициентов, строки подряд, b - свободные члены, x - решение. Решенная здесь задача.
{
 unsigned short int  i1,i2,j;
 double             *d; // Определители d[0] главный, остальные d[i] соотвествуют x[i-1]
 double             *buff; // Буфер побочных матриц
 if (x)
 {
  delete [] x;
 }
 if (n==0) // Нет системы
 {
  retun; 
 }
 if (n==1) // Уравнение, а не система
 {
  x=new double [1];
  if (x)
  {
   x[0]=b[0]/a[0];
  }
  return;
 }
 if (n>6) // Не смогу решить
 {
  return;
 }
 d=new double [n+1];
 if (!d) // Ошибка памяти!
 {
  return;
 }
 d[0]=Det(a,n);
 if (d[0]==0.0) // Нет решения
 {
  delete [] d;
  return;
 }
 buff=new double [n*n];
 if (buff==NULL) // Ошибка памяти!
 {
  delete [] d;
  return;
 }
 x=new double [n];
 if (x===NULL) // Ошибка памяти!
 {
  delete [] buff;
  delte [] d;
  return;
 }
 for (i1=n; i1>0; --i1)
 {
  for (i2=n-1; i2>=0; --i2)
  {
   for (j=n-1; j>=0; --j)
   {
    if (i2==i1)
    {
     buff[j+i2*n]=b[j]; // buff[i2][j]=b[j];
    }
    else
    {
     buff[j+i2*n]=a[j+i*n]; // buff[i2][j]=a[i][j];
    }
   }
   d[i2]=Det(buff,n);
   x[i2-1]=d[i2]/d[0];
  }
 }
}
4
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2010, 08:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Крамер для коллекции (C++):

Крамер - C++
Люди, Помогите! Решение СЛУ методом Крамера, сам крамер тут -...

Гаусс для коллекции - C++
double abs(double x) { if (x&lt;0) { return -x; } return x; } void Gauss(double *a, double *b, double *&amp;x, unsigned...

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

Классы C++, коллекции и сортировка - C++
Есть небольшое задание. Не могу понять как это все организировать, особенно с коллекциями и сортировкой. &quot;ЗАДАЧА. Построить три...

Реализовать свои коллекции - C++
Всем доброго времени суток. Есть задание, но не могу приступить к его выполнению поскольку не могу даже понять его: &quot;1. Сделать задачу...

Линейные коллекции данных - C++
Объясните, что такое итераторы и как используются. и вот еще: Цели работы: Освоение технологии реализации позиционных, линейных...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
19.03.2010, 14:15 #2
taras atavin:
Я его не проверял.
Ты его точно хорошо проверил, а то мало ли.
0
DJ Mag
Сообщений: n/a
17.03.2011, 20:07 #3
не знаю у меня работает!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2011, 20:07
Привет! Вот еще темы с ответами:

Сортировка коллекции CMap - C++
Помогите, кто может !!! Сортировка в коллекции CMap for (int a=2; a&lt;=mm.GetCount();a++) { mm.GetNextAssoc(pos,string,th);...

Конструкция языка С++11 цикл по коллекции - C++
for (auto x : result) Что означает данная конструкция?

Быстрый поиск по полям в коллекции - C++
Есть коллекция объектов класса с разными полями. Нужно организовать быстрый поиск первого элемента (может потом множества элементов) по...

Создание коллекции объектов разных классов - C++
Здравствуйте. Помогите, пожалуйста, с задачкой создания коллекции объектов разных типов. Я сначала реализовал программку, использовав...


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

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

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