package mikera.matrixx.solve; import mikera.matrixx.AMatrix; import mikera.matrixx.solve.impl.lu.LUSolver; import mikera.matrixx.solve.impl.qr.QRHouseColSolver; import mikera.vectorz.AVector; /** * Class providing liner solver algorithms that find the solution to systems of the form: * * A.x = b * * @author Mike * */ public class Linear { /** * * Returns the least squares solution to the equation A.x = b * Use this in the case of over-determined (more equations than unknowns) or * under-determined (more unknowns than equations) * * @param A * @param b * @return AVector x */ public static AVector solveLeastSquares(AMatrix A, AVector b) { QRHouseColSolver solver = new QRHouseColSolver(); solver.setA(A); // create AMatrix from AVector AMatrix B = b.asColumnMatrix(); AMatrix X = solver.solve(B); // convert AMatrix into AVector and return return X.asVector(); } /** * Returns the least squares solution to the equation A.X = B * Use this in the case of over-determined (more equations than unknowns) or * under-determined (more unknowns than equations) * * @param A * @param B * @return AMatrix X */ public static AMatrix solveLeastSquares(AMatrix A, AMatrix B) { QRHouseColSolver solver = new QRHouseColSolver(); solver.setA(A); AMatrix x = solver.solve(B); return x; } /** * A general linear system solver, * Returns the solution to the equation A.x = b, returns null if A is square and * has no unique solution. * * @param A * @param b * @return */ public static AVector solve(AMatrix A, AVector b) { if (A.isSquare()) return solveSquare(A,b); else return solveLeastSquares(A, b); } /** * A general linear system solver, * For a matrix A, returns a matrix whose each column is the * solution to the equation A.x = b, where b is the corresponding column * of B. * Returns null if A is square and equations don't have solutions. * * @param A * @param B * @return */ public static AMatrix solve(AMatrix A, AMatrix B) { if (A.isSquare()) return solveSquare(A,B); else return solveLeastSquares(A, B); } /** * For a square matrix A, returns the solution to the equation A.x = b. * Returns null if equation doesn't have a solution. * * @param A * @param b * @return */ private static AVector solveSquare(AMatrix A, AVector b) { A.checkSquare(); LUSolver solver = new LUSolver(); solver.setA(A); // create AMatrix from AVector AMatrix B = b.asColumnMatrix(); AMatrix X = solver.solve(B); // if no solution if(X == null) return null; return X.asVector(); } /** * For a square matrix A, returns a matrix whose each column is the * solution to the equation A.x = b, where b is the corresponsing column * of B. * Returns null if equations don't have a solution. * * @param A * @param B * @return */ private static AMatrix solveSquare(AMatrix A, AMatrix B) { A.checkSquare(); LUSolver solver = new LUSolver(); solver.setA(A); return solver.solve(B); } }