如何识别不稳定的浮点计算?


15

在数字中,能够识别不稳定的方案并提高其稳定性非常重要。如何识别不稳定的浮点计算?

我正在做一个非常复杂的仿真,其中许多数值方案一起工作,我正在寻找一种方法来识别其薄弱部分。我正在研究涉及微分方程的物理模型。整个过程的鸟瞰图是:

  1. (初步步骤)收集物理观测P

  2. 确定模拟的初始参数。这使用了一种优化算法,在该算法中,我们进入参数空间并查找参数C,以使某些误差函数E(F(C),P)降至最小,其中F为参数的某些导出量。

  3. C插入仿真引擎。这是EDP的Euler方案,因此,在每个时间步上,我们都会计算驱动动态项(每个项都是一个复杂的函数,可能会受到不稳定性的影响),并向Euler方案提供这些动态项以计算下一个州。这持续了数千个时间点。

  4. 在模拟结束时,我们计算最终状态S的某些函数Proof(S),并将其与从观察到的数量推导出的一些Require(P)进行比较。这不是结果的正式证明,更多是真实性检查。

此外,我看到了一个复杂的操作塔(在Euler方案中,在Proof中,动态项的计算)。并希望识别并修复“不良零件”。

我推测使用精度降低的浮点数的软件实现会放大数值方案的不稳定性,从而简化了不同实现之间的比较。这是调查这个问题的常用技术吗?是否可以使用虚拟机(例如Bochs)来实现此目的而无需更改程序?

为了适当地处理稳定性问题,有时可以将数值过程的典型输入作为目标,因此可以对其进行调整以使其在该输入上效果很好,而在其他有效但不太可能的输入上效果可能不太好。给定典型输入的样本,就有可能窥探一些中间结果并为它们准备统计数据。同样,这是研究稳定性问题的常用技术吗?虚拟机对此有用吗?



@Simon您可能是正确的,但这绝对是一个跨域问题。我猜想能够回答问题的人已经注册了数学和程序员,也没有人注册。。让我们稍等一下,看看这个问题是否在这里找到了答案!
user40989 2013年

1
区间算术?
SK-logic


2
使用欧拉来传播状态并不一定是邪恶的。两者都不是优化,但是您确实必须将问题分解为子任务。数值不稳定性可能是您困扰最小的问题-收敛到一个错误的最大值,并且与ODE / PDE的刚度有关的问题比那还要大。是的,永远不要使用单精度:)
Deer Hunter

Answers:


6

浮点计算稳定性的研究是数值分析的一部分,如果您确实想要一个可靠的结果,那么您确实希望该领域的专业人士可以对所使用的算法进行分析。

有些事情可以帮助实验性地识别不稳定的算法。将舍入设置为不同的模式(上/下/随机)或以不同的精度运行,并检查结果的差异是否太大。回答太多了吗?根本不是那么简单,即使答案是否定的,也不意味着算法是稳定的,只是在您使用的数据集上未检测到算法不稳定。

注释中已提出间隔算术。当我查看它时,即使是最狂热的间隔算术的支持者也承认它可以与为间隔算术设计的算法一起很好地工作,但是在不分析算法并确保没有已知模式无法正常工作的情况下切换到它就不会起作用是有用的(反对者似乎认为,区间算术的先决条件在过于严格以至于没有实际意义的情况下才有用)


3

设计稳定的浮点算法非常简单。那些比我更精通数学的人建议,尽可能使用公认的库,而不是尝试自己动手编写库。该领域的标准参考似乎是:

新泽西州Higham。数值算法的准确性和稳定性。工业和应用数学协会,美国宾夕法尼亚州费城,第二版,2002年。ISBN 0-89871-521-0

由于不了解什么类型的计算,语言等,因此很难给出很多具体答案。这里有一个很好的演讲:http : //introcs.cs.princeton.edu/java/91float/这可能有点基础,但是如果您使用的是Java,那么这是一个很好的介绍。


1

如何识别不稳定的浮点计算?这是调查这个问题的常用技术吗?

我认为除非您需要显示一些错误统计信息,否则您实际上并不需要收集样本。您需要的是“ 数值分析”,它也属于“数值方法”,“数值线性代数”等主题。它们属于计算机科学,因此在cs.stackexchange中也可能会得到一些答案。

无论如何,在一般编程中,只要对浮点的工作原理和基本数值方法有一些基本了解,就很容易发现大多数问题。但是,如今有了128位浮点数,更容易解决更复杂的问题,甚至更少的理由产生错误样本。以下是一些示例问题来说明我的观点:

  1. 使用浮点计算货币值。
  2. 对大数使用浮点数。
  3. 如果可能的话,不要在其他操作之前进行除法。(使值更接近0)。
  4. 计算时间长,无需对错误传播进行特殊处理。

还有一个朴素算法和误差补偿算法的示例,这里是用于计算方差的算法。在该示例中,查看朴素的版本,您可能会觉得在循环中进行计算会带来一些错误,并且没有得到补偿。


感谢您的回答,不过,我正在寻找更详细的信息。我的计算量非常大,想确定其薄弱环节。我相应地编辑了问题。
user40989 2013年

当您说自己的计算量很大并且想识别薄弱部分时,我不确定您的情况如何。数值计算本身就有错误,即使是一个简单的加法运算也是如此。因此,除非您对大型计算进行了误差补偿,否则总体上需要对其进行修复。改善薄弱环节可能不够好。如果您现在是浮点模型的“ε”,则简单的分析将显示随着误差在长时间计算中的传播,误差可能有多大。
imel96

0

您可以使用适当的数据类型(例如连续分数)来避免数值错误。如果需要或想使用浮点运算,则需要应用数字知识来知道错误。


我不想避免数值错误,我想找出计算的哪些部分不稳定。这类似于在优化速度时定位速度瓶颈。所以我想优化精度,因此想找到精度瓶颈。(续分数在这里没有用。)
user40989 2013年

1
@ user40989,那么您绝对需要区间算术。
SK-logic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.