Пример #1
0
        public static Matrix SolveLUP(Matrix a, Matrix b)
        {
            ConsoleEx.WriteLineGreen();
            ConsoleEx.WriteLineGreen("Solving a system of linear equations Ax=b where:");
            ConsoleEx.WriteLine("A:");
            ConsoleEx.WriteLine(a.ToString());
            ConsoleEx.WriteLine("b:");
            ConsoleEx.WriteLine(b.ToString());

            var aCopy         = a.Copy();
            var decomposition = new LUPDecomposition();

            if (decomposition.Decompose(aCopy))
            {
                var result = Solve(decomposition.L, decomposition.U, decomposition.P * b);

                if (result != null)
                {
                    Console.WriteLine();
                    ConsoleEx.WriteLineGreen("The given system has the following solution:");
                    ConsoleEx.WriteLine("x:");
                    ConsoleEx.WriteLine(result.ToString());
                }
                else
                {
                    ConsoleEx.WriteLineRed("The given system has no solutions.");
                }

                return(result);
            }

            ConsoleEx.WriteLineRed("The given system has no solutions.");

            return(null);
        }
Пример #2
0
        public Matrix ToInverseMatrix()
        {
            if (!IsSquareMatrix())
            {
                throw new ArgumentException("Square matrix required.");
            }

            try
            {
                // Create identity matrix
                Matrix e = Matrix.Identity(_rows);

                // LUP decomposition of A
                var lupDecomposition = new LUPDecomposition();
                lupDecomposition.PrintOutput = false;
                lupDecomposition.Decompose(this.Copy());

                Matrix l = lupDecomposition.L;
                Matrix u = lupDecomposition.U;
                Matrix p = lupDecomposition.P;

                Matrix result = new Matrix(_rows, _cols);

                for (int c = 0; c < result._cols; c++)
                {
                    Matrix y = LinearEquationSolver.SubstituteForward(l, p * e.GetColumn(c));
                    Matrix x = LinearEquationSolver.SubstituteBackward(u, y);
                    result.SetColumn(c, x);
                }

                return(result);
            }
            catch (Exception)
            {
                throw new ArgumentException("Matrix is singular.");
            }
        }