From f67d0375f9aaaf9c9c7cbab614dceb6937cf5641 Mon Sep 17 00:00:00 2001 From: KirillTepechin Date: Wed, 13 Dec 2023 19:48:21 +0400 Subject: [PATCH] tepechin_kirill_lab_6 --- tepechin_kirill_lab_6/README.md | 106 ++++++++++++++ tepechin_kirill_lab_6/result.png | Bin 0 -> 19320 bytes .../src/MatrixDeterminant.java | 138 ++++++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 tepechin_kirill_lab_6/README.md create mode 100644 tepechin_kirill_lab_6/result.png create mode 100644 tepechin_kirill_lab_6/src/MatrixDeterminant.java diff --git a/tepechin_kirill_lab_6/README.md b/tepechin_kirill_lab_6/README.md new file mode 100644 index 0000000..1825437 --- /dev/null +++ b/tepechin_kirill_lab_6/README.md @@ -0,0 +1,106 @@ +## Лабораторная работа №6, Тепечин Кирилл + +### Код + +#### Обычный код +````java +private static BigDecimal findDeterminantGauss(double[][] matrix) { + int n = matrix.length; + BigDecimal det = BigDecimal.ONE; + + for (int i = 0; i < n; i++) { + int maxRow = i; + for (int j = i + 1; j < n; j++) { + if (Math.abs(matrix[j][i]) > Math.abs(matrix[maxRow][i])) { + maxRow = j; + } + } + + if (maxRow != i) { + double[] temp = matrix[i]; + matrix[i] = matrix[maxRow]; + matrix[maxRow] = temp; + + det = det.multiply(BigDecimal.valueOf(-1)); + } + + for (int j = i + 1; j < n; j++) { + double factor = matrix[j][i] / matrix[i][i]; + for (int k = i; k < n; k++) { + matrix[j][k] -= factor * matrix[i][k]; + } + } + } + + for (int i = 0; i < n; i++) { + det = det.multiply(BigDecimal.valueOf(matrix[i][i])); + } + + return det; + + } +```` + +#### Параллельный код +````java +private static BigDecimal findDeterminantGaussParallel(double[][] matrix, int threadsCount) { + int n = matrix.length; + final BigDecimal[] det = {BigDecimal.ONE}; + + ExecutorService executor = Executors.newFixedThreadPool(threadsCount); + + for (int i = 0; i < n; i++) { + final int rowIdx = i; + + int maxRow = rowIdx; + for (int j = rowIdx + 1; j < n; j++) { + if (Math.abs(matrix[j][rowIdx]) > Math.abs(matrix[maxRow][rowIdx])) { + maxRow = j; + } + } + + if (maxRow != rowIdx) { + double[] temp = matrix[rowIdx]; + matrix[rowIdx] = matrix[maxRow]; + matrix[maxRow] = temp; + det[0] = det[0].multiply(BigDecimal.valueOf(-1)); + } + executor.execute(() -> { + for (int j = rowIdx + 1; j < n; j++) { + double factor = matrix[j][rowIdx] / matrix[rowIdx][rowIdx]; + for (int k = rowIdx; k < n; k++) { + matrix[j][k] -= factor * matrix[rowIdx][k]; + } + } + }); + det[0] = det[0].multiply(BigDecimal.valueOf(matrix[rowIdx][rowIdx])); + } + + executor.shutdown(); + + try { + executor.awaitTermination(1, TimeUnit.DAYS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return det[0]; + + } +```` + +### Тесты + +Тесты проводились на 16 потоках + +![result](result.png) + +### Выводы + +* На матрицах от 100 до 500 последовательное вычисление быстрее. + +* Параллельное вычисление работает быстрее на матрицах от 1000 n. + +### Ссылка на видео + +https://youtu.be/ZK1qSvbUNTk \ No newline at end of file diff --git a/tepechin_kirill_lab_6/result.png b/tepechin_kirill_lab_6/result.png new file mode 100644 index 0000000000000000000000000000000000000000..9f2497996be1c9437939ee1a303d53f6093c3ffa GIT binary patch literal 19320 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 J`{>2n{|~Qrp{W1> literal 0 HcmV?d00001 diff --git a/tepechin_kirill_lab_6/src/MatrixDeterminant.java b/tepechin_kirill_lab_6/src/MatrixDeterminant.java new file mode 100644 index 0000000..4a5b4ad --- /dev/null +++ b/tepechin_kirill_lab_6/src/MatrixDeterminant.java @@ -0,0 +1,138 @@ +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class MatrixDeterminant { + + public static double[][] generateMatrix(int n) { + double[][] matrix = new double[n][n]; + + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + matrix[i][j] = Math.round((Math.random() * 5)); + } + } + + return matrix; + } + + + private static BigDecimal findDeterminantGauss(double[][] matrix) { + int n = matrix.length; + BigDecimal det = BigDecimal.ONE; + + for (int i = 0; i < n; i++) { + int maxRow = i; + for (int j = i + 1; j < n; j++) { + if (Math.abs(matrix[j][i]) > Math.abs(matrix[maxRow][i])) { + maxRow = j; + } + } + + if (maxRow != i) { + double[] temp = matrix[i]; + matrix[i] = matrix[maxRow]; + matrix[maxRow] = temp; + + det = det.multiply(BigDecimal.valueOf(-1)); + } + + for (int j = i + 1; j < n; j++) { + double factor = matrix[j][i] / matrix[i][i]; + for (int k = i; k < n; k++) { + matrix[j][k] -= factor * matrix[i][k]; + } + } + } + + for (int i = 0; i < n; i++) { + det = det.multiply(BigDecimal.valueOf(matrix[i][i])); + } + + return det; + + } + + private static BigDecimal findDeterminantGaussParallel(double[][] matrix, int threadsCount) { + int n = matrix.length; + final BigDecimal[] det = {BigDecimal.ONE}; + + ExecutorService executor = Executors.newFixedThreadPool(threadsCount); + + for (int i = 0; i < n; i++) { + final int rowIdx = i; + + int maxRow = rowIdx; + for (int j = rowIdx + 1; j < n; j++) { + if (Math.abs(matrix[j][rowIdx]) > Math.abs(matrix[maxRow][rowIdx])) { + maxRow = j; + } + } + + if (maxRow != rowIdx) { + double[] temp = matrix[rowIdx]; + matrix[rowIdx] = matrix[maxRow]; + matrix[maxRow] = temp; + det[0] = det[0].multiply(BigDecimal.valueOf(-1)); + } + executor.execute(() -> { + for (int j = rowIdx + 1; j < n; j++) { + double factor = matrix[j][rowIdx] / matrix[rowIdx][rowIdx]; + for (int k = rowIdx; k < n; k++) { + matrix[j][k] -= factor * matrix[rowIdx][k]; + } + } + }); + det[0] = det[0].multiply(BigDecimal.valueOf(matrix[rowIdx][rowIdx])); + } + + executor.shutdown(); + + try { + executor.awaitTermination(1, TimeUnit.DAYS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return det[0]; + + } + public static void main(String[] args) { + run(100); + run(300); + run(500); + run(1000); + run(3000); + } + + public static void run(int n) { + System.out.println("N = " + n); + double[][] matrix = generateMatrix(n); + double[][] matrixClone = Arrays.copyOf(matrix, n); + + long time = System.currentTimeMillis(); + BigDecimal determinantGauss = findDeterminantGauss(matrix); + System.out.println("Time gauss sync: " + (System.currentTimeMillis() - time)); + + time = System.currentTimeMillis(); + BigDecimal determinantGaussAsync = findDeterminantGaussParallel(matrixClone, Runtime.getRuntime().availableProcessors()); + System.out.println("Time gauss async: " + (System.currentTimeMillis() - time)); + + + if (n < 101) { + System.out.println("Determinant (gauss sync): " + new DecimalFormat("#0.##").format(determinantGauss)); + System.out.println("Determinant (gauss async): " + new DecimalFormat("#0.##").format(determinantGaussAsync)); + } + + System.out.println(); + + } + + +} + +