1. 概述

日常开发中,我们经常需要处理数学计算,但 Java 标准库的 java.lang.Math 有时显得力不从心。好在 Apache Commons 项目专门填补这些空白,其中 Apache Commons Math 就是最强大的数学工具库。

作为 Java 生态中最大的开源数学库,它提供了丰富的数学函数和实用工具。本文将带你快速掌握这个库的核心功能,重点展示最实用的应用场景。

2. 快速上手

2.1 核心能力

Apache Commons Math 主要包含三大类组件:

  • 数学函数:如误差函数 erf 等特殊函数
  • 数学结构:复数、多项式、向量等抽象表示
  • 算法实现:求根、优化、曲线拟合、几何计算等

2.2 Maven 配置

使用 Maven 只需添加依赖(注意版本号根据实际需求调整):

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-math3</artifactId>
  <version>3.6.1</version>
</dependency>

2.3 包结构概览

库按功能划分为多个包,核心包包括:

包名 功能说明
org.apache.commons.math3.stat 统计计算与统计检验
org.apache.commons.math3.distribution 概率分布实现
org.apache.commons.math3.random 随机数/字符串/数据生成
org.apache.commons.math3.analysis 求根、积分、插值等
org.apache.commons.math3.linear 矩阵运算与线性方程组求解
org.apache.commons.math3.geometry 几何计算(欧氏空间/BSP)
org.apache.commons.math3.optim 函数优化(最大化/最小化)
org.apache.commons.math3.genetics 遗传算法实现
org.apache.commons.math3.ml 机器学习(聚类/神经网络)

⚠️ 注意:optimization 包已废弃,未来版本将移除,请使用 optim

3. 统计、概率与随机数

3.1 统计计算

org.apache.commons.math3.stat 包提供完整的统计工具集。例如计算均值、中位数和标准差:

double[] values = new double[] {65, 51, 16, 11, 6519, 191, 0, 98, 19854, 1, 32};
DescriptiveStatistics stats = new DescriptiveStatistics();
for (double v : values) {
    stats.addValue(v);
}

double mean = stats.getMean();
double median = stats.getPercentile(50);
double stdDev = stats.getStandardDeviation();

该包还支持协方差、相关性计算以及统计检验(通过 TestUtils 类)。

3.2 概率分布

Java 原生的 Math.random() 只能生成均匀分布随机数。当需要复杂分布时,org.apache.commons.math3.distribution 就派上用场了。

生成正态分布随机数(均值=10,标准差=3):

NormalDistribution normal = new NormalDistribution(10, 3);
double randomValue = normal.sample();

还支持计算:

  • 离散分布的概率质量函数 P(X=x)
  • 连续分布的累积分布函数 P(X≤x)

4. 数学分析

4.1 函数求根

求根即寻找函数值为零的点。库内置多种求根算法,例如求解 f(x) = x² - 2 的根:

UnivariateFunction function = v -> Math.pow(v, 2) - 2;
UnivariateSolver solver = new BracketingNthOrderBrentSolver(1.0e-12, 1.0e-8, 5);
double root = solver.solve(100, function, -10.0, 10.0, 0);

💡 踩坑提示:求根是迭代过程,需在精度和性能间权衡

4.2 数值积分

积分计算流程类似求根,以计算 ∫₀¹⁰ x dx 为例:

UnivariateFunction function = v -> v;
UnivariateIntegrator integrator = new SimpsonIntegrator(1.0e-12, 1.0e-8, 1, 32);
double result = integrator.integrate(100, function, 0, 10);

支持多种积分算法(如梯形法、辛普森法等),根据需求选择即可。

5. 线性代数

求解线性方程组 AX=B 是常见需求。库提供矩阵和向量表示,以及多种求解器:

RealMatrix matrix = new Array2DRowRealMatrix(
    new double[][] { {2, 3, -2}, {-1, 7, 6}, {4, -3, -5} },
    false);
RealVector vector = new ArrayRealVector(
    new double[] {1, -2, 1}, 
    false);

DecompositionSolver solver = new LUDecomposition(matrix).getSolver();
RealVector solution = solver.solve(vector);

⚠️ 注意:LU 分解仅适用于方阵,非方阵需使用最小二乘法求解器

6. 几何计算

org.apache.commons.math3.geometry 包按维度划分子包:

  • euclidean.oned/twod/threed:1D/2D/3D 欧氏几何
  • spherical.oned/twod:1D/2D 球面几何

核心类包括:

  • Vector2D / Vector3D:2D/3D 向量
  • Line / Segment:直线和线段

计算两条 2D 直线交点示例:

Line l1 = new Line(new Vector2D(0, 0), new Vector2D(1, 1), 0);
Line l2 = new Line(new Vector2D(0, 1), new Vector2D(1, 1.5), 0);
Vector2D intersection = l1.intersection(l2);

还支持点到直线距离、3D 线段最近点计算等。

7. 优化与机器学习

7.1 函数优化

优化即寻找函数的最小/最大值。核心包:

  • org.apache.commons.math3.optim:当前推荐包
  • org.apache.commons.math3.optimization:已废弃(⚠️ Commons Math 4 将移除)

支持线性和非线性优化算法。

7.2 遗传算法

当确定性算法太慢时,遗传算法能快速找到可接受解。核心组件:

  • GeneticAlgorithm:算法框架
  • Population:种群接口
  • Chromosome:染色体接口

提供标准实现:选择、交叉、变异操作。

7.3 机器学习

库提供两类机器学习工具:

  1. 聚类:基于 K-means 算法,按相似度标记向量
  2. 神经网络:包含网络(Network)和神经元(Neuron)基础实现

💡 虽然功能不如专业框架强大,但适合轻量级需求

8. 实用工具

8.1 FastMath

FastMathjava.lang.Math 的高性能替代品:

// 替换 Math.sin() 提升性能
double result = FastMath.sin(angle);

⚠️ 权衡:速度提升但精度略低于 java.lang.Math

8.2 特殊函数

提供标准库缺失的数学函数:

  • 阶乘:CombinatorialUtils.factorial(10)
  • 最大公约数:ArithmeticUtils.gcd(a, b)
  • 最小公倍数:ArithmeticUtils.lcm(a, b)
  • 误差函数:Erf.erf(x)

8.3 分数与复数

支持分数运算:

Fraction a = new Fraction(1, 3);
Fraction b = new Fraction(2, 5);
Fraction sum = a.add(b);
String str = new FractionFormat().format(sum); // "11/15"

复数运算:

Complex c1 = new Complex(1.0, 3.0);
Complex c2 = new Complex(2.0, 5.0);
Complex power = c1.pow(c2);

9. 总结

Apache Commons Math 是 Java 数学计算的瑞士军刀,本文仅展示了冰山一角。对于更深入的需求(如微分方程、傅里叶变换等),建议查阅官方用户指南

完整示例代码可在 GitHub 获取。下次遇到数学计算需求时,不妨先看看这个库能否帮你少造轮子!


原始标题:Introduction to Apache Commons Math