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); }
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."); } }