DilyaraL

2курсOcuСЛАУ

Apr 15th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.85 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <ctime>
  4. #include<time.h>
  5. #include <cmath>
  6. #include <iomanip>
  7. #include <omp.h>
  8.  
  9. using namespace std;
  10.  
  11. class СЛАУ
  12. {
  13. public:
  14. int n;
  15. double epx = 0.01;
  16. double **a;
  17. double *b;
  18. double *x;
  19. double *x0;
  20. void create_A(int N);
  21. void create_b();
  22. void vector_x();
  23. void vector_x0();
  24. void out_x();
  25. void out();
  26.  
  27. void Gause();
  28. void proverka();
  29.  
  30. void Yakobi();
  31.  
  32. void YakobiParall();
  33. };
  34.  
  35. void СЛАУ::create_A(int N)
  36. {
  37. n = N;
  38. a = new double*[n];
  39. for (int i = 0; i < n; i++)
  40. a[i] = new double[n];
  41. for (int i = 0; i < n; i++)
  42. for (int j = 0; j < n; j++)
  43. {
  44. a[i][j] = (rand() % 10)*1.0+1.0;
  45. if (i == j)
  46. a[i][j] *= 1000;///костыль
  47. }
  48. }
  49.  
  50. void СЛАУ::create_b()
  51. {
  52. b = new double[n];
  53. for (int i = 0; i < n; i++)
  54. b[i] = (rand() % 10)*1.0;
  55. }
  56.  
  57. void СЛАУ::vector_x()
  58. {
  59. x = new double[n];
  60. for (int i = 0; i < n; i++)
  61. x[i] = 0.0;
  62. }
  63.  
  64. void СЛАУ::vector_x0()
  65. {
  66. x0 = new double[n];
  67. for (int i = 0; i < n; i++)
  68. {
  69. if (a[i][1] != 0)
  70. x0[i] = b[i] / a[i][i];
  71. }
  72. }
  73.  
  74. double norma(double*v, int k)
  75. {
  76. double s = 0;
  77. for (int i = 0; i < k; i++)
  78. s += v[i] * v[i];
  79. return sqrt(s);
  80. }
  81.  
  82. void СЛАУ::out()
  83. {
  84. for (int i = 0; i < n; i++)
  85. {
  86. //<< setw(6)
  87. cout << '|' << ' ';
  88. for (int j = 0; j < n; j++)
  89. {
  90. cout.width(7);
  91. cout << setprecision(4) << a[i][j] << ' ';
  92. }
  93. cout << '|';
  94. cout.width(7);
  95. cout << setprecision(4) << b[i];
  96. cout << " |" << endl;
  97. }
  98. cout << endl;
  99. }
  100.  
  101. void СЛАУ::out_x()
  102. {
  103. cout << '(';
  104. for (int i = 0; i < n - 1; i++)
  105. {
  106. cout.width(7);
  107. cout << setprecision(4) << x[i];
  108. cout << " ,";
  109. }
  110. cout.width(7);
  111. cout << setprecision(4) << x[n - 1];
  112. cout << ')' << endl;
  113. }
  114.  
  115. void СЛАУ::Gause()
  116. {
  117. int i, j, k;
  118. double help;///будет хранить на что будем умножать строки, чтобы потом вычесть
  119. for (i = 0; i < n; i++)
  120. {
  121. if (a[i][i] != 0)//диагональный элемент
  122. {
  123. help = a[i][i];
  124. b[i] = b[i] / help;
  125. for (j = 0; j < n; j++)
  126. a[i][j] = a[i][j] / help;//чтобы диагональный быд 1
  127.  
  128. }
  129. if (i != n - 1)
  130. {
  131. for (k = i + 1; k < n; k++)
  132. {
  133. help = a[k][i];
  134. for (j = 0; j < n; j++)
  135. a[k][j] = a[k][j] - help * a[i][j];//чтобы первый был ноль
  136. b[k] = b[k] - help * b[i];
  137. }
  138. }
  139.  
  140. }
  141. for (int i = 0; i < n; i++)
  142. x[i] = 1.0;
  143. for (int i = n - 1; i > -1; i--)
  144. {
  145. x[i] = b[i];
  146. for (int j = n - 1; j > i; j--)
  147. {
  148. x[i] = x[i] - a[i][j] * x[j];
  149. }
  150. }
  151. }
  152.  
  153. void СЛАУ::proverka()
  154. {
  155. double k = 0;
  156. bool f = true;
  157. for (int i = 0; i < n; i++)
  158. {
  159. k = 0;
  160. for (int j = 0; j < n; j++)
  161. k += a[i][j] * x[j];
  162. if (k != b[i])
  163. f = false;
  164. }
  165. if (f)
  166. cout << "Good" << endl;
  167. else cout << "Bad" << endl;
  168. }
  169.  
  170. void СЛАУ::Yakobi()
  171. {
  172. double start_t, end_t;
  173. start_t = omp_get_wtime();
  174. for (int i = 0; i < n; i++)
  175. {
  176. if (a[i][i] != 0)
  177. {
  178. x[i] = b[i] / a[i][i];////на певый элемент делить или на диагональный?
  179. //cout << "x[" << i << "]= " << x[i];
  180. for (int j = 0; j < n; j++)
  181. {
  182. if (i != j)
  183. {
  184. x[i] -= a[i][j] * x0[j] / a[i][i];
  185. //cout << -x[i];
  186. }
  187. }
  188. //cout << "= " << x[i] << endl;
  189. }
  190.  
  191. }
  192. if (abs(norma(x, n) - norma(x0, n) > epx))
  193. {
  194. for (int i = 0; i < n; i++)
  195. x0[i] = x[i];
  196. Yakobi();
  197. }
  198. end_t = omp_get_wtime();
  199. cout << "Time not parallel= " << (end_t - start_t)*1000 << endl;
  200. }
  201.  
  202. void СЛАУ::YakobiParall()
  203. {
  204. double start_t, end_t;
  205. start_t = omp_get_wtime();
  206. int num_t;
  207. cout << "Enter number of threads " << endl;
  208. cin >> num_t;
  209. omp_set_num_threads(num_t);
  210. #pragma omp parallel for schedule (guided) //(static) //(guided)//(dynamic)
  211. {
  212. for (int i = 0; i < n; i++)
  213. {
  214. if (a[i][i] != 0)
  215. {
  216. x[i] = b[i] / a[i][i];////на певый элемент делить или на диагональный?
  217. //cout << "x[" << i << "]= " << x[i];
  218. for (int j = 0; j < n; j++)
  219. {
  220. if (i != j)
  221. {
  222. x[i] -= a[i][j] * x0[j] / a[i][i];
  223. //cout << -x[i];
  224. }
  225. }
  226. //cout << "= " << x[i] << endl;
  227. }
  228.  
  229. }
  230. }
  231. if (abs(norma(x, n) - norma(x0, n) > epx))
  232. {
  233. #pragma omp parallel for schedule (guided) //(static)//(dynamic)
  234. {
  235. for (int i = 0; i < n; i++)
  236. x0[i] = x[i];
  237. }
  238. YakobiParall();
  239. }
  240. end_t = omp_get_wtime();
  241. cout << "Time parallel= " << (end_t - start_t) * 1000 << endl;
  242. }
  243.  
  244. void Experemet_1()//время от количества нитей
  245. {
  246.  
  247. }
  248.  
  249. int main()
  250. {
  251. СЛАУ H;
  252. int n = 400;
  253. H.create_A(n);
  254. H.create_b();
  255. //H.out();
  256. H.vector_x();
  257. H.vector_x0();
  258.  
  259. H.Gause();
  260. //H.out_x();
  261.  
  262. H.Yakobi();
  263. //H.out_x();
  264.  
  265. H.YakobiParall();
  266. //H.out_x();
  267.  
  268. system("pause");
  269. return 0;
  270. }
Advertisement
Add Comment
Please, Sign In to add comment