/// <summary>
        /// Метод иследующий СЛАУ и решающий её.
        /// </summary>
        /// <param name="augmentedMatrix"> Расширенная матрица. </param>
        /// <returns> Матрица не известных значений. </returns>
        public Matrix SolvingSystemLinearEquationsByKramerMethod(AugmentedMatrix augmentedMatrix)
        {
            var columnLengthAugmentedValue = augmentedMatrix.AugmentedValue.GetLength(0); // длина колонки матрицы.
            var rowLengthAugmentedValue    = augmentedMatrix.AugmentedValue.GetLength(1); // длина строки матрицы.

            var savedAugmentedMatrix = SaveAugmentedMatrix(augmentedMatrix);

            var matrixResult = new Matrix(new double[columnLengthAugmentedValue, rowLengthAugmentedValue]); // Матрица с результатом.

            switch (StudyOfTheMatrixOnTheConsistency(augmentedMatrix))
            {
            case enumNamesOfTheSystem.Inconsistent:

                Console.WriteLine("Система не совместная");
                break;

            case enumNamesOfTheSystem.UniqueSolution:

                Console.WriteLine("Система имеет 1 решение");
                matrixResult = savedAugmentedMatrix.MethodOfKramer(savedAugmentedMatrix);
                break;

            case enumNamesOfTheSystem.WithoutANumericalSetOfSolutions:

                Console.WriteLine("Система имеет безчисленное множество решений");
                matrixResult = savedAugmentedMatrix.MethodOfKramer(savedAugmentedMatrix);
                break;
            }

            return(matrixResult);
        }
        /// <summary>
        /// Метод сохраняющий Расширенную матрицу.
        /// </summary>
        /// <param name="augmentedMatrix"> Расширенная матрица. </param>
        /// <returns> Расширенная матрица. </returns>
        public AugmentedMatrix SaveAugmentedMatrix(AugmentedMatrix augmentedMatrix)
        {
            var matrixColumnLength = augmentedMatrix.Matrix.MatrixValue.GetLength(0);           // длина колонки матрицы.
            var matrixRowLength    = augmentedMatrix.Matrix.MatrixValue.GetLength(1);           // длина строки матрицы.

            var augmentedMatrixValueColumnLength = augmentedMatrix.AugmentedValue.GetLength(0); // длина колонки матрицы.
            var augmentedMatrixValueRowLength    = augmentedMatrix.AugmentedValue.GetLength(1); // длина строки матрицы.

            var newMatrix = new Matrix(new double[matrixColumnLength, matrixRowLength]);

            var newAugmentedMatrixValue = new Matrix(new double[augmentedMatrixValueColumnLength, augmentedMatrixValueRowLength]);


            for (int i = 0; i < matrixColumnLength; i++)
            {
                for (int j = 0; j < matrixRowLength; j++)
                {
                    newMatrix.MatrixValue[i, j] = augmentedMatrix.Matrix.MatrixValue[i, j];
                }
            }

            for (int i = 0; i < augmentedMatrixValueColumnLength; i++)
            {
                for (int j = 0; j < augmentedMatrixValueRowLength; j++)
                {
                    newAugmentedMatrixValue.MatrixValue[i, j] = augmentedMatrix.AugmentedValue[i, j];
                }
            }

            var AugmentedMatrix = new AugmentedMatrix(newMatrix, newAugmentedMatrixValue);

            return(AugmentedMatrix);
        }
        /// <summary>
        /// Иследование матрицы на совместность по теореме Кронекера-Капелли.
        /// </summary>
        /// <param name="augmentedMatrix"> Расширенная матрица. </param>
        /// <returns> Если матрица совместная. </returns>
        public enumNamesOfTheSystem StudyOfTheMatrixOnTheConsistency(AugmentedMatrix augmentedMatrix)
        {
            enumNamesOfTheSystem isTheSystemOfEquationsCompatible;

            var savedMatrix = SaveAugmentedMatrix(augmentedMatrix);

            var rankMatrix = augmentedMatrix.Matrix.FindRank();

            var rankAugmentedMatrix = augmentedMatrix.AugmentedMatrixValue.FindRank();

            if (rankMatrix == rankAugmentedMatrix)
            {
                if (rankMatrix == augmentedMatrix.Matrix.MatrixValue.GetLength(0))
                {
                    isTheSystemOfEquationsCompatible = enumNamesOfTheSystem.UniqueSolution;
                }
                else
                {
                    isTheSystemOfEquationsCompatible = enumNamesOfTheSystem.WithoutANumericalSetOfSolutions;
                }
            }
            else
            {
                isTheSystemOfEquationsCompatible = enumNamesOfTheSystem.Inconsistent;
            }

            augmentedMatrix = savedMatrix;


            Console.WriteLine();

            Console.WriteLine($"Rank(A) = {rankMatrix}");

            Console.WriteLine();

            Console.WriteLine($"Rank(A|B) = {rankAugmentedMatrix}");

            Console.WriteLine();

            return(isTheSystemOfEquationsCompatible);
        }
        /// <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);
        }