/** * Cubic spline is obtained by solving a linear problem Ax=b where A is a square matrix and x,b are vector * This can be done by LU decomposition * @param doubMat Matrix A * @param doubVec Vector B * @return Solution to the linear equation, x */ protected double[] matrixEqnSolver(double[][] doubMat, double[] doubVec) { LUDecompositionResult result = _luObj.apply(DoubleMatrix.copyOf(doubMat)); double[][] lMat = result.getL().toArray(); double[][] uMat = result.getU().toArray(); DoubleArray doubVecMod = ((DoubleArray) OG_ALGEBRA.multiply(result.getP(), DoubleArray.copyOf(doubVec))); return backSubstitution(uMat, forwardSubstitution(lMat, doubVecMod)); }
DoubleArray vS = luRes.solve(vLambda); return vS;
public void solveRandomNoiseTest() { final MatrixAlgebra ma = new OGMatrixAlgebra(); final double[] y = new double[20]; for (int i = 0; i < 20; i++) { y[i] = Y.get(i) + SIGMA.get(i) * NORMAL.nextRandom(); } final DoubleArray start = DoubleArray.of(0.7, 1.4, 0.2, -0.3); final NonLinearLeastSquare ls = new NonLinearLeastSquare(); final LeastSquareResults res = ls.solve(X, DoubleArray.copyOf(y), SIGMA, PARAM_FUNCTION, PARAM_GRAD, start); final double chiSqDoF = res.getChiSq() / 16; assertTrue(chiSqDoF > 0.25); assertTrue(chiSqDoF < 3.0); final DoubleArray trueValues = DoubleArray.of(1, 1, 0, 0); final DoubleArray delta = (DoubleArray) ma.subtract(res.getFitParameters(), trueValues); final LUDecompositionCommons decmp = new LUDecompositionCommons(); final LUDecompositionResult decmpRes = decmp.apply(res.getCovariance()); final DoubleMatrix invCovariance = decmpRes.solve(DoubleMatrix.identity(4)); double z = ma.getInnerProduct(delta, ma.multiply(invCovariance, delta)); z = Math.sqrt(z); assertTrue(z < 3.0); }
@Test public void testRecoverOrginal() { final DecompositionResult result = LU.apply(A); assertTrue(result instanceof LUDecompositionResult); final LUDecompositionResult lu = (LUDecompositionResult) result; final DoubleMatrix a = (DoubleMatrix) ALGEBRA.multiply(lu.getL(), lu.getU()); checkEquals((DoubleMatrix) ALGEBRA.multiply(lu.getP(), A), a); }
/** * Cubic spline and its node sensitivity are respectively obtained by solving a linear problem Ax=b where A is a square matrix and x,b are vector and AN=L where N,L are matrices * @param doubMat1 The matrix A * @param doubVec The vector b * @param doubMat2 The matrix L * @return The solutions to the linear systems, x,N */ protected DoubleArray[] combinedMatrixEqnSolver(double[][] doubMat1, double[] doubVec, double[][] doubMat2) { int nDataPts = doubVec.length; LUDecompositionResult result = _luObj.apply(DoubleMatrix.copyOf(doubMat1)); double[][] lMat = result.getL().toArray(); double[][] uMat = result.getU().toArray(); DoubleMatrix pMat = result.getP(); DoubleArray doubVecMod = ((DoubleArray) OG_ALGEBRA.multiply(pMat, DoubleArray.copyOf(doubVec))); DoubleMatrix doubMat2Matrix = DoubleMatrix.copyOf(doubMat2); DoubleArray[] res = new DoubleArray[nDataPts + 1]; res[0] = DoubleArray.copyOf(backSubstitution(uMat, forwardSubstitution(lMat, doubVecMod))); for (int i = 0; i < nDataPts; ++i) { DoubleArray doubMat2Colum = doubMat2Matrix.column(i); DoubleArray doubVecMod2 = ((DoubleArray) OG_ALGEBRA.multiply(pMat, doubMat2Colum)); res[i + 1] = DoubleArray.copyOf(backSubstitution(uMat, forwardSubstitution(lMat, doubVecMod2))); } return res; }