Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.71 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "math.h"
  3. #include "iostream"
  4. #include "iomanip"
  5. #include "time.h"
  6. using namespace std;
  7.  
  8. int SLAU(double **matrica_a, int n, double *massiv_b, double *x) //функция необходимых преобразовании
  9. {
  10. int i, j, k, r; //
  11. double c, M, max, s, **a, *b; //
  12. a = new double *[n]; //
  13. for (i = 0; i < n; i++) //инициализация необходимых переменных и массивов
  14. { //
  15. a[i] = new double[n]; //
  16. } //
  17. b = new double[n];
  18. for (i = 0; i < n; i++)
  19. {
  20. for (j = 0; j < n; j++)
  21. {
  22. a[i][j] = matrica_a[i][j];
  23. }
  24. }
  25. for (i = 0; i < n; i++)
  26. {
  27. b[i] = massiv_b[i];
  28. }
  29. for (k = 0; k<n; k++)
  30. {
  31. max = fabs(a[k][k]);
  32. r = k;
  33. for (i = k + 1; i<n; i++)
  34. {
  35. if (fabs(a[i][k])>max)
  36. {
  37. max = fabs(a[i][k]);
  38. r = i;
  39. }
  40. }
  41. for (j = 0; j<n; j++)
  42. {
  43. c = a[k][j];
  44. a[k][j] = a[r][j];
  45. a[r][j] = c;
  46. }
  47. c = b[k];
  48. b[k] = b[r];
  49. b[r] = c;
  50. for (i = k + 1; i<n; i++)
  51. {
  52. for (M = a[i][k] / a[k][k], j = k; j < n; j++)
  53. {
  54. a[i][j] -= M*a[k][j];
  55. }
  56. b[i] -= M*b[k];
  57. }
  58. }
  59. if (a[n - 1][n - 1] == 0)
  60. {
  61. if (b[n - 1] == 0)
  62. return -1;
  63. else return -2;
  64. }
  65. else
  66. {
  67. for (i = n - 1; i >= 0; i--)
  68. {
  69. for (s = 0, j = i + 1; j < n; j++)
  70. {
  71. s += a[i][j] * x[j];
  72. }
  73. x[i] = (b[i] - s) / a[i][i];
  74. }
  75. return 0;
  76. }
  77. for (i = 0; i < n; i++)
  78. {
  79. delete[] a[i];
  80. }
  81. delete[] a;
  82. delete[] b;
  83. }
  84.  
  85. int parralelSLAU(double **matrica_a, int n, double *massiv_b, double *x) //функция необходимых преобразовании
  86. {
  87. int i, j, k, r; //
  88. double c, M, max, s, **a, *b; //
  89. a = new double *[n]; //
  90. for (i = 0; i < n; i++) //инициализация необходимых переменных и массивов
  91. { //
  92. a[i] = new double[n]; //
  93. } //
  94. b = new double[n];
  95. for (i = 0; i < n; i++)
  96. {
  97. for (j = 0; j < n; j++)
  98. {
  99. a[i][j] = matrica_a[i][j];
  100. }
  101. }
  102. for (i = 0; i < n; i++)
  103. {
  104. b[i] = massiv_b[i];
  105. }
  106. for (k = 0; k<n; k++)
  107. {
  108. max = fabs(a[k][k]);
  109. r = k;
  110. for (i = k + 1; i<n; i++)
  111. {
  112. if (fabs(a[i][k])>max)
  113. {
  114. max = fabs(a[i][k]);
  115. r = i;
  116. }
  117. }
  118. for (j = 0; j<n; j++)
  119. {
  120. c = a[k][j];
  121. a[k][j] = a[r][j];
  122. a[r][j] = c;
  123. }
  124. c = b[k];
  125. b[k] = b[r];
  126. b[r] = c;
  127. for (i = k + 1; i<n; i++)
  128. {
  129. for (M = a[i][k] / a[k][k], j = k; j < n; j++)
  130. {
  131. a[i][j] -= M*a[k][j];
  132. }
  133. b[i] -= M*b[k];
  134. }
  135. }
  136. if (a[n - 1][n - 1] == 0)
  137. {
  138. if (b[n - 1] == 0)
  139. return -1;
  140. else return -2;
  141. }
  142. else
  143. {
  144. for (i = n - 1; i >= 0; i--)
  145. {
  146. for (s = 0, j = i + 1; j < n; j++)
  147. {
  148. s += a[i][j] * x[j];
  149. }
  150. x[i] = (b[i] - s) / a[i][i];
  151. }
  152. return 0;
  153. }
  154. for (i = 0; i < n; i++)
  155. {
  156. delete[] a[i];
  157. }
  158. delete[] a;
  159. delete[] b;
  160. }
  161.  
  162. int INVERSE(double **a, int n, double **y, int choise) //функция нахождения обратной матрицы
  163. {
  164. int i, j, res;
  165. double *b, *x;
  166. b = new double[n];
  167. x = new double[n];
  168. for (i = 0; i < n; i++)
  169. {
  170. for (j = 0; j < n; j++)
  171. {
  172. if (j == i)
  173. b[j] = 1;
  174. else b[j] = 0;
  175. }
  176. if(choise == 0)
  177. res = SLAU(a, n, b, x);
  178. else res = parralelSLAU(a, n, b, x);
  179. if (res != 0)
  180. break;
  181. else
  182. {
  183. for (j = 0; j < n; j++)
  184. {
  185. y[j][i] = x[j];
  186. }
  187. }
  188. }
  189. delete[] x;
  190. delete[] b;
  191. if (res != 0)
  192. return -1;
  193. else return 0;
  194. }
  195.  
  196. int main()
  197. {
  198. setlocale(LC_ALL, "Rus");
  199. srand(time(NULL));
  200. int result, i, j, N;
  201. double **a, **b;
  202. cout << "N = ";
  203. cin >> N; //ввод размера
  204. a = new double *[N];
  205. for (i = 0; i < N; i++)
  206. {
  207. a[i] = new double[N]; //инициализация пустого двумерного массива для исходной матрицы
  208. }
  209. b = new double *[N];
  210. for (i = 0; i < N; i++)
  211. {
  212. b[i] = new double[N]; //инициализация пустого двумерного массива для обратной матрицы
  213. }
  214. for (i = 0; i < N; i++)
  215. {
  216. for (j = 0; j < N; j++)
  217. {
  218. if(i == j)
  219. a[i][j] = rand() % 10 + 1;
  220. else a[i][j] = rand() % 11; //генерация значении исходной матрицы
  221. }
  222. }
  223. cout << "Сгенерированная матрица" << endl;
  224. for (i = 0; i < N; i++)
  225. {
  226. for (j = 0; j < N; j++)
  227. {
  228. cout << a[i][j] << " "; // вывод сгенерированной матрицы
  229. }
  230. cout << endl;
  231. }
  232. int k = 0;
  233. for (i = 0; i < N; i++) //
  234. { // проверка на наличие нулей в главной диагонали
  235. if (a[i][i] == 0) //
  236. k++; //
  237. }
  238. if (k == 0)
  239. {
  240. clock_t startTime1 = clock(); //начало выполнения основной функции
  241. result = INVERSE(a, N, b, 0); //нахождение обратной матрицы
  242. clock_t finishTime1 = clock(); //конец выполнения основной функции
  243. clock_t searchTime1 = (double)(finishTime1 - startTime1) / (double)CLOCKS_PER_SEC * 1000000.0; //вычисление разницы от начала до конца выполнения функции
  244.  
  245. b = new double *[N];
  246. for (i = 0; i < N; i++)
  247. {
  248. b[i] = new double[N]; //инициализация пустого двумерного массива для обратной матрицы
  249. }
  250.  
  251. clock_t startTime2 = clock(); //начало выполнения основной функции
  252. result = INVERSE(a, N, b, 1); //нахождение обратной матрицы
  253. clock_t finishTime2 = clock(); //конец выполнения основной функции
  254. clock_t searchTime2 = (double)(finishTime2 - startTime2) / (double)CLOCKS_PER_SEC * 1000000.0; //вычисление разницы от начала до конца выполнения функции
  255. if (result == 0)
  256. {
  257. cout << "Обратная матрица" << endl;
  258. for (i = 0; i < N; cout << endl, i++)
  259. {
  260. for (j = 0; j < N; j++)
  261. {
  262. cout << setprecision(3) << b[i][j] << "\t"; //вывод обратной матрицы
  263. }
  264. }
  265. cout << "Время работы последовательного кода в микросекундах - " << searchTime1 << endl;
  266. cout << "Время работы параллельного кода в микросекундах - " << searchTime2 << endl;
  267. }
  268. else cout << "Обратной матрицы не существует" << endl;
  269. }
  270. else cout << "Диагональ содержит нули!";
  271. for (i = 0; i < N; i++)
  272. {
  273. delete[] a[i];
  274. }
  275. delete[] a;
  276. for (i = 0; i < N; i++)
  277. {
  278. delete[] b[i];
  279. }
  280. delete[] b;
  281.  
  282. system("pause");
  283. return 0;
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement