private LAEAnswer CalculateKramerMethodAsync(out List <LAEVariable> lAEVariables)
        {
            bool systemCompatible = this.CheckLinearAlgebraicEquationSystemCompatibility();

            if (!systemCompatible)
            {
                lAEVariables = null;
                return(LAEAnswer.NoSolutions);
            }

            double matrixDeterminant = MatrixT <double> .GetMatrixDeterminant(this.Matrix);

            ConcurrentBag <LAEVariable> result = new ConcurrentBag <LAEVariable>();

            Parallel.For(0, this.Matrix.Columns, (i) =>
            {
                MatrixT <double> currentMatrix = MatrixT <double> .SubstituteMatrixColumn(this.Matrix, i, this.RightPartEquations);
                double currentDeterminant      = MatrixT <double> .GetMatrixDeterminant(currentMatrix);

                result.Add(new LAEVariable(this.Variables[i].Name, currentDeterminant / matrixDeterminant));
            });

            lAEVariables = result.Cast <LAEVariable>().ToList();
            return(LAEAnswer.OneSolution);
        }
        private LAEAnswer CalculateKramerMethod(out List <LAEVariable> lAEVariables)
        {
            bool systemCompatible = this.CheckLinearAlgebraicEquationSystemCompatibility();

            if (!systemCompatible)
            {
                lAEVariables = null;
                return(LAEAnswer.NoSolutions);
            }

            double matrixDeterminant = MatrixT <double> .GetMatrixDeterminant(this.Matrix);

            List <LAEVariable> result = new List <LAEVariable>();

            for (int i = 0; i < this.Matrix.Columns; i++)
            {
                MatrixT <double> currentMatrix = MatrixT <double> .SubstituteMatrixColumn(this.Matrix, i, this.RightPartEquations);

                double currentDeterminant = MatrixT <double> .GetMatrixDeterminant(currentMatrix);

                result.Add(new LAEVariable(this.Variables[i].Name, currentDeterminant / matrixDeterminant));
            }

            lAEVariables = result;
            return(LAEAnswer.OneSolution);
        }
示例#3
0
        /// <summary>
        /// Method is used to get matrix rang.
        /// </summary>
        /// <param name="matrix">Initial matrix to get its rang.</param>
        /// <returns>Matrix rang.</returns>
        public static int GetRang(MatrixT <T> matrix)
        {
            int rank = 0;
            int q    = 1;

            while (q <= MatrixT <int> .GetMinValue(matrix.Elements.GetLength(0), matrix.Elements.GetLength(1)))
            {
                MatrixT <T> matbv = new MatrixT <T>(q, q);

                for (int i = 0; i < (matrix.Elements.GetLength(0) - (q - 1)); i++)
                {
                    for (int j = 0; j < (matrix.Elements.GetLength(1) - (q - 1)); j++)
                    {
                        for (int k = 0; k < q; k++)
                        {
                            for (int c = 0; c < q; c++)
                            {
                                matbv[k, c] = matrix[i + k, j + c];
                            }
                        }

                        if (MatrixT <T> .GetMatrixDeterminant(matbv) != 0)
                        {
                            rank = q;
                        }
                    }
                }

                q++;
            }

            return(rank);
        }
示例#4
0
        /// <summary>
        /// Method is used to take inversed matrix.
        /// </summary>
        /// <param name="matrix">Initial matrix.</param>
        /// <returns>Inversed matrix.</returns>
        public static MatrixT <T> GetInverseMatrix(MatrixT <T> matrix)
        {
            double determinant = MatrixT <T> .GetMatrixDeterminant(matrix);

            if (determinant != 0)
            {
                MatrixT <T> reversedMatrix = new MatrixT <T>(matrix.Rows, matrix.Columns);

                for (int i = 0; i < matrix.Rows; i++)
                {
                    for (int j = 0; j < matrix.Columns; j++)
                    {
                        MatrixT <T> tempMatrix = MatrixT <T> .GetMinor(matrix, i, j);

                        reversedMatrix[i, j] = (dynamic)Math.Pow(-1.0, i + j + 2) * (dynamic)MatrixT <T> .GetMatrixDeterminant(tempMatrix) / (dynamic)determinant;
                    }
                }

                return(MatrixT <T> .TransponeMatrix(reversedMatrix));
            }

            return(null);
        }
示例#5
0
        /// <summary>
        /// Method is used to take inversed matrix.
        /// </summary>
        /// <param name="matrix">Initial matrix.</param>
        /// <returns>Inversed matrix.</returns>
        public static MatrixT <T> GetInverseMatrix3(MatrixT <T> matrix)
        {
            if (matrix.Columns == matrix.Rows)
            {
                if (MatrixT <T> .GetMatrixDeterminant(matrix) != 0.0)
                {
                    MatrixT <T> matrixCopy = new MatrixT <T>(matrix.Rows, matrix.Columns);

                    for (int i = 0; i < matrix.Rows; i++)
                    {
                        for (int j = 0; j < matrix.Columns; j++)
                        {
                            matrixCopy[i, j] = matrix[i, j];
                        }
                    }

                    MatrixT <T> reverseMatrix = new MatrixT <T>(matrix.Rows, matrix.Columns);
                    MatrixT <T> .SetBaseMatrix(reverseMatrix);

                    for (int k = 0; k < matrix.Rows; k++)
                    {
                        T div = matrixCopy[k, k];
                        for (int m = 0; m < matrix.Columns; m++)
                        {
                            matrixCopy[k, m]    /= (dynamic)div;
                            reverseMatrix[k, m] /= (dynamic)div;
                        }

                        for (int i = k + 1; i < matrix.Rows; i++)
                        {
                            T multi = matrixCopy[i, k];
                            for (int j = 0; j < matrix.Columns; j++)
                            {
                                matrixCopy[i, j]    -= (dynamic)multi * (dynamic)matrixCopy[k, j];
                                reverseMatrix[i, j] -= (dynamic)multi * (dynamic)reverseMatrix[i, j];
                            }
                        }
                    }

                    for (int kk = matrix.Rows - 1; kk > 0; kk--)
                    {
                        matrixCopy[kk, matrix.Columns - 1]    /= (dynamic)matrixCopy[kk, kk];
                        reverseMatrix[kk, matrix.Columns - 1] /= (dynamic)matrixCopy[kk, kk];

                        for (int i = kk - 1; i + 1 > 0; i--)
                        {
                            T multi2 = matrixCopy[i, kk];
                            for (int j = 0; j < matrix.Columns; j++)
                            {
                                matrixCopy[i, j]    -= (dynamic)multi2 * (dynamic)matrixCopy[kk, j];
                                reverseMatrix[i, j] -= (dynamic)multi2 * (dynamic)reverseMatrix[kk, j];
                            }
                        }
                    }

                    return(MatrixT <T> .TransponeMatrix(reverseMatrix));
                }
            }

            return(null);
        }