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

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

Войти
Регистрация
Восстановить пароль
 
Virus0PS
0 / 0 / 0
Регистрация: 06.11.2013
Сообщений: 9
#1

КУЭР-разложение методом вращений - C++

07.11.2013, 18:26. Просмотров 643. Ответов 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
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
#include <stdio.h>
#include <math.h>
#include <time.h>
#define _N 10  // число уравнений
#define _M 10  // число неизвестных
 
   float **a;
   float *b;
   float *x;
   int n,m;
// QR-алгоритм
void qr () {
  int l,k;
  float c[_N][_M];
  float s[_N][_M];
  float akk,akl,alk,all,bk,bl;
 
  // Прямой ход
  for (k=0; k<n-1; k++) {
   for (l=k+1; l<n; l++) {
    c[k][l] = a[k][k] / (sqrt( a[k][k]*a[k][k] + a[l][k]*a[l][k] ));
    s[k][l] = a[l][k] / (sqrt( a[k][k]*a[k][k] + a[l][k]*a[l][k] ));
 
       // Умножение матрицы a[][] на T[k][l]
       akk=a[k][k];  alk=a[l][k];  akl=a[k][l];  all=a[l][l];
       a[k][k] =  akk*c[k][l] + alk*s[k][l];
       a[k][l] =  akl*c[k][l] + all*s[k][l];
       a[l][k] = -akk*s[k][l] + alk*c[k][l];
       a[l][l] = -akl*s[k][l] + all*c[k][l];
 
       // Вектор свободных членов умножается на T[k][l]
       bk = b[k]; bl = b[l];
       b[k] =  bk*c[k][l] + bl*s[k][l];
       b[l] = -bk*s[k][l] + bl*c[k][l];
   }
  }
  // Теперь матрица a[][] -- верхняя диагональная.
 
  // Обратный ход
  float h;
  x[n-1]=b[n-1]/a[n-1][n-1];
  for (l=(n-1);l>=1;l--) {
      h=b[l-1];
      for (k=(l+1);k<=n;k++) h=h-x[k-1]*a[l-1][k-1];
      x[l-1]=h/a[l-1][l-1];
  }
 
}
// ------------------------------------------------------
// ------------------------------------------------------
float matrix(int N,int M) {
 n = N; m = M;
 a = new float* [n];
 for (int i=0; i<n; i++) {
      a[i] = new float [m];
      for (int j=0; j<m; j++) a[i][j]=0;
      b = new float [n];
 x = new float [n];
{ b[i]=0; x[i]=0; }}
 
}
 
// ------------------------------------------------------
// Вывод СЛАУ на экран
// ------------------------------------------------------
void print_slau() {
 for (int i=0; i<n; i++) {
    for (int j=0; j<m; j++) printf("%.2f  ",a[i][j]);
    printf("| %.3f  ",b[i]);
    printf("\n");
 }
}
 
// ------------------------------------------------------
// Печать решения и невязки решения
// ------------------------------------------------------
void print_x() {
 float max=0,h;
 for (int i=0; i<n; i++) {
      h=0;
      for (int j=0; j<n; j++) h=h+x[j]*a[i][j];
      if (max<fabs(b[i]-h)) max=fabs(b[i]-h);
      printf("x[%i]=%.3f  ",i,x[i]);
      if (i==5) printf("\n");
 }
 printf("\nMax. Nevyaka: %f\n",max);
}
// ------------------------------------------------------
// Установить значение матрицы a[][]
// ------------------------------------------------------
void seta(int i, int j, float value) {
  a[i][j] = value;
}
// ------------------------------------------------------
// Установить значение вектора b[]
// ------------------------------------------------------
void setb(int i, float value) {
  b[i] = value;
}
 
// ------------------------------------------------------
 
int main() {
double t;
 
 matrix (_N,_M);
 for (int i=0; i<_N; i++)
 {for (int j=0; j<_M; j++)
seta(i,j,i+j);
 setb(i,1);}
 printf("Solusion (QR-razlojeniy)\n");
 printf("=Ishodnaya sistema========================================\n");
print_slau();
 printf("\n=Solusion=========================================\n");
t=clock();
qr();
t=clock()-t;
printf("Vremayraboti funk %lqr sekundi\n",t/CLOCKS_PER_SEC);
print_x();
 
}
А нам сказали через одномерный сделать, помогите перевести на одномерный массив

Добавлено через 2 часа 32 минуты
Надо перевести в одномерный массив
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2013, 18:26     КУЭР-разложение методом вращений
Посмотрите здесь:

Решение СЛАУ методом вращений (Якоби) - C++
помогите, может у когото имеется приложение (на языке Pascal или C++), Решение СЛАУ методом вращений (Якоби). дали задание, уже...

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

метод вращений - C++
нужно найти собственные значения и векторы: вот прога тока она кажется путает индесы элемента a_{ij} из-за этого не правильно считает,...

Метод вращений Якоби с++ - C++
Используя метод Якоби найти с точностью 0.0001 все собственные значения и векторы матрицы А: {1.953, 1.535, -3.220 , 0.826, 1.592 ,...

Метод вращений с построением КЮЭР-разложения - C++
Я написал только Метод вращения #include&lt;math.h&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;time.h&gt; void f(double *mass,...

Поиск наибольшей общей подпоследовательности методом методом полного перебора - C++
Здравствуйте! Помогите пожалуйста с этим адом :wall: Нужно решить задачу о поиске наибольшей общей подпоследовательности методом...

Отсортировать массив методом минимального элемента и методом пузырька - C++
Друзья помогите! Очень мало времени на поиски подобного на сайте... А (100) -Случайные числа. Отсортировать массив методом минимального...

Найти площадь фигуры методом трапеций и методом Симпсона - C++
Доброе время суток Я студент поэтому прошу не нападать мне нужно написать код для тапазойдного и симпсон методов зама задача такая...

Методом деления отрезка пополам и методом итераций найти прибли-женное значение корня уравнения - C++
Методом деления отрезка пополам и методом итераций найти прибли-женное значение корня уравнения x3 + 12x – 2 = 0 на интервале . Абсолютная...

LU Разложение - C++
Есть код. #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; void LU(vector &lt;vector &lt;double&gt;&gt; A, vector &lt;vector...

LU-разложение - C++
Решить матрицу методом LU. матрицы задаются рандомно и выводятся на экран, если можно с коментами #include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; ...

Разложение числа - C++
вот написал прогу которая которая должна разложить число N на множители по массиву M и К где М {1,5,10,50,100} а К мы должны сами найти....


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Beerka
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 7
01.03.2014, 11:32     КУЭР-разложение методом вращений #2
Двумерный массив можно представить, как матрицу, а одномерный - как строку.
Следовательно, двумерный массив надо представить, как строку.
1 2 3
4 5 6 = 1 2 3 4 5 6 7 8 9
7 8 9

т.е. за первой строкой сразу следует вторая строка.

Надеюсь, моё кривое объяснение помогло.
Catstail
Модератор
22434 / 10839 / 1765
Регистрация: 12.02.2012
Сообщений: 17,951
01.03.2014, 12:23     КУЭР-разложение методом вращений #3
1) создаешь одномерный массив размером n*n
2) пишешь крохотную функцию:

C++
1
2
3
4
int index(int i, int j, int n)
  {
    return i*n+j;
  }
3) везде выражения A[i][j] заменяешь на A[index(i,j,n)]
Yandex
Объявления
01.03.2014, 12:23     КУЭР-разложение методом вращений
Ответ Создать тему
Опции темы

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