/** * Find the X for which this*X=d * * Taken from @see <a href="http://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm></a>, but modified to * use recursion instead of iteration, and thereby to handle degenerate * cases cleanly. * * @param d * The result (<code>d</code>) in the above equation * @return The <code>X</code> in the above equation */ public Vector solve (Vector d) { if (d.size() != _n) throw new IllegalArgumentException("Attempt to find tri-diagonal solution with improper-sized vector"); double[] x = new double[_n]; solve(d, x, 0, (_n > 0 ? _b[0] : 0), (_n > 1 ? _c[0] : 0), (_n > 0 ? d.coord(0) : 0)); //solve3(d, x, 1, _b[0], _c[0], 0, d.coord(0)); return new Vector(x); }
/** * Find the X for which this*X=d * * Taken from {@linkplain http * ://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm}, but modified to * use recursion instead of iteration, and thereby to handle degenerate * cases cleanly. * * @param d * The result (<code>d</code>) in the above equation * @return The <code>X</code> in the above equation */ public Vector solve (Vector d) { if (d.size() != _n) throw new IllegalArgumentException("Attempt to find tri-diagonal solution with improper-sized vector"); double[] x = new double[_n]; solve(d, x, 0, (_n > 0 ? _b[0] : 0), (_n > 1 ? _c[0] : 0), (_n > 0 ? d.coord(0) : 0)); //solve3(d, x, 1, _b[0], _c[0], 0, d.coord(0)); return new Vector(x); }
Vector Y = getCoordinateVector(Ys, i); Vector K = getCoordinateVector(Ks, i); Vector P1i = M.solve(Y);
Vector Y = getCoordinateVector(Ys, i); Vector K = getCoordinateVector(Ks, i); Vector P1i = M.solve(Y);
@Test public void test1DSolving () { TriDiagonalMatrix M = new TriDiagonalMatrix(0); Vector D = new Vector(0); Vector X = M.solve(D); Assert.assertEquals(new Vector(1), X); D = new Vector(1); X = M.solve(D); Assert.assertEquals(new Vector(Double.NaN), X); M = new TriDiagonalMatrix(1); D = new Vector(0); X = M.solve(D); Assert.assertEquals(new Vector(0), X); D = new Vector(1); X = M.solve(D); Assert.assertEquals(new Vector(1), X); }
3, 4); D = new Vector(4, 7, 17); X = M.solve(D); Assert.assertEquals(vNaN, X); X = M.solve(D); Assert.assertEquals(3, X.size()); Assert.assertFalse(Double.isNaN(X.coord(0))); X0 = new Vector(1, 2, 3); D = M.times(X0); X1 = M.solve(D); Assert.assertEquals(X0, X1); X0 = new Vector(1, 2, 3); D = M.times(X0); X1 = M.solve(D); Assert.assertEquals(X0, X1); X0 = new Vector(1, 2, 3); D = M.times(X0); X1 = M.solve(D); Assert.assertEquals(X0, X1);
X = M.solve(D); Assert.assertEquals(2, X.size()); Assert.assertFalse(Double.isNaN(X.coord(0))); X = M.solve(D); Assert.assertEquals(vNaN, X); X = M.solve(D); Assert.assertEquals(vNaN, X); X = M.solve(D); Assert.assertEquals(vNaN, X); X = M.solve(D); Assert.assertEquals(vNaN, X); X = M.solve(D); Assert.assertEquals(2, X.size()); Assert.assertFalse(Double.isNaN(X.coord(0))); X = M.solve(D); Assert.assertEquals(2, X.size()); Assert.assertEquals(4.0, X.coord(0) + X.coord(1), EPSILON); X = M.solve(D); Assert.assertEquals(2, X.size()); Assert.assertEquals(1.0, X.coord(0) + X.coord(1), EPSILON); X = M.solve(D);