DAS_2024_1/putilin_pavel_lab_6/main.py
2024-12-05 18:13:21 +04:00

76 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import numpy as np
import threading
import time
def determinant_gauss(matrix):
"""Вычисление детерминанта методом Гаусса"""
matrix_copy = matrix.astype(np.float64)
n = matrix_copy.shape[0]
det = 1.0
for i in range(n):
if matrix_copy[i, i] == 0:
for j in range(i + 1, n):
if matrix_copy[j, i] != 0:
matrix_copy[[i, j]] = matrix_copy[[j, i]]
det *= -1
break
det *= matrix_copy[i, i]
matrix_copy[i, i:] /= matrix_copy[i, i]
for j in range(i + 1, n):
factor = matrix_copy[j, i]
matrix_copy[j, i:] -= factor * matrix_copy[i, i:]
return det
def determinant_parallel(matrix, num_threads=2):
"""Параллельное вычисление детерминанта с использованием потоков"""
def compute_row(row, matrix_copy):
n = matrix_copy.shape[0]
for i in range(row, n, num_threads):
for j in range(i + 1, n):
if matrix_copy[i, i] == 0:
continue
factor = matrix_copy[j, i] / matrix_copy[i, i]
matrix_copy[j, i:] -= factor * matrix_copy[i, i:]
matrix_copy = matrix.astype(np.float64)
threads = []
for i in range(num_threads):
t = threading.Thread(target=compute_row, args=(i, matrix_copy))
threads.append(t)
t.start()
for t in threads:
t.join()
return matrix_copy[-1, -1]
def benchmark(sizes):
for size in sizes:
matrix = np.random.randint(1, 11, (size, size))
start_time = time.time()
det_regular = determinant_gauss(matrix)
end_time = time.time()
regular_time = end_time - start_time
start_time = time.time()
det_parallel = determinant_parallel(matrix, num_threads=4)
end_time = time.time()
parallel_time = end_time - start_time
print(f"Размер матрицы: {size}x{size}")
print(f"Детерминант (последовательно): {det_regular} | Время: {regular_time} секунд")
print(f"Детерминант (параллельно): {det_parallel} | Время: {parallel_time} секунд")
print("-" * 50)
benchmark([100, 300, 500])