using System; namespace Science.Mathematics.LinearAlgebra { /// /// For given linear equations, find the complete solution. /// public class LinearEquationGeneral { private Matrix AA; public LinearEquationGeneral(Matrix A, Vector b) { double[,] a = new double[A.SizeOfRow, A.SizeOfColumn+1]; for (int i = 0; i < A.SizeOfRow; i++) { for (int j = 0; j < A.SizeOfColumn; j++) a[i, j] = A[i, j]; a[i, A.SizeOfColumn] = b[i]; } AA = new Matrix(a); } private Vector ps; public Vector ParticularSolution { get { return ps; } } private Matrix nm; public Matrix SpecialSolution { get { return nm; } } private int[] fv; public int[] FreeVariable { get { return fv; } } public void Solve() { FactorizationEAeqR obj = new FactorizationEAeqR(AA); obj.Compute(); int nofpivot = 0; bool[] pivot = new bool[AA.SizeOfColumn]; int[] pivotrow = new int[AA.SizeOfColumn]; for (int i = 0; i < AA.SizeOfRow; i++) for (int j = 0; j < AA.SizeOfColumn; j++) if (Math.Abs(obj.ReducedRowEchelonForm[i, j])> 1.0E-12) { nofpivot++; pivot[j] = true; pivotrow[j] = i; break; } if (pivot[AA.SizeOfColumn - 1]) try { throw new Science.Error(); } catch (Science.Error e) { e.Write("No Solution"); } if (AA.SizeOfColumn - 1 - nofpivot == 0) { Vector[] s = new Vector[1]; s[0] = new Vector(AA.SizeOfColumn - 1); nm = new Matrix(s); } else { Vector[] s = new Vector[AA.SizeOfColumn - 1 - nofpivot]; int nn = 0; for (int j = 0; j < AA.SizeOfColumn - 1; j++) { if (!pivot[j]) { double[] x = new double[AA.SizeOfColumn - 1]; x[j] = 1.0; for (int i = 0; i < AA.SizeOfColumn - 1; i++) { if (pivot[i]) { x[i] = -obj.ReducedRowEchelonForm[pivotrow[i], j]; } } s[nn] = new Vector(x); nn++; } } nm = new Matrix(s); } ps = new Vector(AA.SizeOfColumn - 1); for (int i = 0; i < AA.SizeOfColumn - 1; i++) if(pivot[i]) ps[i] = obj.ReducedRowEchelonForm[pivotrow[i], AA.SizeOfColumn - 1]; fv = new int[AA.SizeOfColumn - 1 - nofpivot]; int cc = 0; for (int i = 0; i < AA.SizeOfColumn - 1; i++) { if (!pivot[i]) { fv[cc] = i; cc++; } } } } }