/// <summary> /// Метод находящий минор матрицы. /// </summary> /// <param name="matrix"> Матрица. </param> /// <param name="order"> Порядок матрицы. </param> /// <param name="lastColumn"> Последняя колонка новой матрицы. </param> /// <param name="lastRow"> Последняя строчка новой матрицы. </param> /// <returns> Минор матрицы. </returns> public double FindMinorMatrix(Matrix matrix, int order, int lastColumn, int lastRow) { Console.WriteLine(); Console.WriteLine("Минор матрицы."); Console.WriteLine(); if (order > lastColumn || order > lastRow) { throw new ArgumentException(); } var result = 0.0; var columnLength = matrix.MatrixValue.GetLength(0); // длина колонки матрицы. var rowLength = matrix.MatrixValue.GetLength(1); // длина строки матрицы. var newMatrix = new Matrix(new double[order, order]); var newColumnLength = newMatrix.MatrixValue.GetLength(0); // длина колонки новой матрицы. var newRowLength = newMatrix.MatrixValue.GetLength(1); // длина строки новой матрицы. var lastRowLength = lastRow; var isStartFillingNewMatrix = false; var squareMatrix = new SquareMatrix(); newColumnLength = newMatrix.MatrixValue.GetLength(0) - 1; for (int i = columnLength; i > 0; i--) { newRowLength = newMatrix.MatrixValue.GetLength(1) - 1; // длина строки новой матрицы. var remainderRowFilling = order; for (int j = rowLength; j > 0; j--) { if (lastColumn == i) { isStartFillingNewMatrix = true; } if (lastRowLength == j && remainderRowFilling != 0 && isStartFillingNewMatrix == true) { newMatrix.MatrixValue[newColumnLength, newRowLength] = matrix.MatrixValue[i - 1, j - 1]; remainderRowFilling -= 1; newRowLength--; lastRowLength--; } } lastColumn--; newColumnLength--; lastRowLength = lastRow; isStartFillingNewMatrix = false; if (newColumnLength < 0) { break; } } Console.WriteLine(); newColumnLength = newMatrix.MatrixValue.GetLength(0); // длина колонки новой матрицы. newRowLength = newMatrix.MatrixValue.GetLength(1); // длина строки новой матрицы. for (int i = 0; i < newColumnLength; i++) { for (int j = 0; j < newRowLength; j++) { Console.Write($" {newMatrix.MatrixValue[i, j]}"); } Console.WriteLine(); } Console.WriteLine(); switch (order) { case 1: result = newMatrix.MatrixValue[0, 0]; break; case 2: result = squareMatrix.FindDeterminantOfTheSecondOrder(newMatrix); // Вычисление определителя матрицы 2-ого порядка. break; case 3: result = squareMatrix.FindDeterminantOfTheThirdOrder(newMatrix); // Вычисление определителя матрицы 3-ого порядка. break; default: break; } return(result); }
/// <summary> /// Метод Крамера. /// </summary> /// <returns> Матрица не известных значений. </returns> public Matrix MethodOfKramer(AugmentedMatrix augmentedMatrix) { Console.WriteLine(); Console.WriteLine("Метод Крамера"); Console.WriteLine(); SquareMatrix squareMatrix = new SquareMatrix(); MatrixEquationSystems matrixEquationSystems = new MatrixEquationSystems(); var columnLengthAugmentedValue = AugmentedValue.GetLength(0); // длина колонки матрицы. var rowLengthAugmentedValue = AugmentedValue.GetLength(1); // длина строки матрицы. var columnLength = Matrix.MatrixValue.GetLength(0); // длина колонки матрицы. var rowLength = Matrix.MatrixValue.GetLength(1); // длина строки матрицы. var matrixResult = new Matrix(new double[columnLengthAugmentedValue, rowLengthAugmentedValue]); // Матрица с результатом. var newAugmentedMatrix = matrixEquationSystems.SaveAugmentedMatrix(augmentedMatrix); var determinant = squareMatrix.FindDeterminant(Matrix); if (determinant != 0 && columnLength == rowLength) { var iterator = 0; var systemDeterminant = 0.0; while (true) { var newMatrix = new Matrix(new double[columnLength, rowLength]); // Измененая матрица. for (int i = 0; i < columnLength; i++) { for (int j = 0; j < rowLength; j++) { if (j == iterator) { newMatrix.MatrixValue[i, j] = newAugmentedMatrix.AugmentedValue[i, 0]; } else { newMatrix.MatrixValue[i, j] = newAugmentedMatrix.Matrix.MatrixValue[i, j]; } } } systemDeterminant = squareMatrix.FindDeterminant(newMatrix); matrixResult.MatrixValue[iterator, 0] = systemDeterminant / determinant; Console.WriteLine(); Console.WriteLine($"X {iterator + 1} = {matrixResult.MatrixValue[iterator, 0]}"); Console.WriteLine(); iterator++; augmentedMatrix = newAugmentedMatrix; if (iterator == columnLengthAugmentedValue) { break; } } } else { Console.WriteLine("Через метод Крамера решения нет"); } return(matrixResult); }