Advertisement
Guest User

Untitled

a guest
May 21st, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <math.h>
  5. #include <string>
  6. #include <map>
  7. #include <ctime>
  8. #include <iomanip>
  9.  
  10. using namespace std;
  11. using ll = long long;
  12.  
  13. double sum1 = 0;
  14.  
  15. void mult(vector<vector<double>> a, vector<vector<double>> b, vector<vector<double>> &result, int n)
  16. {
  17. for (int i = 0; i < n; i++)
  18. {
  19. for (int j = 0; j < n; j++)
  20. {
  21. result[i][j] = 0;
  22. for (int k = 0; k < n; k++)
  23. {
  24. result[i][j] += a[i][k] * b[k][j];
  25. }
  26. }
  27. }
  28. }
  29. void trans(vector<vector<double>> a, vector<vector<double>> &b, int n)
  30. {
  31. for (int i = 0; i < n; i++)
  32. {
  33. for (int j = 0; j < n; j++)
  34. {
  35. b[i][j] = a[j][i];
  36. }
  37. }
  38. }
  39. int symmetric(vector<vector<double>> A, int n)
  40. {
  41. for (int i = 0; i < n; i++) {
  42. for (int j = i + 1; j < n; j++)
  43. {
  44. if (A[i][j] != A[j][i])
  45. {
  46. return 0;
  47. }
  48. }
  49. }
  50. return 1;
  51. }
  52. double fail(vector<vector<double>> A, int n)
  53. {
  54. double fault = 0.0;
  55. for (int i = 0; i < n; i++)
  56. {
  57. for (int j = i + 1; j < n; j++)
  58. {
  59. fault += A[i][j] * A[i][j];
  60. }
  61. }
  62. fault = sqrt(2 * fault);
  63. return fault;
  64. }
  65. void print(vector<vector<double>> matr)
  66. {
  67. for (int i = 0; i < matr.size(); i++)
  68. {
  69. for (int j = 0; j < matr[i].size(); j++)
  70. {
  71. cout << setw(3) << matr[i][j];
  72. }
  73. cout << '\n';
  74. }
  75. }
  76. int rotate(vector<vector<double>> &A, int n, vector<vector<double>> &ans, double &precision)
  77. {
  78. int result = 1;
  79. int i, j, k;
  80. int I, J;
  81. vector <vector<double>> RM(n);
  82. vector <vector<double>> buff(n);
  83. vector <vector<double>> RMT(n);
  84. double max, a;
  85. for (i = 0; i < n; i++)
  86. {
  87. RMT[i].resize(n);
  88. RM[i].resize(n);
  89. buff[i].resize(n);
  90. RMT[i][i] = RM[i][i] = 1;
  91. }
  92. double fault = fail(A, n);
  93. while (fault > precision)
  94. {
  95. for (int i = 0; i < n; i++)
  96. {
  97. for (int j = 0; j < n; j++)
  98. {
  99. RMT[i][j] = RM[i][j] = 0;
  100. }
  101. RMT[i][i] = RM[i][i] = 1;
  102. }
  103. max = 0.0;
  104. for (i = 0; i < n; i++)
  105. {
  106. for (j = i + 1; j < n; j++)
  107. {
  108. if (abs(A[i][j]) > max)
  109. {
  110. max = abs(A[i][j]);
  111. I = i;
  112. J = j;
  113. }
  114. }
  115. }
  116. if (A[I][I] == A[J][J])
  117. {
  118. RM[I][I] = RM[J][J] = RM[J][I] = sqrt(2.0) / 2.0;
  119. RM[I][J] = -sqrt(2.0) / 2.0;
  120. }
  121. else
  122. {
  123. a = 0.5 * atan((2.0 * A[I][J]) / (A[I][I] - A[J][J]));
  124. RM[I][I] = RM[J][J] = cos(a);
  125. RM[I][J] = -sin(a);
  126. RM[J][I] = sin(a);
  127. }
  128. trans(RM, RMT, n);
  129. mult(RMT, A, buff, n);
  130. mult(buff, RM, A, n);
  131. fault = fail(A, n);
  132. mult(ans, RM, buff, n);
  133. ans = buff;
  134. result++;
  135. }
  136. for (int i = 0; i < n; i++)
  137. {
  138. sum1 += A[i][i];
  139. }
  140. return result;
  141. }
  142.  
  143. int main()
  144. {
  145. //ifstream cin("input.txt");
  146. int l = 6;
  147. setlocale(LC_ALL, "rus");
  148. vector <int> num;
  149. vector <int> pre;
  150. //ifstream cin("input.txt");
  151. int i, j;
  152. int n;
  153. double precision;
  154. cout << "Введите размерность матрицы:\n";
  155. cin >> n;
  156. num.push_back(n);
  157. cout << "Введите элементы матрицы: \n";
  158. vector <vector<double>> A(n);
  159. vector <vector<double>> ans(n);
  160. int sum2 = 0;
  161. for (int i = 0; i < n; i++)
  162. {
  163. A[i].resize(n);
  164. }
  165. srand(time(0));
  166. for (i = 0; i < n; i++)
  167. {
  168. ans[i].resize(n);
  169. for (int j = 0; j < n; j++)
  170. {
  171. A[i][j] = rand() * 1.0 / RAND_MAX - 0.5;
  172. A[j][i] = A[i][j];
  173. }
  174. sum2 += A[i][i];
  175. ans[i][i] = 1;
  176. }
  177. print(A);
  178. if (!symmetric(A, n))
  179. {
  180. cout << "Матрица не симметричная\n";
  181. }
  182. else
  183. {
  184. //cout << "Введите точность: ";
  185. //cin >> precision;
  186. precision = 0.01;
  187. int cnt = rotate(A, n, ans, precision);
  188. for (i = 0; i < n; i++)
  189. {
  190. cout << "Собственный вектор " << i + 1 << ":\n";
  191. for (j = 0; j < n; j++) {
  192. cout << ans[j][i] << "\n";
  193. }
  194. }
  195. cout << "Собственные значения:\n";
  196. for (i = 0; i < n; i++) {
  197. cout << A[i][i] << "\n";
  198. }
  199. cout << "Общее число шагов: " << cnt;
  200. cout << '\n' << "Сумма диагональных элементов = " << sum2 << '\n' << "Сумма собственных значений = " << sum1 << '\n';
  201. sum2 = sum1 = 0;
  202. pre.push_back(cnt);
  203. }
  204. cout << "Таблица зависимости количества итераций от размера матрица при фиксированной точности = 0.001\n";
  205. for (int i = 0; i < num.size(); i++)
  206. {
  207. cout << setw(6) << num[i];
  208. }
  209. cout << '\n';
  210. for (int i = 0; i < pre.size(); i++)
  211. {
  212. cout << setw(6) << pre[i];
  213. }
  214. cout << '\n' << '\n' << '\n';
  215. system("pause");
  216. return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement