commons-math3

推荐的jar包是commons-math3

  • 看看它有什么上图:(来源于浏览器翻译)

目录

  • 我们先看看它都有些什么功能,我将官网目录翻译为中文复制了过来
  • 以下来源于浏览器翻译,可能有误差!
  1. 概述
    0.1 关于用户指南
    0.2 公地数学中有什么
    0.3 公地数学是如何组织的
    0.4 如何在 commons-math javadoc 中指定接口合约
    0.5 依赖关系
  2. 统计
    1.1 概述
    1.2 描述性统计量
    1.3 频率分布
    1.4 简单回归
    1.5 多元回归
    1.6 排名转换
    1.7 协方差和相关性
    1.8 统计检验
  3. 数据生成
    2.1 概述
    2.2 随机数
    2.3 随机向量
    2.4 随机字符串
    2.5 随机排列、组合、抽样
    2.6 生成"类似"输入文件的数据
    2.7 PRNG可插拔性
  4. 线性代数
    3.1 概述
    3.2 实矩阵
    3.3 实向量
    3.4 求解线性系统
    3.5 特征值/特征向量和奇异值/奇异向量
    3.6 非实数场(复数、分数等)
  5. 数值分析
    4.1 概述
    4.2 错误处理
    4.3 寻根
    4.4 插值
    4.5 集成
    4.6 多项式
    4.7 差异化
  6. 特殊功能
    5.1 概述
    5.2 Erf 函数
    5.3 伽玛函数
    5.4 测试版功能
  7. 公用事业
    6.1 概述
    6.2 双阵列实用程序
    6.3 整数/双哈希映射
    6.4 连续分数
    6.5 二项式系数、阶乘、斯特林数和其他常用数学函数
    6.6 快速数学函数
    6.7 杂项
  8. 复数
    7.1 概述
    7.2 复数
    7.3 复杂的超越函数
    7.4 复杂格式和解析
  9. 概率分布
    8.1 概述
    8.2 分发框架
    8.3 用户定义的分布
  10. 分数
    9.1 概述
    9.2 分数数
    9.3 分数格式和解析
  11. 转换方法
  12. 几何形状
    11.1 概述
    11.2 欧几里得空间
    11.3 n球
    11.4 二进制空间分区
    11.5 地区
  13. 优化
    12.1 概述
    12.2 单变量函数
    12.3 线性规划
    12.4 直接方法
    12.5 一般情况
  14. 曲线拟合
    13.1 概述
    13.2 实现的功能
    13.3 一般情况
  15. 最小二乘法
    14.1 概述
    14.2 最小平方生成器和最小方块工厂
    14.3 模型函数
    14.4 参数验证
    14.5 调谐
    14.6 优化引擎
    14.7 求解
    14.8 示例
  16. 常微分方程积分
    15.1 概述
    15.2 连续输出
    15.3 离散事件处理
    15.4 可用的集成商
    15.5 衍生品
  17. 遗传算法
    16.1 概述
    16.2 GA 框架
    16.3 实现和示例
  18. 过滤器
    17.1 概述
    17.2 卡尔曼滤波器
  19. 机器学习
    18.1 概述
    18.2 聚类算法和距离测量
    18.3 实现
  20. 例外情况
    19.1 概述
    19.2 未选中的异常
    19.3 层次结构
    19.4 功能

pom

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>

使用

线性代数

矩阵相关

先写一个用于输出二维数组的方法:

void print(double[][] arr){
        System.out.println(Arrays.deepToString(arr));
    }

测试矩阵相乘、求逆等

@Test
    public void testRealMatrix(){
        // 创建2*3的矩阵
        double[][] matrixData = { {1d,2d,3d}, {2d,5d,3d}};
        RealMatrix m = MatrixUtils.createRealMatrix(matrixData);

        // 3*2的矩阵
        double[][] matrixData2 = { {1d,2d}, {2d,5d}, {1d, 7d}};
        RealMatrix n = new Array2DRowRealMatrix(matrixData2);

        //相乘
        RealMatrix p = m.multiply(n);
        System.out.println(p.getRowDimension());    // 2
        System.out.println(p.getColumnDimension()); // 2
        print(p.getData());

        // 求逆
        RealMatrix pInverse = new LUDecomposition(p).getSolver().getInverse();
        
        // 检验相乘是否为1
        System.out.println(p.multiply(pInverse));  //1
        
        print(pInverse.getData());
    }

线性方程组

@Test
    public void t1(){
         /*
         求解线性系统
         2x + 3y - 2z = 1
         -x + 7y + 6x = -2
         4x - 3y - 5z = 1
         */
        //首先分解系数矩阵 A(在本例中使用 LU 分解)并构建求解器
        RealMatrix coefficients = 
                new Array2DRowRealMatrix(new double[][] { { 2, 3, -2 }, { -1, 7, 6 }, { 4, -3, -5 } },
                        false);
        DecompositionSolver solver = new LUDecomposition(coefficients).getSolver();

        //接下来创建一个数组来表示常量向量 B 并用于求解系统RealVector.solve(RealVector)
        RealVector constants = new ArrayRealVector(new double[] { 1, -2, 1 }, false);
        RealVector solution = solver.solve(constants);
        // 获取结果
        for (int i = 0; i < 3; i++) {
            System.out.println(solution.getEntry(i));
        }
    }