From 059a3cc811653f66322459681891e3e2a30ab3e5 Mon Sep 17 00:00:00 2001 From: "an.lazarev" Date: Fri, 8 Nov 2024 01:13:53 +0400 Subject: [PATCH] lazarev_andrey_lab_6 --- lazarev_andrey_lab_6/README.md | 32 +++++++++++++ lazarev_andrey_lab_6/main.py | 77 ++++++++++++++++++++++++++++++++ lazarev_andrey_lab_6/report.png | Bin 0 -> 36608 bytes 3 files changed, 109 insertions(+) create mode 100644 lazarev_andrey_lab_6/README.md create mode 100644 lazarev_andrey_lab_6/main.py create mode 100644 lazarev_andrey_lab_6/report.png diff --git a/lazarev_andrey_lab_6/README.md b/lazarev_andrey_lab_6/README.md new file mode 100644 index 0000000..1c9c861 --- /dev/null +++ b/lazarev_andrey_lab_6/README.md @@ -0,0 +1,32 @@ +# Лабораторная работа №6 + +## Задание + +Реализовать последователный и параллельный алгоритм поиска детерминанта матрицы размером 100x100, 300x300, 500x500 элементов, сравнить результаты. + +## Описание алгоритмов + +### Последовательное поиск детерминанта + +- Использует метод Гаусса для приведения матрицы к верхней треугольной форме. Детерминант равен произведению элементов на диагонали. Время работы — O(n³). + +### Параллельное поиск детерминанта + +- Разделяет матрицу на блоки, каждый из которых обрабатывается отдельным потоком. + +### Поиск с использованием библиотеки Numpy + +- Использует оптимизированную функцию np.linalg.det, которая применяет методы, такие как LU-разложение, для быстрого вычисления детерминанта. + +## Результаты + +![](report.png "") + +### Вывод +- Параллельное умножение матриц эффективно при работе с большими матрицами при увеличении потоков. +- Последовательное умножение матриц эффективно использовать при меньших размерах матриц, где выйгрыш от управления потоками минимален. +- Numpy показал блестящий результат. + +## Видеодемонстрация работоспособности + +[Демонстрация работы](https://files.ulstu.ru/s/nWF9CGBGA6Kxw5T) \ No newline at end of file diff --git a/lazarev_andrey_lab_6/main.py b/lazarev_andrey_lab_6/main.py new file mode 100644 index 0000000..ed76ae0 --- /dev/null +++ b/lazarev_andrey_lab_6/main.py @@ -0,0 +1,77 @@ +import numpy as np +from concurrent.futures import ProcessPoolExecutor +import time + +# Функция последовательного поиска детерминанта +def det_sequential(matrix): + n = len(matrix) + det = 1 + + for i in range(n): + if matrix[i][i] == 0: + for j in range(i + 1, n): + if matrix[j][i] != 0: + matrix[i], matrix[j] = matrix[j], matrix[i] + det *= -1 + break + else: + return 0 + + for j in range(i + 1, n): + factor = matrix[j][i] / matrix[i][i] + for k in range(i, n): + matrix[j][k] -= factor * matrix[i][k] + + det *= matrix[i][i] + + return det + +# Функция поиска детерминанта с numpy +def det_numpy(A): + return np.linalg.det(A) + +# Функция параллельного поиска детерминанта +def det_parallel(A, num_threads): + n = len(A) + C = [] + step = n // num_threads + + with ProcessPoolExecutor(max_workers=num_threads) as executor: + futures = [] + for i in range(num_threads): + start_row = i * step + end_row = (i + 1) * step if i != num_threads - 1 else n + a_slice = A[start_row:end_row, start_row:end_row] + + futures.append(executor.submit(det_sequential, a_slice)) + for future in futures: + C.append(future.result()) + + return np.prod(C) + +# Пример использования +if __name__ == "__main__": + matrix_sizes = [100, 300, 500] + num_threads = [2, 4, 5, 10] + for n in matrix_sizes: + A = np.random.rand(n, n) + + # Поиск с numpy + start_np = time.time() + nump = det_numpy(A) + end_np = time.time() + print(f'Детерминант матрицы {n}x{n} с numpy: {(end_np - start_np):.3f} с.') + + # Последовательное умножение + start_seq = time.time() + sequential = det_sequential(A) + end_seq = time.time() + print(f'Детерминант матрицы {n}x{n} последовательно: {(end_seq - start_seq):.3f} с.') + + # Параллельное умножение + for thread in num_threads: + start_par = time.time() + parallel = det_parallel(A, thread) + end_par = time.time() + print(f'Детерминант матрицы {n}x{n} параллельно для {thread} потоков: {(end_par - start_par):.3f} с.') + print('') \ No newline at end of file diff --git a/lazarev_andrey_lab_6/report.png b/lazarev_andrey_lab_6/report.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7b0753c1e72d6bdb39eee6374175994c0f9dba GIT binary patch literal 36608 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