Saltar al contenido

Cálculo de matriz inversa de Java

Revisamos exhaustivamente cada una de las secciones en nuestro sitio web con el objetivo de mostrarte siempre la información veraz y certera.

Solución:

¿Exponencialmente? No, creo que la inversión de matriz es O (N ^ 3).

Recomendaría usar la descomposición LU para resolver una ecuación matricial. No tienes que resolver el determinante cuando lo usas.

Mejor aún, busca un paquete que te ayude. Me viene a la mente JAMA.

12×12 o 19×19 no son matrices grandes. Es común resolver problemas con decenas o cientos de miles de grados de libertad.

Aquí hay un ejemplo práctico de cómo usar JAMA. Tienes que tener JAMA JAR en tu CLASSPATH cuando compilas y ejecutas:

package linearalgebra;

import Jama.LUDecomposition;
import Jama.Matrix;

public class JamaDemo

    public static void main(String[] args)
    
        double [][] values = 1, 1, 2, 2, 4, -3, 3, 6, -5;  // each array is a row in the matrix
        double [] rhs =  9, 1, 0 ; // rhs vector
        double [] answer =  1, 2, 3 ; // this is the answer that you should get.

        Matrix a = new Matrix(values);
        a.print(10, 2);
        LUDecomposition luDecomposition = new LUDecomposition(a);
        luDecomposition.getL().print(10, 2); // lower matrix
        luDecomposition.getU().print(10, 2); // upper matrix

        Matrix b = new Matrix(rhs, rhs.length);
        Matrix x = luDecomposition.solve(b); // solve Ax = b for the unknown vector x
        x.print(10, 2); // print the solution
        Matrix residual = a.times(x).minus(b); // calculate the residual error
        double rnorm = residual.normInf(); // get the max error (yes, it's very small)
        System.out.println("residual: " + rnorm);
    

Aquí está el mismo problema resuelto usando Apache Commons Math, según la recomendación de quant_dev:

package linearalgebra;

import org.apache.commons.math.linear.Array2DRowRealMatrix;
import org.apache.commons.math.linear.ArrayRealVector;
import org.apache.commons.math.linear.DecompositionSolver;
import org.apache.commons.math.linear.LUDecompositionImpl;
import org.apache.commons.math.linear.RealMatrix;
import org.apache.commons.math.linear.RealVector;

public class LinearAlgebraDemo

    public static void main(String[] args)
    
        double [][] values = 1, 1, 2, 2, 4, -3, 3, 6, -5;
        double [] rhs =  9, 1, 0 ;

        RealMatrix a = new Array2DRowRealMatrix(values);
        System.out.println("a matrix: " + a);
        DecompositionSolver solver = new LUDecompositionImpl(a).getSolver();

        RealVector b = new ArrayRealVector(rhs);
        RealVector x = solver.solve(b);
        System.out.println("solution x: " + x);;
        RealVector residual = a.operate(x).subtract(b);
        double rnorm = residual.getLInfNorm();
        System.out.println("residual: " + rnorm);
    

Adáptelas a su situación.

Recomendaría usar Apache Commons Math 2.0 para esto. JAMA es un proyecto muerto. ACM 2.0 en realidad tomó álgebra lineal de JAMA y la desarrolló aún más.

La biblioteca la4j (Álgebra lineal para Java) admite la inversión de matrices. Aquí está el breve ejemplo:

Matrix a = new Basic2DMatrix(new double[][]
    1.0, 2.0, 3.0 ,
    4.0, 5.0, 6.0 ,
    7.0, 8.0. 9.0 
);

Matrix b = a.invert(Matrices.DEFAULT_INVERTOR); // uses Gaussian Elimination

Reseñas y valoraciones

No se te olvide difundir este escrito si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *