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 https://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

Mozilla presenta Pyodide

Mozilla presenta Pyodide

Pyodide es un proyecto experimental de Mozilla  que proporciona un intérprete de Python que se ejecuta completamente en...

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

WebServices – El Cliente

WebServices – El Cliente

En un tutorial anterior se creo un WebServices [Java WebServices] utilizando java y Netbeans, en esta ocasión se da cont...

Uso y creación de archivos 9-Patch

Uso y creación de archivos 9-Patch

Antes de la aparición de los celulares inteligentes y de las grandes mejoras tecnológicas que trajeron con ellas, las ap...

Videojuego educativo contra el Ciberbullying

Videojuego educativo contra el Ciberbullying

¿Que es el Ciberbullying? Ciberbullying es la unión de dos palabras en inglés cyber + bullying, en español lo conocemos...

Hermes: El Motor de código abierto JavaScript de Facebook

Hermes: El Motor de código abierto JavaScript de Facebook

En la convención de Chain React  en Portland (Oregon), Marc Horowitz ingeniero de software en Facebook presentó el motor...

Comparte lo que sabes

Categorias

Últimas entradas

Las empresas GeoSystems e Inteligencia Geoespacial (Igeo) en coordinación con el Gobierno Nacional de Bolivia,  desarrol...

¿Sabia que por la pandemia que azota a la mayoría de los países de la Tierra, la mitad de la población estudiantil del m...

El gigante de la tecnología Microsoft ha lanzado un mapa interactivo para proporcionar información sobre la propagación...

El gigante de la informática Google, ante la reciente pandemia mundial declarada por la OMS (Organización Mundial de la...

Herramientas

Generador de Enlaces a Whatsapp