add: 6 лабораторная работа
This commit is contained in:
parent
5dd9e26f07
commit
8f7466660b
36
balakhonov_danila_lab_6/README.md
Normal file
36
balakhonov_danila_lab_6/README.md
Normal file
@ -0,0 +1,36 @@
|
||||
# Лабораторная работа номер 6
|
||||
|
||||
> Здравствуйте меня зовут Балахонов Данила группа ПИбд-42
|
||||
>
|
||||
> *— Балахонов Данила ПИбд-42*
|
||||
|
||||
Видео лабораторной работы номер 6 доступно по этой [ссылке](https://drive.google.com/file/d/1GUJP05PU88XX0UQ3SnzyrcvMiUZ5LN1j/view?usp=sharing).
|
||||
|
||||
## Как запустить лабораторную работу номер 6?
|
||||
### Необходимые компоненты для запуска лабораторной работы номер 6
|
||||
> Здесь рассказана установка необходимых компонентов для запуска лабораторной работы номер 6 под дистрибутив GNU/Linux **Ubuntu**.
|
||||
|
||||
Для запуска лабораторной работы номер 6 необходимы такие компоненты:
|
||||
- Python 3
|
||||
|
||||
Чтобы установить Python 3, введите такую команду:
|
||||
``` bash
|
||||
sudo apt update
|
||||
sudo apt install python3
|
||||
```
|
||||
После этого будет установлена последняя версия Python.
|
||||
### Запуск лабораторной работы номер 6
|
||||
Для запуска лабораторной работы номер 6 необходимо **склонировать** репозиторий в любую папку и **перейти на ветку** balakhonov_danila_lab_6.
|
||||
Далее в папке с `program.py` нужно вызвать такую команду:
|
||||
``` bash
|
||||
python3 program.py
|
||||
```
|
||||
Таким образом будет запущена программа по подсчету определителя матрицы.
|
||||
## Какие технологии были использованы?
|
||||
Для выполнения лабораторной работы номер 6 были использованы такие технологии, как:
|
||||
- Python
|
||||
## Что делает лабораторная работа номер 6?
|
||||
Суть лабораторной работы номер 6 заключается в разработке приложения по параллельному подсчету определителя квадратной матрицы большого размера.
|
||||
## Выводы лабораторной работы номер 6
|
||||
Пример выполнения программы на матрицах 100x100, 300x300, 500x500 можно увидеть на рисунке ниже.
|
||||
![Результат выполнения программы](result.png)
|
44
balakhonov_danila_lab_6/program.py
Normal file
44
balakhonov_danila_lab_6/program.py
Normal file
@ -0,0 +1,44 @@
|
||||
import random as rnd
|
||||
import time
|
||||
import concurrent.futures
|
||||
def gen_square_matrix(size):
|
||||
return [[rnd.randint(1, 100) for _ in range(size)] for _ in range(size)]
|
||||
# Параллельное вычисление определителя
|
||||
def parallel_det(matrix, num_threads):
|
||||
n = len(matrix)
|
||||
# Определитель
|
||||
det_value = 1
|
||||
def process_row(i, j):
|
||||
factor = matrix[j][i] / matrix[i][i]
|
||||
for k in range(i, n):
|
||||
matrix[j][k] -= factor * matrix[i][k]
|
||||
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_value *= -1
|
||||
break
|
||||
else:
|
||||
return 0
|
||||
# Параллельное вычисление
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:
|
||||
futures = [
|
||||
executor.submit(process_row, i, j) for j in range(i + 1, n)
|
||||
]
|
||||
concurrent.futures.wait(futures)
|
||||
# Обновление определителя
|
||||
det_value *= matrix[i][i]
|
||||
return det_value
|
||||
|
||||
if __name__ == "__main__":
|
||||
sizes = [100, 300, 500]
|
||||
num_threads = [1, 5, 8]
|
||||
for size in sizes:
|
||||
matrix = gen_square_matrix(size)
|
||||
for threads in num_threads:
|
||||
start_time = time.time()
|
||||
parallel_det(matrix, threads)
|
||||
end_time = time.time()
|
||||
print(f"Параллельное вычисление определителя.\tРазмер: {size}, {threads} потоков\t|\t {end_time - start_time}")
|
||||
print("=" * 100)
|
BIN
balakhonov_danila_lab_6/result.png
Normal file
BIN
balakhonov_danila_lab_6/result.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
Loading…
Reference in New Issue
Block a user