Provides support for linear algebra in the form of {@link org.jscience.mathematics.vector.Matrix matrices} and {@link org.jscience.mathematics.vector.Vector vectors}.

With the {@link org.jscience.mathematics.vector.Matrix Matrix} class, you should be able to resolve linear systems of equations involving any kind of elements such as {@link org.jscience.mathematics.number.Rational Rational}, {@link org.jscience.mathematics.number.ModuloInteger ModuloInteger} (modulo operations), {@link org.jscience.mathematics.number.Complex Complex}, {@link org.jscience.mathematics.function.RationalFunction RationalFunction}, etc. The main requirement being that your element class implements the mathematical {@link org.jscience.mathematics.structure.Field Field} interface.

Most {@link org.jscience.mathematics.number numbers} and even invertible matrices themselves may implement this interface. Non-commutative multiplication is supported which allows for the resolution of systems of equations with invertible matrix coefficients (matrices of matrices).

For classes embedding automatic error calculation (e.g. {@link org.jscience.mathematics.number.Real Real} or {@link org.jscience.physics.amount.Amount Amount}), the error on the solution obtained tells you if can trust that solution or not (e.g. system close to singularity). The following example illustrates this point.

Let's say you have a simple electric circuit composed of 2 resistors in series with a battery. You want to know the voltage (U1, U2) at the nodes of the resistors and the current (I) traversing the circuit.[code] import static org.jscience.physics.units.SI.*; Amount R1 = Amount.valueOf(100, 1, OHM); // 1% precision. Amount R2 = Amount.valueOf(300, 3, OHM); // 1% precision. Amount U0 = Amount.valueOf(28, 0.01, VOLT); // ±0.01 V fluctuation. // Equations: U0 = U1 + U2 |1 1 0 | |U1| |U0| // U1 = R1 * I => |-1 0 R1| * |U2| = |0 | // U2 = R2 * I |0 -1 R2| |I | |0 | // // A * X = B // DenseMatrix> A = DenseMatrix.valueOf(new Amount[][] { { Amount.ONE, Amount.ONE, Amount.valueOf(0, OHM) }, { Amount.ONE.opposite(), Amount.ZERO, R1 }, { Amount.ZERO, Amount.ONE.opposite(), R2 } }); DenseVector> B = DenseVector.valueOf(new Amount[] { U0, Amount.valueOf(0, VOLT), Amount.valueOf(0, VOLT) }); Vector> X = A.solve(B); System.out.println(X); System.out.println(X.get(2).to(MILLI(AMPERE))); > {(7.0 ± 1.6E-1) V, (21.0 ± 1.5E-1) V, (7.0E-2 ± 7.3E-4) V/Ω} > (70.0 ± 7.3E-1) mA [/code] Because the {@link org.jscience.physics.amount.Amount Amount} class guarantees the accuracy/precision of its calculations. As long as the input resistances, voltage stay within their specification range then the current is guaranteed to be (70.0 ± 7.3E-1) mA. When the inputs have no error specified, the error on the result corresponds to calculations numeric errors only (which might increase significantly if the matrix is close to singularity).