Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Biblioteca Matemática avanzada para java

Biblioteca Matemática avanzada para java

Autor jc mouse miércoles, noviembre 7, 2018

Java cuenta con la clase java.lang.Math  la cual contiene métodos para realizar operaciones numéricas básicas como las funciones exponencial elemental, logaritmo, raíz cuadrada y trigonométrica, pero estos métodos no son suficientes si queremos desarrollar aplicaciones matemáticas más complejas, es aquí donde entra la biblioteca Apache Commons Math la cual es la biblioteca matemática más completa de código abierto para el lenguaje java.

commons math

Apache Commons Math se encuentra en la versión 3.6.1, puedes descargar los binarios (21MB) y fuentes (5MB) desde su web en Apache Commons , también cuenta con una documentación extensa (en ingles)

Entre sus muchas clases podemos mencionar:

  • Geometria. El paquete de geometría proporciona clases útiles para muchas simulaciones físicas en espacios euclidianos, como vectores y rotaciones en 3D, así como en la esfera. También proporciona una implementación general de árboles de partición de espacio binario (árboles BSP).
  • Álgebra Lineal. El soporte de álgebra lineal proporciona operaciones en matrices reales (se admiten matrices densas y dispersas) y vectores. Presenta operaciones básicas (multiplicación, suma, resta,transposición, etc ) y algoritmos de descomposición que se pueden usar para resolver sistemas lineales en sentido exacto y en sentido de mínimos cuadrados.
  • Fracciones. El paquetes de fracciones proporcionan un tipo de número de fracción, así como un formato de número de fracción (0.5 = 1/2)
  • Números complejos. El paquetes proporcionan un tipo de número complejo, así como versiones complejas de funciones trascendentales comunes y un formato de número complejo.
  • Generación de datos. Proporciona utilidades para generar aleatoriamente  números, vectores y cadenas. Generación de datos para distribuciones de frecuencia agrupadas o histogramas. Estas utilidades se basan en una “fuente de aleatoriedad” subyacente, que en la mayoría de los casos es un generador de números pseudoaleatorios (PRNG) que produce secuencias de números que se distribuyen uniformemente dentro de su rango. Commons Math depende de Commons Rng para las implementaciones de PRNG.
  • Maquinas de aprendizaje. El soporte de aprendizaje automático en commons-math actualmente proporciona operaciones para agrupar conjuntos de datos basados en una medida de distancia. Cuenta con los algoritmos  de agrupamiento y medidas de distancia KMeans++, Fuzzy-KMeans, DBSCAN, Multi-KMeans++.

Operaciones básicas con matrices

Si tenemos las siguientes matrices

javamatrix

El código para desarrollar el producto, suma y resta es:

        double[][] matrixData = {{1d, 2d, 3d},
        {4d, 5d, 6d},
        {7d, 8d, 9d}};
        RealMatrix m = MatrixUtils.createRealMatrix(matrixData);

        double[][] matrixData2 = {{9d, 8d, 7d},
        {6d, 5d, 4d},
        {3d, 2d, 1d}
        };
        RealMatrix n = new Array2DRowRealMatrix(matrixData2);

        //Multiplicacion de matrices
        RealMatrix producto = m.multiply(n);
        imprimirMatrix("Multiplicacion de matrices", producto);

        //Suma de matrices
        RealMatrix suma = m.add(n);
        imprimirMatrix("Suma de matrices", suma);

        //resta de matrices
        RealMatrix resta = m.subtract(n);
        imprimirMatrix("Resta de matrices", resta);

Y la transpuesta de la primera matriz

        //transposición de matrices
        RealMatrix tr = m.transpose();
        imprimirMatrix("transposición de matrices", tr);

Resolución de ecuaciones lineales

Si tenemos el siguiente sistema de ecuaciones

ecuaciones resolución

Podemos solucionarlo de la siguiente forma:

        RealMatrix coefficients
                = new Array2DRowRealMatrix(new double[][]{
                    {2, 3, -2}, 
                    {-1, 7, 6}, 
                    {4, -3, -5}},
                false);
        DecompositionSolver solver = new LUDecomposition(coefficients).getSolver();

        RealVector constants = new ArrayRealVector(new double[]{1, -2, 1}, false);
        RealVector solution = solver.solve(constants);
        System.out.println("\nEcuacion Lineal");
        imprimirVector(solution);

Geometría

Dados los siguientes vectores (2,1) (3,2) y (1,3.5) (2.5,3):

vectores

El código para encontrar el punto donde se intersectan es:

        System.out.println("\nInterseccion entre dos vectores");
        Line l1 = new Line(new Vector2D(2, 1), new Vector2D(3, 2), 0);
        Line l2 = new Line(new Vector2D(1, 3.5), new Vector2D(2.5, 3), 0);
        Vector2D intersection = l1.intersection(l2);
        System.out.println("(" +intersection.getX() + " , " + intersection.getY()+")");

El código completo es el siguiente:

