Any ideas on where this stuff can go???
-
+ + /** TODO: Find a home for the following methods in the linear package */ + + /**
+     * <p>Uses back substitution to solve the system</p>
+ * + * <p>coefficients X = constants</p> + * + * <p>coefficients must upper-triangular and constants must be a column + * matrix. The solution is returned as a column matrix.</p> + * + * <p>The number of columns in coefficients determines the length
+     * of the returned solution vector (column matrix).  If constants
+     * has more rows than coefficients has columns, excess rows are ignored.
+     * Similarly, extra (zero) rows in coefficients are ignored</p>
+ * + * @param coefficients upper-triangular coefficients matrix
+     * @param constants column RHS constants matrix
+     * @return solution matrix as a column matrix
+ * + */
+    private static RealMatrix solveUpperTriangular(RealMatrixImpl coefficients,
+            RealMatrixImpl constants) {
+        if (!isUpperTriangular(coefficients, 1E-12)) {
+            throw new IllegalArgumentException(
+                   "Coefficients is not upper-triangular");
+        }
+        if (constants.getColumnDimension() != 1) {
+            throw new IllegalArgumentException(
+                    "Constants not a column matrix.");
+        }
+        int length = coefficients.getColumnDimension();
+        double[][] cons = constants.getDataRef();
+        double[][] coef = coefficients.getDataRef();
+        double x[] = new double[length];
+        for (int i = 0; i < length; i++) {
+            int index = length - 1 - i;
+            double sum = 0;
+            for (int j = index + 1; j < length; j++) {
+                sum += coef[index][j] * x[j];
+            }
+            x[index] = (cons[index][0] - sum) / coef[index][index];
+ } + return new RealMatrixImpl(x);
+    }
+ + /**
+     * <p>Returns true iff m is an upper-triangular matrix.</p>
+ * + * <p>Makes sure all below-diagonal elements are within epsilon of 0.</p> + * + * @param m matrix to check
+     * @param epsilon maximum allowable absolute value for elements below
+     * the main diagonal
+ * + * @return true if m is upper-triangular; false otherwise
+     * @throws NullPointerException if m is null
+     */
+    private static boolean isUpperTriangular(RealMatrixImpl m, double epsilon) 
{
+        double[][] data = m.getDataRef();
+        int nCols = m.getColumnDimension();
+        int nRows = m.getRowDimension();
+        for (int r = 0; r < nRows; r++) {
+            int bound = Math.min(r, nCols);
+            for (int c = 0; c < bound; c++) {
+                if (Math.abs(data[r][c]) > epsilon) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to