Package mikera.matrixx.solve

Source Code of mikera.matrixx.solve.Linear

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

}
TOP

Related Classes of mikera.matrixx.solve.Linear

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.