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

Mapas en HTML5 – Uniendo todo – Parte 6

Mapas en HTML5 – Uniendo todo – Parte 6

Última parte del tutorial “Mapas interactivos HTML5”, vamos uniendo todo todo el código. En la parte 5 de es...

Funciones SQL desde Java

Funciones SQL desde Java

En post anteriores vimos lo que son los procedimientos almacenados y como llamarlos desde java, en este post veremos lo...

Botón Mágico

Botón Mágico

Magic Button, es un botón animado para android bajo licencia del MIT desarrollado por Bloder (Brasil), el proyecto esta...

Formulario de login personalizado

Formulario de login personalizado

Hola, en este oportunidad dejo a disposición un formulario de logueo que se me ocurrió de repente creo inspirado en las...

Como capturar cambios del Slider en JavaFX

Como capturar cambios del Slider en JavaFX

En este tutorial veremos como usar el componente Slider de JavaFX , capturas los cambios que realice el usuario y con es...

Construye tu swing Versus para el mundial 2014

Construye tu swing Versus para el mundial 2014

Para ponerse a tono con el ambiente mundialista de Brasil 2014, en este post construiremos un swing java al que llamarem...

Comparte lo que sabes

Categorias

Últimas entradas

KolibriOS  es un pequeño sistema operativo poderoso, rápido y libre con un núcleo monolítico anticipativo en tiempo real...

Los cursos online se han convertido en algo común en nuestros días y las aplicaciones que hay en la nube para realizar r...

Dia Diagram Editor es un software gratuito de dibujo de código abierto para los sistemas operativos de Windows, Mac OS X...

En ocasiones el limite máximo de importación de base de datos que ofrece PhpMyAdmin (2MB) no es suficiente para lo que q...

Android Bolivia

MAUS