16
$\开始组$

这个问题已经被交叉发布到ComputationalScience上。东南方在这里.

在进行计算工作时,我经常会遇到一个单变量函数,它是用积分或微分方程定义的,我想在指定的时间间隔内,以给定的精度(例如,$10^{10}$中的一部分)快速计算(比如每秒数百万次)。例如,函数$$f(\alpha)=\int_{k=0}^\infty\frac{e^{-\alpha^2k^2}}{k+1}\\mathrm{d} k个 $$在间隔期间,最近的一个项目中出现了$\alpha\in(0,10)$。现在碰巧可以用标准的特殊函数(特别是$\operatorname{Ei}(z)$和$\operatorname{erfi}(z)$)来计算这个积分,但假设我们有一个更复杂的函数,但还不知道其计算方法。是否有系统技术我可以申请开发自己的数值例程来评估这些函数吗?

我相信一定有很多技术,因为快速算法似乎基本上适用于所有常见的特殊函数。然而,我要强调的是,我所寻找的技术不应该依赖于具有特定结构的函数(例如,像$\Gamma(n+1)=n\Gamma。理想情况下,这种技术只适用于我遇到的任何(性能足够好的)函数。

你可以想当然地认为我有一些缓慢的将所需函数(例如直接数值积分)计算到任何精度的方法,我愿意用慢速方法做大量的预处理工作,以开发一种快速方法。

$\端组$
7
  • 4
    $\开始组$ 有井函数应允许通过多项式(分段)进行良好的近似。然而,对于所需的精度,这可能具有挑战性。另一方面,周围的算法可能允许您以较低的精度工作有时,例如,要通过二进制搜索求解$f(x)=b$,只要还没有接近,就不需要太高的精度。 $\端组$ 评论 2015年11月23日19:48
  • $\开始组$ @HagenvonEitzen这是真的,但我工作的应用程序通常要求高精度。例如,我上面提到的项目使用$f(\alpha)$计算一些近奇异矩阵$A$的条目。$A$的特征值对条目中的变化非常敏感,因此要求精确到最接近的$10^{-10}$并不是不合理的要求。 $\端组$ 评论 2015年11月24日1:16
  • $\开始组$ 基于我长期以来在实现软件以双精度或更高精度高效评估数学函数方面的专业经验,我怀疑是否有灵丹妙药。实际上,我将大致按以下顺序检查潜在的解决方案:多项式近似,可能与参数转换相结合,以近似“线性化”它们;有理逼近;渐近逼近;递推关系;持续分数膨胀。对于更复杂的功能,通常需要两种不同的方法,并且可能需要几个月的时间才能找到一个好的解决方案。 $\端组$
    – 尼古法
    评论 2015年11月24日7:21
  • $\开始组$ @njuffa我怀疑情况可能是这样的。你能在下面的答案中详细阐述一下潜在解决方案列表吗?我很乐意接受。 $\端组$ 评论 2015年11月24日22:54
  • $\开始组$ 你在这里没有回答的一个重要问题是,你的问题是否有线上线下的方面。例如,您可能需要能够为计算$f(\alpha)$任何$\alpha\in(0,10)$在线,1毫秒内精确到$10^{-10}$。但您有24小时的运行时间可用于离线设置此在线方法。在这种情况下,您可能可以离线构造分段多项式近似值,并在需要在线计算时插入它。这是现代数值问题中的常见情况。 $\端组$
    – 伊恩
    评论 2015年11月24日22:56

1答案1

重置为默认值
23
$\开始组$

不幸的是,没有一种方法能够在大量特殊函数中实现健壮、准确和高性能的实现。通常,输入域的不同部分必须使用两种或两种以上的方法,基本函数的必要研究和实现工作可能需要数周时间,而更高级的超越函数可能需要数月时间。

由于生成高质量的实现需要相当的数学和编程技能,我的第一个建议是尽可能利用现有的数学库。这些可能是商业图书馆,例如NAG数字库RogueWave的IMSL数字库,或开源库,如GNU科学图书馆(GSL)Boost库的数学和数学部分。您还可以在在线存储库中找到相关的源代码,例如Netlib从ACM TOMS收集的算法.

实际上,在现代SIMD增强型处理器上,广泛使用表格已不再可取,(分段)多项式近似通常是最有吸引力的。基于表的方法在高性能处理器体系结构中不受欢迎的原因是,在过去十年中,功能单元的性能(以FLOPS衡量)的增长速度远远快于内存子系统的性能(用GB/秒衡量)。以下论文中的推理与我自己的专业经验相符:

Marat Dukhan和Richard Vuduc,“初等函数的高通量计算方法”。并行处理与应用数学,第86-95页。斯普林格,2014年。(幻灯片)

就性能而言,多项式近似受益于现代处理器硬件(CPU和GPU)中存在的融合乘加运算(FMA)。此操作还有助于减少舍入错误,同时提供一些针对减法消除的保护。为了获得最小的误差和最佳的效率,人们希望使用极小极大近似.

常用工具,如枫树数学软件具有生成这些内容的内置工具。虽然它们生成的近似值在数学意义上是(非常接近)最优的,但它们通常不会考虑系数表示和以有限的浮点精度计算操作所产生的错误。这个索利娅工具通过其fpminimax最大值命令。最后,您可以编写自己的近似代码,它可能基于Remez算法.

对于某些函数,多项式近似并不实用,因为要达到IEEE-754的双精度需要太多的项。在这种情况下,可以从两种策略中选择一种。

第一种策略是使用基本算术和简单的初等函数巧妙地转换输入参数,从而使生成的函数在多项式近似方面“表现良好”。通常,这种变换倾向于“线性化”待逼近的函数。这种方法的一个很好的教学示例是计算电流变液控制在以下论文中:

M.M.Shepherd和J.G.Laframboise,“切比雪夫近似$(1+2x)\exp(x^2)\operatorname{erfc}x$在里面$0\leqsleat x美元<\英菲$".计算数学第36卷,第153号(1981年1月),第249-253页(在线)

第二种方法是使用两个多项式的比值,即有理逼近,例如以Padé近似值。前面提到的工具可以帮助实现这一点;也有大量关于有理逼近的文献发表,一般来说,有理逼近比多项式逼近更难解决。

对于特殊函数(与初等函数相反),简单的多项式和有理逼近通常不准确和/或效率低下。它们需要应用更高级的数学概念,如渐近展开式、递推关系和连分式展开式。即使使用这些方法从数学上解决了问题,也可能存在数值问题,例如,在向前计算连续分数时。毫不奇怪,整本书都是关于某些函数的计算机求值的,例如贝塞尔函数和马修函数。

在下面,我将快速概述有用的文献,从数学基础的涵盖范围开始,转到适用于初等函数和简单特殊函数的方法,例如电流变液控制特加玛最后是针对在性能和精度方面都难以计算的特殊函数的高级方法。显然,这只能触及表面,关于特定功能的许多相关材料可以在个别论文中找到,例如AMS、SIAM、ACM和IEEE的期刊和论文集。

许多文献尚未赶上现代硬件和软件环境,特别是FMA操作和SIMD体系结构的存在。就用于评估数学函数的稳健计算机代码而言,一方面,人们可以希望数学和科学之间,另一方面,计算机科学和计算机工程之间进行更密切的合作。在下面的作品中,马克斯坦和穆勒的作品是这方面最先进的。

Milton Abramowitz和Irene A.Stegun(编辑),“数学函数手册。公式、图形和数学表”。纽约州纽约市:多佛1972(在线版本)

Frank Olver等人(编辑),“NIST数学函数手册”。纽约州纽约市:剑桥大学出版社2010(在线版本)

A.Erdelyi等人,《高等超越功能》,第1-3卷。纽约州纽约市:McGraw-Hill 1955

奥斯卡·佩伦(Oskar Perron),“Die Lehre von den Kettenbrüchen,第三版”,第1+2卷。斯图加特(德国):1954年、1957年


John F.Hart,“计算机近似”。佛罗里达州马拉巴尔:克里格出版社,1978年

William J.Cody和William Waite,《基本功能软件手册》。新泽西州恩格尔伍德克利夫斯:普伦蒂斯·霍尔1980

Peter Markstein,“IA-64和基本函数”。新泽西州上鞍河:普伦蒂斯·霍尔2000

Jean-Michel-Muller,“基本函数.算法和实现第三版”。2016年Birkhä用户

Nelson H.F.Beebe,《数学函数计算手册》。施普林格2017

Jean-Michel-Muller等人,《浮点运算手册》第二版。2018年Birkhä用户


Nico M.Temme,“特殊函数。数学物理经典函数简介”。纽约州纽约市:Wiley 1996

Amparo Gil、Javier Segura和Nico M.Temme,“特殊函数的数值方法”。SIAM 2007年


Frank W.J.Olver,“渐近与特殊函数”。马萨诸塞州纳蒂克:A K Peters 1997

Jet Wimp,“递归关系计算”。马萨诸塞州波士顿:皮特曼1984


A.N.Khovanskii,“连分式及其推广在近似理论中的应用”。格罗宁根(荷兰):1963年诺德霍夫

A.Cuyt等人,《特殊函数连分式手册》。施普林格2008

$\端组$
4
  • 2
    $\开始组$ 真 的。这让我很高兴,至少现在,我坚持纯分析的世界,把烦人的计算留给你们这些了不起的人:) $\端组$
    – 艾伦
    评论 2015年11月25日7:45
  • 2
    $\开始组$ 在许多情况下,这些“讨厌的计算”将从新的角度受益。作为Cleve Moler(以MATLAB闻名)已注意到对于各种特殊函数,我们仍然使用20世纪70年代编写的Fortran代码(原始的或移植的),而数学和计算机体系结构自那时以来都有了进步。 $\端组$
    – 尼古法
    评论 2015年11月25日8:21
  • 1
    $\开始组$ @njuffa回答得很好!特别感谢你的推荐信。我很清楚,这个领域比我最初想象的要深得多。如果我可以问一下,你在哪里工作来获得这个领域的专业经验?我对这种工作感兴趣,如果这里有职业前景,那就更好了。 $\端组$ 评论 2015年11月25日20:48
  • 1
    $\开始组$ 我的学位是计算机科学,但就这个专业而言,我是自学的,可以追溯到20世纪80年代。我研究x86处理器的浮点单元(其中包含一些超越函数的指令),最近我负责一个广泛使用的并行编程环境的标准C/C++数学库。做这类工作的大多数人都是数学家,通常是在提供各种数值和性能库的更大背景下(想想BLAS、LAPACK、FFT、图像和信号处理)。这是一个小领域,没有那么多工作。 $\端组$ 评论 2015年11月25日21:15

你必须登录回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.