CRAN 任务视图:数值数学
本数值数学任务视图列出了 R 包和函数,这些包和函数可用于解决线性代数和分析中的数值问题。它表明 R 是一个可行的计算环境,用于实现和应用数值方法,也适用于统计领域之外。
本任务视图不会涵盖微分方程、优化问题和求解器,或对时间序列进行操作的包和函数,因为所有这些主题都在相应的任务视图中进行了广泛的处理,例如 DifferentialEquations、Optimization 和 TimeSeries。所有这些任务视图共同将提供 R 在数值数学领域中可用的内容的良好选择。HighPerformanceComputing 任务视图及其许多关于并行计算的链接也可能令人感兴趣。
内容
此任务视图旨在提供对该主题的概述。如果缺少某些包或某些数值数学主题需要更详细地处理,请联系维护者,可以通过电子邮件或在上面链接的 GitHub 存储库中提交问题或拉取请求。
数值线性代数
由于统计在很大程度上基于线性代数,因此 R 中存在许多数值线性代数例程,有些是隐式的。显式可用函数的示例包括向量和矩阵运算、矩阵(QR)分解、求解线性方程、特征值/特征向量、奇异值分解或最小二乘逼近。
- 推荐的包 Matrix 提供了用于稠密和稀疏矩阵以及对其进行操作的类和方法,例如 Cholesky 和 Schur 分解、矩阵指数或稀疏矩阵的范数和条件数。
- 推荐的包 MASS 添加了广义(Penrose)逆矩阵和矩阵的零空间。
- expm 计算方阵的指数、对数和平方根,但也计算矩阵的幂或 Frechet 导数。
expm()
优于 Matrix 中同名函数。 - SparseM 提供了用于稀疏矩阵的类和方法,以及用于解决稀疏线性代数中的线性问题和最小二乘问题的类和方法。
- 包 rmumps 为 MUMPS 库提供了一个包装器,用于求解大型线性方程组,应用稀疏直接求解器。
- sanic 支持用于求解(稠密和稀疏)大型线性方程组的例程;提供了来自 Eigen C++ 库的直接和迭代求解器,包括 Cholesky、LU、QR 和 Krylov 子空间方法。
- Rlinsolve 是用于稀疏线性方程组的迭代求解器集合;提供了诸如 Jacobi 或 Gauss-Seidel 之类的平稳迭代求解器,以及非平稳(Krylov 子空间)方法。
- svd 为奇异值分解 (SVD) 和特征值/特征向量计算的最先进实现提供了 R 绑定。包 irlba 将计算大型矩阵的近似奇异值/向量。
- 包 PRIMME 提供了 PRIMME 的接口,PRIMME 是一个用于计算实对称或复厄米矩阵的特征值和特征向量的 C 库。它可以找到最大、最小或内部特征值/奇异值,并应用预处理以加速收敛。
- 包 geigen 计算矩阵对的广义特征值和特征向量以及 QZ(广义 Schur)分解。
- 包 rARPACK 是 ARPACK 库的包装器,通常用于计算少数特征值/特征向量,例如,少数最大特征值。
- 包 RSpectra 提供了 ‘Spectra’ 库的接口,用于大规模特征值分解和 SVD 问题。
- optR 使用线性代数的基本方法(高斯、LU、CGM、Cholesky)来求解线性系统。
- 包 mbend 用于将非正定(对称)矩阵弯曲为正定矩阵,使用加权和非加权方法。
- matrixcalc 包含一个用于矩阵计算、特殊矩阵和矩阵属性测试的函数集合,例如,(半)正定性;主要用于教学和研究目的。
- matlib 包含一个用于教学和学习矩阵线性代数的矩阵函数集合,如多元统计方法中所用;主要用于使用 R 学习矩阵代数思想的教程目的。
- 包 onion 包含用于操作四元数和八元数(实数上的规范除法代数)的例程;四元数可用于处理三维空间中的旋转。
- 包 RcppArmadillo 和 RcppEigen 使得能够集成 C++ 模板库 ‘Armadillo’ 和 ‘Eigen’ 用于线性代数应用程序,这些应用程序是用 C++ 编写的,并使用 Rcpp 集成到 R 中,以提高性能和易用性。
特殊函数
R 中存在许多特殊的数学函数,尤其是对数和指数、三角函数和双曲函数,或贝塞尔函数和伽马函数。贡献包中提供了更多特殊的函数。
- 包 gsl 提供了对“GNU 科学库”的接口,该库包含了许多特殊函数的实现,例如 Airy 和 Bessel 函数、椭圆和指数积分、超几何函数、Lambert 的 W 函数等等。 RcppGSL 使用来自“Rcpp”的概念,提供了一个易于使用的接口,用于在“GSL”数据结构和 R 之间进行交互。
- Airy 和 Bessel 函数(针对实数和复数)也在包 Bessel 中计算,并提供了针对大参数的近似值。
- 包 pracma 包含特殊函数,例如误差函数及其逆函数、不完全伽马函数和复伽马函数、指数积分和对数积分、菲涅耳积分、多伽马函数以及狄利克雷和黎曼 zeta 函数。
- 超几何函数(以及广义超几何函数)在 hypergeo 中计算,包括变换公式和参数的特殊值。
- HypergeoMat 通过 Koev 和 Edelman 算法的 C++ 实现,评估矩阵参数的超几何函数。
- 椭圆函数和模函数在包 elliptic 中可用,例如 Weierstrass P 函数和 Jacobi 的 theta 函数。还有一些工具可以用来可视化复函数。
- jacobi 评估 Jacobi theta 函数和相关函数:Weierstrass 椭圆函数、Weierstrass sigma 函数和 zeta 函数、Klein j 函数、Dedekind eta 函数、lambda 模函数、Jacobi 椭圆函数、Neville theta 函数、Eisenstein 级数。支持变量的复数值。
- Carlson 评估 Carlson 椭圆积分和不完全椭圆积分(带有复参数)。
- 包 expint 封装了来自 GNU 科学库的 C 函数,用于计算指数积分和不完全伽马函数,包括其第一个参数的负值。
- fourierin 使用快速傅里叶变换计算一元和二元函数的傅里叶积分。
- logOfGamma 使用近似值来计算伽马函数在较大值时的自然对数。
- 包 lamW 使用 Rcpp 实现拉姆伯特 W 函数的两个实值分支。
多项式
基本 R 中的函数 polyroot() 基于 Jenkins-Traub 算法确定多项式的所有零点。线性回归函数 lm() 在模型公式中使用 poly()
(使用选项 raw = TRUE
)时可以执行多项式拟合。
- 包 PolynomF(推荐)和 polynom 为操作单变量多项式提供了类似的功能,例如评估多项式(霍纳方案)或查找它们的根。“PolynomF” 生成正交多项式并提供图形显示功能。
- polyMatrix(基于“polynom”)实现了基本矩阵运算,从而为操作多项式矩阵提供了基础设施。
- 包 MonoPoly 使用不同的算法将单变量多项式拟合到给定数据。
- 对于多变量多项式,包 multipol 提供了各种工具来操作和组合这些多个变量的多项式。
- 包 mpoly 简化了对多变量多项式的符号操作,包括对多项式的基本微积分运算。
- mvp 使用“mpoly”包的打印和强制转换方法,能够快速操作符号多变量多项式,但提供了速度改进。
- 包 orthopolynom 包含一组函数来构建正交多项式及其递推关系,其中包括切比雪夫、厄米特和勒让德多项式,以及球面和超球面多项式。
- 包 jack 中提供了杰克多项式、区域多项式和舒尔多项式的符号计算和评估。
- R 包 freealg 中的自由代数处理具有非交换不定元的多个变量多项式。
- 包 spray 为稀疏多维数组提供了功能,这些数组被解释为多变量多项式。
- 包 qspray 提供了具有有理系数的多变量多项式的符号计算和评估,以及一些格罗布纳基计算。
- 包 minimaxApprox 实现了 Remez(1962)的多项式极小极大逼近算法和 Cody 等人(1968)的有理极小极大逼近算法。
微分和积分
D()
和 deriv()
在基础 R 中用于符号计算简单表达式的导数。函数 integrate()
实现了一种在 R 中数值积分单变量函数的方法。它应用自适应 Gauss-Kronrod 求积法,并在一定程度上可以处理奇点和无界域。
- 包 Deriv 提供了 R 中符号微分的扩展解决方案;用户可以添加自定义导数规则,函数的输出将再次成为可执行函数。
- numDeriv 为 R 中的数值微分设定了标准,提供了数值梯度、雅可比矩阵和海森矩阵,这些矩阵通过简单的有限差分、理查森外推法或高度精确的复步方法计算。
- 包 dual 通过使用对偶数实现自动微分(对于单变量函数);对于数学函数,它返回其值及其精确的一阶导数。
- 包 autodiffr(在 Github 上)为 Julia 包 ForwardDiff.jl 和 ReverseDiff.jl 提供了一个 R 包装器,用于对原生 R 函数进行自动微分。
- pracma 包含用于计算数值导数的函数,包括理查森外推法或复步法。
fderiv()
计算高阶数值导数。 pracma 还包含几个用于数值积分的例程:自适应 Lobatto 求积法、龙贝格积分、牛顿-科特斯公式、克伦肖-柯蒂斯求积规则。integral2()
对二维函数进行积分,也适用于极坐标或具有可变区间限的域。 - cubature 是一个用于在 n 维空间中对超立方体进行自适应多元积分的包,基于 C 库 'cubature',分别用于基于库 'Cuba' 的确定性和蒙特卡罗积分。函数 'cubintegrate()' 包装了所有提供的积分方法。
- 包 gaussquad 包含一组用于执行高斯求积的函数,其中包括切比雪夫、厄米特、拉盖尔和勒让德求积规则,在每种情况下都明确返回节点和权重。函数
gaussquad()
在包 statmod 中执行类似的工作。 - GramQuad 允许基于 Gram 多项式的数值积分。
- 包 fastGHQuad 提供了基于 Rcpp 的 (自适应) 高斯-厄米特求积的快速实现。
- mvQuad 提供了生成可用于多元积分的多元网格的方法。这些网格将基于不同的求积规则,例如牛顿-科特斯或高斯求积公式。
- 包 SparseGrid 提供了另一种在高维空间中进行多元积分的方法。它创建了稀疏的 n 维网格,可以与求积规则一起使用。
- 包 SphericalCubature 使用 cubature 对 n 维空间中的单位球体和球体上的函数进行积分;SimplicialCubature 提供了对 n 维空间中 m 维单纯形上的函数进行积分的方法。这两个包都包含了针对多项式的精确方法。
- 包 polyCub 包含一些用于二维多边形域上的数值积分的例程。
- 包 Pade 计算给定足够长度的泰勒级数系数的帕德逼近的分子和分母系数。
- calculus 提供了用于高维数值和符号微积分的有效函数,包括精确的高阶导数、泰勒级数展开、微分算子和正交坐标系中的蒙特卡罗积分。
- features 从函数数据中提取特征,例如一阶和二阶导数,或临界点的曲率,而 RootsExtremaInflections 查找由离散点定义的曲线的根、极值和拐点。
插值和逼近
基础 R 提供了用于常数和线性插值的函数 approx()
,以及用于三次 (厄米特) 样条插值的 spline()
,而 smooth.spline()
执行三次样条逼近。基础包 splines 在函数 periodicSpline()
中创建周期性插值样条。
- 使用 akima 包可以对不规则间隔的数据进行插值:
aspline()
用于单变量数据,bicubic()
或 interp()
用于二维矩形域上的数据。(此包在 ACM 许可下分发,不可用于商业用途。) - signal 包包含多个用于平滑离散数据的滤波器,特别是
interp1()
用于线性、样条和三次插值,pchip()
用于分段三次 Hermite 插值,以及 sgolay()
用于 Savitzky-Golay 平滑。 - pracma 包在
barylag()
和 barylag2d()
中分别提供了重心 Lagrange 插值(一维和二维),akimaInterp()
中提供了 1 维 akima,以及使用有理函数对数据进行插值和逼近,即在 ratinterp()
和 rationalfit()
中存在奇点。 - interp 包提供了对规则和不规则网格上的双变量数据进行插值,可以使用线性或样条插值。目前已实现分段线性插值部分。(它旨在为 ACM 许可的
akima::interp
和 tripack::tri.mesh
函数提供免费替代方案。) - splines2 包提供了 B 样条、M 样条、I 样条、凸样条(C 样条)、周期样条、自然三次样条、广义 Bernstein 多项式及其积分(除 C 样条外)和导数的基矩阵,这些矩阵由封闭形式的递归公式给出。
- bspline 使用 B 样条来创建插值和平滑一维数据的函数。
fitsmbsp()
可以优化节点位置并施加单调性和正性约束。生成的函数可以使用 dbsp()
进行微分或使用 ibsp()
进行积分。 - tripack 用于对不规则间隔的数据进行三角剖分,是一个受约束的二维 Delaunay 三角剖分包,它提供了不规则间隔数据的三角剖分和 Voronoi 马赛克的生成。
stinepack
包中的 sinterp()
通过应用 Stineman 算法实现了基于分段有理函数的插值。如果指定点的变化是单调的,则插值函数将在该区域内是单调的。schumaker
包中的 Schumaker()
实现了形状保持样条,如果数据是单调的、凹的或凸的,则保证是单调的、凹的或凸的。- ADPF 使用最小二乘多项式回归和统计检验来改进 Savitzky-Golay 平滑。
- conicfit 包提供了多种(几何和代数)算法,用于拟合圆、椭圆和一般圆锥曲线。
求根和不动点
uniroot()
(实现 Brent-Decker 算法)是 R 中用于查找单变量函数根的基本例程。在几个贡献的包中都有二分算法的实现。对于更高精度的根查找,在多精度包 Rmpfr 中有函数 unirootR()
。有关查找单变量和多变量函数根的信息,请参阅以下包
- 包 itp 实现插值、截断、投影 (ITP) 求根算法。用户提供一个单变量 (1 维) 函数和一个区间端点,其中函数值具有不同的符号。
- 包 rootSolve 包含函数
multiroot()
用于查找非线性 (和线性) 方程组的根;它还包含一个扩展 uniroot.all()
,它尝试在区间内找到单变量函数的所有零点(除二次零点外)。 - 为了求解非线性方程组,BB 包提供了
sane()
中的 Barzilai-Borwein 谱方法,包括 dfsane()
中的无导数变体,以及具有敏感性分析的多启动功能。 - 包 nleqslv 使用 Broyden 或 Newton 方法交替求解非线性方程组,并得到诸如线搜索或信任域之类的策略的支持。
- ktsolve 定义了一个通用接口,用于使用
BB
或 nleqslv
求解一组方程。 - FixedPoint 提供了用于查找函数的固定点向量的算法,包括 Anderson 加速、epsilon 外推方法或最小多项式方法。
- 包 daarem 实现 DAAREM 方法,用于加速任何平滑、单调、缓慢的固定点迭代的收敛。
- 包 SQUAREM 和 turboEM 提供了用于加速来自平滑收缩映射(如期望最大化 (EM) 算法)的缓慢、单调序列的收敛的算法。
离散数学和数论
用于计算数论的函数并不多。请注意,双精度整数可以精确地表示到 2^53 - 1
,超过该限制,需要使用多精度包,例如 gmp,见下文。
- 包 numbers 提供了用于因式分解、素数、孪生素数、原根、模逆、扩展 GCD 等的函数。其中包括一些数论函数,如除数函数或欧拉 Phi 函数。
- contfrac 包含用于评估连分数和部分收敛的各种实用程序。 contFracR 将数字转换为连分数,反之亦然。提供了一个用于解佩尔方程的求解器。
- magic 创建并研究魔方和超立方体,包括用于操作和分析任意维数组的函数。
- 包 freegroup 提供了用于操作自由群元素的功能,包括并置、反转、标量乘法、幂运算和 Tietze 形式。
- 该 partitions 包枚举整数的加法划分,包括受限划分和不等划分。
- permutations 将排列视为有限集的可逆函数,并包括对它们的几种数学运算。
- 包 combinat 生成一组元素(即向量)的特定长度的所有排列或所有组合;它还计算二项式系数。
- 包 arrangements 提供排列、组合和划分的生成器和迭代器。迭代器允许用户以快速且内存高效的方式生成排列。排列和组合可以有/没有替换地绘制,并支持多重集。
- 包 set6(在 Github 上)实现了(作为 R6 类)许多形式的数学集合(集合、元组、区间),并允许对它们进行标准运算(并集、积、差等)。
- RcppAlgos 提供灵活的函数,用于生成有或没有约束的向量的组合或排列;扩展包 RcppBigIntAlgos 具有用于完全分解大整数的二次筛算法。
- 包 Zseq 生成众所周知的整数序列;“gmp”包被用于计算任意大的数字。每个函数在其帮助页面上都有一个指向在线整数序列百科全书(OEIS)中相应条目的超链接。
- 包 primes 提供非常快的(Rcpp)函数,用于识别和生成素数。并且 primefactr 使用素数分解进行计算,例如减少大型阶乘的比率。
多精度和符号计算
- 通过包 gmp 在 R 中可以使用多精度算术,该包与 GMP C 库接口。例如,整数的因式分解、概率素数测试或对大有理数的运算——可以为其求解线性方程组。
- 通过包 Rmpfr 使用 MPFR 和 GMP 库提供多精度浮点运算和函数。包括特殊数字和一些特殊函数,以及用于任意精度求根、积分和优化的例程。
- Brobdingnag 通过保存数字的对数和一个表示其符号的标志来处理非常大的数字。(一个优秀的示例说明了如何使用 S4 方法来实现这一点。)
- VeryLargeIntegers 实现了一个多精度库,允许存储和管理任意大的整数;它包括概率素数测试和因式分解算法。
- bignum 是一个用于任意精度整数和浮点数的包,精度为 50 位小数。该包利用了“Boost.Multiprecision” C++ 库,专门设计用于与“tidyverse” R 包集合一起使用。
- 包 Ryacas 连接了计算机代数系统“Yacas”;它支持微积分和线性代数中的符号和任意精度计算。
- 包 caracas(基于“reticulate”)访问符号代数系统“SymPy”;支持线性代数和微积分中的符号运算,例如特征值、导数、积分、极限等,计算特殊函数或求解方程组。
- 包 symengine 提供了对“SymEngine”的接口,这是一个用于快速符号计算的 C++ 库,例如操作数学表达式、查找精确导数、执行符号矩阵计算或求解常微分方程(数值地)。
- 包 rim 提供了对免费且强大的计算机代数系统 Maxima 的接口。结果可以输出为 LaTeX 或 MathML,并且 2D 和 3D 图形将直接显示。Maxima 代码块可以包含在“RMarkdown”文档中。
- 包 m2r 提供了对 Macauley2 的持久接口,这是一个扩展的软件程序,支持代数几何和交换代数的研究。Macauley2 必须独立安装,否则将在云中实例化一个 Macaulay2 进程。
- clifford 提供了一套用于任意维克利福德代数的例程,并讨论了洛伦兹变换或四元数乘法等特殊情况。
- 包 weyl 提供了维尔代数的功能,它在量子力学中有着应用。
- 包 jordan 提供了用于处理约旦代数的功能,约旦代数是满足约旦恒等式 (xy)xx = x(yxx) 的交换但非结合代数。
Python 和 SAGE 接口
Python 通过其模块“NumPy”、“SciPy”、“Matplotlib”、“SymPy”和“pandas”,提供了完善且高效的数值和图形工具。
- reticulate 是 R 与 Python 模块、类和函数的接口。在 R 中调用 Python 时,数据类型会自动转换为等效的 Python 类型;当值从 Python 返回到 R 时,它们会转换回 R 类型。这个来自 RStudio 团队的包是 R 调用 Python 的一种标准。
- feather 提供了读取和写入 feather 文件的绑定,feather 文件是一种轻量级二进制数据存储,旨在实现最大速度。这种存储格式也可以在 Python、Julia 或 Scala 中访问。
- ‘pyRserve’ 是一个 Python 模块,用于将 Python 连接到运行 Rserve 作为 RPC 网关的 R 进程。此 R 进程可以在远程机器上运行,变量访问和函数调用将通过网络委托。
- XRPython(和 ‘XRJulia’)基于 John Chambers 的 XR 包及其“扩展 R”一书,允许 R 与 Python 或 Julia 进行结构化集成。
SageMath 是一个基于 Python 的开源数学系统,允许运行 R 函数,但也提供对 Maxima、GAP、FLINT 和许多其他数学程序等系统的访问。SageMath 可以通过 CoCalc 上的 Web 界面免费使用。
MATLAB Octave Julia 和其他接口
当解决复杂的数值问题时,与数值计算软件(如 MATLAB(商业)或 Octave(免费))的接口将非常重要。不幸的是,目前还没有包允许从 R 内部调用 Octave 函数。
- matlab 模拟包包含大约 30 个简单函数,复制 MATLAB 函数,使用相应的 MATLAB 名称,并用纯 R 实现。
- 包 rmatio 和 R.matlab 提供了用于读取和写入 MAT 文件(MATLAB 数据格式)的工具,适用于版本 4 和 5。‘R.matlab’ 还支持与 MATLAB v6 进程的单向接口,通过 TCP 连接发送和检索对象。
Julia 是一种“用于数值计算的高级、高性能动态编程语言”,这使得它对 R 中的优化问题和其他要求苛刻的科学计算很有吸引力。
- JuliaCall 提供了 R 和 Julia 之间的无缝集成;用户可以像调用任何 R 函数一样调用 Julia 函数,并且可以在 Julia 环境中调用 R 函数,两者都具有合理的自动类型转换。 Julia Call 笔记 介绍了如何使用 ‘JuliaCall’ 应用 Julia 函数。
- JuliaConnectoR 提供了一个面向功能的接口,用于将 Julia 与 R 集成;导入的 Julia 函数可以作为 R 函数调用;数据结构会自动转换。
- 包 XRJulia 提供了一个从 R 到 Julia 语言中计算的接口,基于 John M. Chambers 在“扩展 R”一书中描述的接口结构。
可以通过“rjava”或“rscala”接口使用 Java 数学函数。然后包 commonsMath 允许调用 Apache Commons Mathematics Library 的 Java JAR 文件,这是一个专门用于数值、优化和微分方程各个方面的库。
请注意,MATLAB、Maple 或 Mathematica 等商业程序具有调用 R 函数的功能。
CRAN 包
核心 | cubature,Matrix,numDeriv,PolynomF. |
常规 | ADPF, akima, arrangements, BB, Bessel, bignum, Brobdingnag, bspline, calculus, caracas, Carlson, clifford, combinat, commonsMath, conicfit, contfrac, contFracR, daarem, Deriv, dual, elliptic, expint, expm, fastGHQuad, feather, features, FixedPoint, fourierin, freealg, freegroup, gaussquad, geigen, gmp, GramQuad, gsl, hypergeo, HypergeoMat, interp, irlba, itp, jack, jacobi, jordan, JuliaCall, JuliaConnectoR, ktsolve, lamW, logOfGamma, m2r, magic, MASS, matlab, matlib, matrixcalc, mbend, minimaxApprox, MonoPoly, mpoly, multipol, mvp, mvQuad, nleqslv, numbers, onion, optR, orthopolynom, Pade, partitions, permutations, polyCub, polyMatrix, polynom, pracma, primefactr, primes, PRIMME, qspray, R.matlab, rARPACK, Rcpp, RcppAlgos, RcppArmadillo, RcppBigIntAlgos, RcppEigen, RcppGSL, reticulate, rim, Rlinsolve, rmatio, Rmpfr, rmumps, RootsExtremaInflections, rootSolve, Rserve, RSpectra, Ryacas, sanic, schumaker, signal, SimplicialCubature, SparseGrid, SparseM, SphericalCubature, splines2, spray, SQUAREM, statmod, stinepack, svd, symengine, tripack, turboEM, VeryLargeIntegers, weyl, XR, XRJulia, XRPython, Zseq. |
相关链接
其他资源