DAS_2024_1/bazunov_andrew_lab_6/README.md

57 lines
2.7 KiB
Markdown
Raw Normal View History

2024-11-28 23:56:00 +04:00
# Распределенные вычисления и приложения Л6
## _Автор Базунов Андрей Игревич ПИбд-42_
---
> ### Задание
> - Кратко: реализовать нахождение детерминанта квадратной матрицы. Что такое детерминант матрицы (или определитель)
> - Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять нахождение отдельной группы множителей.
---
## Алгоритм:
### Функция вычисления определителя матрицы
<details>
<summary>Код</summary>
```python
def minor(matrix, i, j):
return [row[:j] + row[j + 1:] for row in (matrix[:i] + matrix[i + 1:])]
def determinant(matrix: list, threads=1) -> float:
if len(matrix) == 1:
return matrix[0][0]
elif len(matrix) == 2:
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
det = 0
futures = []
with ThreadPoolExecutor(max_workers=threads) as executor:
for col in range(len(matrix)):
cofactor = (-1) ** col * matrix[0][col]
futures.append(executor.submit(lambda m, cof: cof * determinant(m), minor(matrix, 0, col), cofactor))
for future in futures:
det += future.result()
return det
```
</details>
| Размер матрицы | 1 Поток (сек) | 5 Потоков (сек) | 20 Потоков (сек) |
|----------------|---------------|-----------------|------------------|
| 1x1 | 0.0 | 0.0 | 0.0 |
| 2x2 | 0.0 | 0.0 | 0.0 |
| 3x3 | 0.00018 | 0.00019 | 0.00017 |
| 4x4 | 0.00061 | 0.00072 | 0.0007 |
| 5x5 | 0.00247 | 0.00359 | 0.00336 |
| 6x6 | 0.01306 | 0.01931 | 0.02129 |
| 7x7 | 0.08692 | 0.14062 | 0.15682 |
| 8x8 | 0.59383 | 1.03971 | 1.27658 |
2024-12-20 01:00:01 +04:00
| 9x9 | 5.23021 | 9.72031 | 11.71564 |
Видео отчет: https://vkvideo.ru/video236673313_456239579