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).
|