diff --git a/src/functions/inverseMatrix.ts b/src/functions/inverseMatrix.ts index 4afc8d9..b2a61f1 100644 --- a/src/functions/inverseMatrix.ts +++ b/src/functions/inverseMatrix.ts @@ -1,20 +1,16 @@ import { isSquareMatrix } from "./utils"; -// Пошук оберненої матриці для довільної квадратної матриці function inverseMatrix(matrix: number[][]): number[][] | null { const n = matrix.length; - // Перевірка, чи матриця є квадратною if (!isSquareMatrix(matrix)) { return null; } - // Створення одиничної матриці const identityMatrix: number[][] = Array.from({ length: n }, (_, i) => Array.from({ length: n }, (_, j) => (i === j ? 1 : 0)) ); - // Копія вхідної матриці для уникнення змін у вхідних даних const augmentedMatrix: number[][] = matrix.map((row) => [ ...row, ...identityMatrix[matrix.indexOf(row)], @@ -24,10 +20,9 @@ function inverseMatrix(matrix: number[][]): number[][] | null { const pivot = augmentedMatrix[i][i]; if (pivot === 0) { - return null; // Матриця не має оберненої матриці + return null; } - // Кроки Звичайних Жорданових виключень for (let j = 0; j < 2 * n; j++) { augmentedMatrix[i][j] /= pivot; } @@ -42,9 +37,7 @@ function inverseMatrix(matrix: number[][]): number[][] | null { } } - // Витягнення оберненої матриці з розширеної матриці const inverse: number[][] = augmentedMatrix.map((row) => row.slice(n)); - return inverse; } diff --git a/src/functions/matrixRank.ts b/src/functions/matrixRank.ts index d862b11..e5abfc3 100644 --- a/src/functions/matrixRank.ts +++ b/src/functions/matrixRank.ts @@ -3,34 +3,29 @@ function calculateMatrixRank(matrix: number[][]): number { const numRows = augmentedMatrix.length; const numCols = augmentedMatrix[0].length; - let rank = 0; for (let col = 0; col < numCols && rank < numRows; col++) { - // Знаходження ненульового елемента в стовпці col let nonZeroRow = rank; while (nonZeroRow < numRows && augmentedMatrix[nonZeroRow][col] === 0) { nonZeroRow++; } if (nonZeroRow === numRows) { - continue; // Всі рядки під колом col мають нульові значення, переходимо до наступного стовпця + continue; } - // Обмін рядками, щоб мати ненульовий елемент на позначеній позиції [augmentedMatrix[rank], augmentedMatrix[nonZeroRow]] = [augmentedMatrix[nonZeroRow], augmentedMatrix[rank]]; - // Зрізання стовпця до ненульового елемента, щоб усі інші рядки мали нульові значення for (let i = rank + 1; i < numRows; i++) { const factor = augmentedMatrix[i][col] / augmentedMatrix[rank][col]; for (let j = col; j < numCols; j++) { augmentedMatrix[i][j] -= factor * augmentedMatrix[rank][j]; } } - + rank++; } - return rank; } diff --git a/src/functions/solveLinearSystem.ts b/src/functions/solveLinearSystem.ts index e4cf1a4..f8f1b5a 100644 --- a/src/functions/solveLinearSystem.ts +++ b/src/functions/solveLinearSystem.ts @@ -3,14 +3,12 @@ import inverseMatrix from "./inverseMatrix"; function solveLinearSystem(matrix: number[][], constants: number[]): number[] | null { const n = matrix.length; - // Обчислення оберненої матриці const inverse = inverseMatrix(matrix); if (!inverse) { return null; } - // Обчислення вектора розв'язку const solution: number[] = []; for (let i = 0; i < n; i++) { let sum = 0; diff --git a/src/functions/utils.ts b/src/functions/utils.ts index bdda901..14b0443 100644 --- a/src/functions/utils.ts +++ b/src/functions/utils.ts @@ -1,26 +1,32 @@ -// Проверка квадратной ли матрица export function isSquareMatrix(matrix: number[][]): boolean { const rows = matrix.length; if (rows === 0) { - return false; // Пустая матрица не считается квадратной + return false; } for (const row of matrix) { if (row.length !== rows) { - return false; // Если хотя бы одна строка не имеет той же длины, что и количество строк, то это не квадратная матрица + return false; } } return true; } -// Виведення матриці +export function roundedRow(row: number[]) { + return row.map((value) => { + const res = Math.round(value * 1000) / 1000; + if (Object.is(res, -0)) return 0; + else return res; + }); +} + +export function roundedMatrix(matrix: number[][]): number[][] { + return matrix.map((value) => roundedRow(value)); +} + export function printMatrix(matrix: number[][]): void { for (const row of matrix) { console.log(roundedRow(row).join("\t")); } } - -export function roundedRow(row: number[]) { - return row.map((value) => Math.round(value * 1000) / 1000); -} \ No newline at end of file