コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }