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

Hola mundo en Netbeans

Hola mundo en Netbeans

De los diferentes IDE’s que existen para crear aplicaciones para android, lamentablemente Netbeans es una de las m...

Cambiar icono de aplicación en IDE Eclipse

Cambiar icono de aplicación en IDE Eclipse

Si tenemos una aplicación android que estemos desarrollando en el IDE Eclipse y queremos cambiar el icono de la aplicaci...

PyExifToolGUI: Interfaz gráfica para ExifTool

PyExifToolGUI: Interfaz gráfica para ExifTool

Hace un tiempo hablamos sobre ExifTool, una pequeña pero potente herramienta para la lectura y  edición de metadatos de...

Crear ayuda HTML para programa con JavaFX Swing

Crear ayuda HTML para programa con JavaFX Swing

En este post veremos como crear una aplicación de ayuda al usuario similar al extinto javahelp. Pero en esta oportunidad...

Duplicando objetos con la Interface Cloneable

Duplicando objetos con la Interface Cloneable

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

Validar etiquetas facebook en standar w3c

Validar etiquetas facebook en standar w3c

Cuando se diseñan paginas web es recomendable hacer uso de standares como una de las buenas practicas de programación, p...

Comparte lo que sabes

Categorias

Últimas entradas

En un post anterior conocimos una herramienta Open Source con un conjunto de herramientas para el trabajo con imágenes e...

ImageMagick es un software de código abierto multiplataforma que contiene una serie de herramientas para leer, mostrar,...

OCR (Optical Character Recognition) en español, Reconociminto Optico de Caracteres, es el proceso por el cual  se extrae...

La misión espacial de la NASA, el Mars  2020 Rover Mission esta proyectada para lanzarse en julio de 2020 y su llegada s...

Android Bolivia

MAUS