import org.apache.commons.math3.fraction.Fraction;
import org.apache.commons.math3.geometry.euclidean.twod.Line;
import org.apache.commons.math3.geometry.euclidean.twod.Vector2D;
import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.ArrayRealVector;
import org.apache.commons.math3.linear.DecompositionSolver;
import org.apache.commons.math3.linear.LUDecomposition;
import org.apache.commons.math3.linear.MatrixUtils;
import org.apache.commons.math3.linear.RealMatrix;
import org.apache.commons.math3.linear.RealVector;
/**
 * @view http://www.jc-mouse.net
 * @author mouse
 */
public class Main {
    
    public static void main(String[] args) {

        /**
         * OPERACIONES CON MATRICES
         */
        double[][] matrixData = {{1d, 2d, 3d},
        {4d, 5d, 6d},
        {7d, 8d, 9d}};
        RealMatrix m = MatrixUtils.createRealMatrix(matrixData);

        double[][] matrixData2 = {{9d, 8d, 7d},
        {6d, 5d, 4d},
        {3d, 2d, 1d}
        };
        RealMatrix n = new Array2DRowRealMatrix(matrixData2);

        //Multiplicacion de matrices
        RealMatrix producto = m.multiply(n);
        imprimirMatrix("Multiplicacion de matrices", producto);

        //Suma de matrices
        RealMatrix suma = m.add(n);
        imprimirMatrix("Suma de matrices", suma);

        //resta de matrices
        RealMatrix resta = m.subtract(n);
        imprimirMatrix("Resta de matrices", resta);

        //transposición de matrices
        RealMatrix tr = m.transpose();
        imprimirMatrix("transposición de matrices", tr);

        /**
         * Resolucion de ecuaciones lineales
         */
        RealMatrix coefficients
                = new Array2DRowRealMatrix(new double[][]{
                    {2, 3, -2}, 
                    {-1, 7, 6}, 
                    {4, -3, -5}},
                false);
        DecompositionSolver solver = new LUDecomposition(coefficients).getSolver();

        RealVector constants = new ArrayRealVector(new double[]{1, -2, 1}, false);
        RealVector solution = solver.solve(constants);
        System.out.println("\nEcuacion Lineal");
        imprimirVector(solution);

        /**
         * Geometria
         */
        System.out.println("\nInterseccion entre dos vectores");
        Line l1 = new Line(new Vector2D(2, 1), new Vector2D(3, 2), 0);
        Line l2 = new Line(new Vector2D(1, 3.5), new Vector2D(2.5, 3), 0);
        Vector2D intersection = l1.intersection(l2);
        System.out.println("(" +intersection.getX() + " , " + intersection.getY()+")");
     
    }

    public static void imprimirVector(RealVector v) {
        for (int r = 0; r < v.getDimension(); r++) {            
            Fraction g = new Fraction(v.getEntry(r));
            System.out.println("| " + g.toString() + " |");
        }
    }

    public static void imprimirMatrix(String titulo, RealMatrix m) {
        System.out.println("\n" + titulo);
        for (int f = 0; f < m.getRowDimension(); f++) {
            for (int c = 0; c < m.getColumnDimension(); c++) {
                if (c == 0) {
                    System.out.print(" | ");
                }
                System.out.print(m.getEntry(f, c));
                if (c < m.getColumnDimension() - 1) {
                    System.out.print(" , ");
                } else {
                    System.out.print(" | ");
                }
            }
            System.out.println();
        }
    }

}

Ejecutando la clase tenemos:

soluciones matematicas

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

El indice TIOBE

El indice TIOBE

El índice TIOBE (TIOBE, The Importance of Being Earnest – “La importancia de ser honesto” – refe...

iFrame Injection – Ocultar código malicioso

iFrame Injection – Ocultar código malicioso

En ocasiones los administradores de sitios web experimentan problemas de lentitud en su carga o en el peor de los casos...

Como se debe crear una pagina de error 404

Como se debe crear una pagina de error 404

¿Qué es una página 404? Una página 404 es la pagina que ve un visitante cuando se produce un error HTTP 404 o Not Found,...

Personalizar JTabbedPane con Netbeans

Personalizar JTabbedPane con Netbeans

Crear una librería swing para java utilizando Netbeans no es nada del otro mundo y la cantidad de código que vayamos a e...

Arrastrar y abrir archivo Excel

Arrastrar y abrir archivo Excel

En este post, crearemos una aplicación java que nos permita arrastrar un archivo excel hacia la aplicación, abrirlo y ca...

Creación de GUI con Matlab GUIDE

Creación de GUI con Matlab GUIDE

En este videotutorial se vera la creación de Interfaces Gráficas de Usuario (GUI) utilizando MatLab GUIDE herramienta vi...

Comparte lo que sabes

Categorias

Últimas entradas

En este post veremos como imprimir secciones de un formulario en java implementando la Interface Printable. La clase que...

En este post aprenderemos lo que es la clonación de objetos en java o lo que es lo mismo, generación de nuevas instancia...

El índice TIOBE (TIOBE, The Importance of Being Earnest – “La importancia de ser honesto” – refe...

SDKMAN! es una herramienta para la administración de versiones paralelas de varios programas de desarrollo de software c...

Android Bolivia

MAUS