From a4a572478eafdfbbdd02afa67ad0dedb9877d59c Mon Sep 17 00:00:00 2001 From: Kamil Haliullov Date: Sun, 29 Dec 2024 15:29:27 +0400 Subject: [PATCH] haliullov_kamil_lab_6 is ready --- haliullov_kamil_lab_6/README.md | 29 +++++++ haliullov_kamil_lab_6/project/main.py | 117 ++++++++++++++++++++++++++ haliullov_kamil_lab_6/result.png | Bin 0 -> 11201 bytes 3 files changed, 146 insertions(+) create mode 100644 haliullov_kamil_lab_6/README.md create mode 100644 haliullov_kamil_lab_6/project/main.py create mode 100644 haliullov_kamil_lab_6/result.png diff --git a/haliullov_kamil_lab_6/README.md b/haliullov_kamil_lab_6/README.md new file mode 100644 index 0000000..ca4e01a --- /dev/null +++ b/haliullov_kamil_lab_6/README.md @@ -0,0 +1,29 @@ +# Лабораторная работа №6 - Определение детерминанта матрицы с помощью параллельных вычислений + +## Задание + +* Кратко: реализовать нахождение детерминанта квадратной матрицы. Что такое детерминант матрицы (или определитель) можно посмотреть по ссылке. + +* Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять нахождение отдельной группы множителей. + + +## Работа программы: + + 1. Инициализирует три матрицы размером 100x100, 300x300 и 500x500 со случайными значениями. + + 2. det(matrix) реализует алгоритм Гаусса для нахождения детерминанта квадратной матрицы. + + 3. parallel_det(matrix, num_threads=1) использует пул потоков для ускорения вычислений. Для каждой строки матрицы создается поток, который обрабатывает все строки под ней, применяя необходимые преобразования. + + +### Результат: + +![](result.png "") + +### Вывод: + +Параллельные вычисления могут значительно ускорить процесс нахождения детерминанта, особенно когда речь идет о больших матрицах. Тем не менее, иногда результаты вычисленного детерминанта могут различаться между последовательным и параллельным подходами. + + +# Видео +https://disk.yandex.ru/i/4c25dcWehzi0tg diff --git a/haliullov_kamil_lab_6/project/main.py b/haliullov_kamil_lab_6/project/main.py new file mode 100644 index 0000000..adacac0 --- /dev/null +++ b/haliullov_kamil_lab_6/project/main.py @@ -0,0 +1,117 @@ +import random +import time +import copy +from multiprocessing import Pool +import concurrent.futures +from copy import deepcopy + + +class Matrix: + def __init__(self) -> None: + self.matrix_100 = [[0] * 100 for _ in range(100)] + self.matrix_300 = [[0] * 300 for _ in range(300)] + self.matrix_500 = [[0] * 500 for _ in range(500)] + + def str_matrix(self, type_list: str): + _str = "" + + current_matrix = getattr(self, type_list) + + for i in range(len(current_matrix)): + _str += "[ " + + for j in range(len(current_matrix[0])): + _str += str(current_matrix[i][j]) + " " + + _str += " ]\n" + + return _str + + +def init_matrix(matrix: Matrix, size: int): + for i in range(size): + for j in range(size): + matrix.__dict__[f"matrix_{size}"][i][j] = random.randint(0, 5) + + +def parallel_det(matrix, num_threads=1): + n = len(matrix) + m = deepcopy(matrix) + det_value = 1 + + for i in range(n): + if m[i][i] == 0: + for j in range(i + 1, n): + if m[j][i] != 0: + m[i], m[j] = m[j], m[i] + det_value *= -1 + break + else: + return 0 + + with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor: + futures = [executor.submit(process_row, i, j, m, n) for j in range(i + 1, n)] + concurrent.futures.wait(futures) + + det_value *= m[i][i] + m = [list(row) for row in m] # Обновляем строки матрицы + + return det_value + + +def process_row(i, j, m, n): + factor = m[j][i] / m[i][i] + for k in range(i, n): + m[j][k] -= factor * m[i][k] + return m[j] + + +def det(matrix): + n = len(matrix) + m = [row[:] for row in matrix] + det_value = 1 + + for i in range(n): + if m[i][i] == 0: + for j in range(i + 1, n): + if m[j][i] != 0: + m[i], m[j] = m[j], m[i] + det_value *= -1 + break + else: + return 0 + + for j in range(i + 1, n): + factor = m[j][i] / m[i][i] + for k in range(i, n): + m[j][k] -= factor * m[i][k] + + det_value *= m[i][i] + + return det_value + + +def benchmark(): + matrix = Matrix() + init_matrix(matrix, 100) + init_matrix(matrix, 300) + init_matrix(matrix, 500) + + sizes = [100, 300, 500] + for size in sizes: + current_matrix = getattr(matrix, f'matrix_{size}') + + start_time = time.time() + seq_result = det(current_matrix) + seq_time = time.time() - start_time + print(f"Последовательный детерминант {size}x{size}: {seq_result}, Время: {seq_time:.6f}с") + + + start_time = time.time() + par_result = parallel_det(current_matrix, num_threads=4) # Измените число потоков по необходимости + par_time = time.time() - start_time + print(f"Параллельный детерминант {size}x{size}: {par_result}, Время: {par_time:.6f}с") + + +if __name__ == "__main__": + benchmark() diff --git a/haliullov_kamil_lab_6/result.png b/haliullov_kamil_lab_6/result.png new file mode 100644 index 0000000000000000000000000000000000000000..e8bd701906373da9a4aec7db465f05d8e823c06f GIT binary patch literal 11201 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