问题描述
我正在进行错误分析,我想知道是否有一个良好的经验法则可以决定何时停止将术语加到无穷大或将术语乘以无穷大。在阅读了很多数字代码之后,到目前为止,我得出的内容如下。
对于无限总和,我们应该在下一项接近0时停止。如果我们的目标总和大约为1,则机器epsilon将表示下一项何时太小而无法做出贡献。因此,我们的机器epsilon乘以我们当前的运行总数将大致正确,以表明该术语何时过小。 (我还看到了一种变体,其中将机器epsilon与下一个项相除以运行总数。)
如果贡献项可以是负数,则需要在正确的位置添加绝对值括号,但否则我认为单尾测试没有两尾变体。
对于无限乘积,我们应该在下一项接近1时停止。如果我们的目标乘积也接近1,则机器epsilon的平方根(大于epsilon本身)将指示何时我们的乘积。错误可以忽略不计。因此,我们可以根据运行总数来缩放机器epsilon的平方根,以查看下一项是否太小。
像以前一样,如果贡献项可以低于1,那么我们只需要对符号和绝对值更加小心即可。
我走对了吗?有更好的方法可以做到这一点吗?感谢您的阅读。
解决方法
对于SUM,随着项的幅值减小,当下一项小于当前总和的“最后一个单位”时停止。
要获得稍微准确的SUM,请不要加上 first 一词;最后添加它。累积剩下的东西之后。
对于MULTIPLY,这些术语会精确地变为1.0吗?如果是这样,那将是一个简单的停止点。
在两种情况下,总和或乘积不更改累加值时,您都可以停止。
您对“目标总数约为1”的评论过大;我上面所说的放宽了这一要求。但是-当心下溢/溢出。希望您“知道”结果和中间和不会接近无穷大或另一个极端。
我对“量级”的使用允许振荡级数(例如正弦波)。但是,尽管个别术语波动剧烈,但仍有 do 收敛的序列。它们可能会产生严重的舍入错误-因为中间的总和大于结果。
尤其是,对于评估正弦,首先执行“范围缩小”以将问题映射到[-pi/4,+pi/4]
的范围内(对于许多触发函数)。这使得x - x^3/3! + ...
非常稳定。在不减小范围的情况下,这些术语会以较大的x
值振荡。 (注意:范围缩小还会使正弦变为余弦和/或改变结果的符号。)
当心这个“简单”系列:1 + 1/2 + 1/3 + 1/4 + 1/5 + ...
您想讨论一个特定的系列吗?