问题标签 [numerical-stability]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
667 浏览

math - 如何实现数值稳定的加权 logaddexp?

什么是数值上最稳定的计算方式:

权重在wx, wy > 0哪里?

如果没有权重,这个函数可以logaddexp并且可以在 Python 中使用 NumPy 实现,如下所示:

我应该如何将其推广到加权版本?

0 投票
1 回答
1368 浏览

c++ - 带有 GNU 科学库 (GSL) 的 C/C++ 代码为 GNUPlot 提供了不同的结果——可能的浮点不稳定性?

短:

GNUPlot 比我的 GSL 代码更适合我的数据。为什么?

短的:

我现在有点困惑,所以我的问题可能措辞不是特别好......随着我的理解提高,我会编辑这个。

这个问题的原标题是:“g++ Compiling code with either -o1 -o2 or -o3 flags and floating point precision”

我相信我的代码正遭受数值不稳定的困扰。

GNUPlot 比我的 GSL 代码更适合我的数据,这令人惊讶,因为我相信 GNUPlot 也使用 GSL 库?

长:

我编写了一些使用 GNU 科学库 (GSL) 的 C/C++ 代码。我的代码使非线性函数适合非线性数据集。执行此操作的算法可能对浮点运算发生的顺序高度敏感,这是由于数值不准确性的性质导致数值舍入误差的累积。

问题:“这些可能是由使用优化标志之一运行的效果引起的-o1-o2还是-o3?”

部分答案:我关闭了所有-oN标志并重新编译了我的代码,我的结果可能会发生少量变化,即:delta_x / x ~= 1.0e-3. 与 GNUPlot 相比,拟合度仍然很差。

我适合的功能:

我提供这些是为了向您展示正在发生的数字工作。我怀疑其中一些容易出现数值错误。

的典型值Yi将在 至 的范围0.01.0t通常在 到 的范围0.0200.0。(但在该范围的前半部分拟合度很差。)

这是一个图表,不是很好吗?

好吧,这里有一张图表,它比我用语言更好地解释了这个问题。您可以忽略绿线,它仅显示在运行拟合算法之前给出的初始参数,该算法会更改这些参数。

GNUPlot 拟合结果:

C++ GSL 拟合结果:

仔细检查后,您会发现粉红色和蓝色线条并没有以相当大的余量相互重叠。粉红线是许多人所说的“合身”。相比之下,蓝线并不是特别好。

我已经尝试使误差条(尽管它们对于所有点的大小都相同——它们不是“真正的”误差条,只是人造的)更小——这没有帮助,只会改变每个点的卡方值和相关错误拟合后的参数。

图 1

进一步的随机想法:

  • 我建的 GSL 错了吗?
  • Gnuplot 将数据集拆分为小块,以使加在一起的数字保持大致相同的数量级?(有点像 FFT 的工作原理。)

GSL 拟合输出:

0 投票
1 回答
65 浏览

floating-point - Range 给了我别的东西来代替 0,为什么?

我想把一些FrameTicksPlot

并得到

所以有小数字而不是零。

使用Table给出相同的输出:

但是0.25作为步长值,一切都很好:

如何替换小数并将其设置为零?

0 投票
1 回答
169 浏览

precision - 平面上两个三角形的交点

两个三角形的交点要么是空的,要么是 n 边形(n 最多为 6)。

理论上,很容易想出一个算法来计算交叉区域。可以计算所有线段的可能交点,并将它们与三角形角点的点结合起来。

在实践中,存在一些数字问题。如果线段(几乎)平行,它们可能有也可能没有交点,并且其计算可能不精确(通常除以矩阵的行列式,然后近似为零)。

有什么建议可以避免这些数值不稳定性吗?

0 投票
0 回答
425 浏览

quadratic - 从三点计算二次函数系数的数值稳定方法是什么

给定三个点,和,我想计算二次函数 (2 次多项式)的系数a0,a1和, 其中?a2(x0, y0)(x1, y1)(x2, y2)yi = a0 + a1*xi + a2*xi*xi

我尝试了以下两个公式,但输出的精度并没有给我留下深刻的印象

结果确实有点吻合,即,似乎大致+/- 1e-5 * max{ |a0'|, |a1'|, |a2'| }在真实解a0'a1'和的窗口内a2'

有没有更好、数值更稳定的方法来计算系数?

顺便说一句,我正在使用 Java,尽管我认为这无关紧要。

干杯,托马斯。

0 投票
2 回答
326 浏览

fortran - 如何在 fortran x 中将 nxn 矩阵 A 相乘以获得其功率而不放大舍入误差?

如何在 Fortran x 中将 NxN 矩阵 A 相乘以获得其功率而不放大舍入误差?

0 投票
1 回答
591 浏览

double - 在 Java 中添加 3 个数字(或 4 或 N)的最佳方法 - Kahan Sums?

我对这个问题找到了一个完全不同的答案,整个原始问题不再有意义。但是,答案方式很有用,所以我对其进行了一些修改...

我想以数字上稳定的方式总结三个double数字,比如ab和。我认为使用Kahan Sum是可行的方法。c

然而,我想到了一个奇怪的想法:这样做有意义吗:

  1. 首先总结a, b,c并记住补偿的(绝对值)。
  2. 然后总结一下a,,,cb
  3. 如果第二个总和的(的绝对值)补偿较小,则改用这个总和。
  4. 以类似的方式处理bac其他数字排列。
  5. 返回具有最小关联绝对补偿的总和。

这样我会得到一个更“稳定”的三个数字相加吗?或者总和中的数字顺序对总和结束时留下的补偿没有(可用)影响?使用(可用)我的意思是问补偿值本身是否足够稳定以包含我可以使用的信息?

(我使用的是 Java 编程语言,尽管我认为这在这里无关紧要。)

非常感谢,托马斯。

0 投票
2 回答
43 浏览

python - 通过递归稳定计算大数量

我有两个量 a 和 b 由递归定义,并通过引用另一个值列表 x = [ x_1, x_2, ... x_N ],这将是程序的输入。该程序将遍历 x 中的所有值并根据以下内容更新 a 和 b:

和起始值

x 中的值不是很大的数字(总是<10),但 N 将是数百个,并且由于所有指数,a 和 b 的最终值将非常大。我担心由于递归的形式,我们不断地将指数大的数字与指数小的数字相乘并将它们相加,这个方案将在数值上变得非常不稳定。

理想情况下,我会计算 log(a) 和 log(b) 来阻止值变得太大。但是由于递归方案是不可能的,除非我计算出更混乱的东西

我在这里关心的数字稳定性是正确的吗?如果是这样,基于日志的方案是否有助于稳定它?

0 投票
1 回答
594 浏览

math - 计算指数数的数值问题(来自高斯 PDF)

我有一个由高斯 PDF 生成 的非常小的指数值列表(例如exp(n),带有)。n<-300

我想计算它们中的每一个与总和成正比的程度,例如下面的类似 python 的伪代码:

问题是,由于 的值n都非常小,总和s有时会为零,我会得到被零除的错误。

我知道我可以做的一件事是向 all 添加一个常量值(比如 300)n以防止下溢,但在其他情况下会导致上溢。

我该如何解决这个问题?

不知道有没有表达清楚,如有不妥或语法错误,请指正。提前致谢。

0 投票
0 回答
596 浏览

python - scipy.signal.deconvolve 的除数参数有哪些限制以确保数值稳定性?

这是我的问题:我将处理来自系统的数据,我将对脉冲响应有一个很好的了解。在使用 Python 编写一些基本脚本之前,我开始了解 scipy.signal.convolve 和 scipy.signal.deconvolve 函数。为了对我的最终解决方案有信心,我想了解他们的要求和限制。

我使用了以下测试:
1. 我建立了一个由两个高斯组成的基本信号。
2. 我建立了一个高斯脉冲响应。
3. 我将我的初始信号与这个脉冲响应进行卷积。
4. 我对这个卷积信号进行了反卷积。
5. 我将最后一个信号与我最初的信号进行了比较。
这个测试的结果很大程度上取决于我如何定义我的脉冲响应:要么我设法恢复了我的初始信号,要么去卷积的信号强烈发散。

这是代码:
我使用 python 3.4.2、numpy 1.8.2 和 scipy 0.14.0。

在前面的代码中,scipy.signal.deconvolve 的除数参数是 y_ir。我使用了定义 y_ir 的间隔的参数,例如 [low, up, step]。为了向您展示让我感到困惑的事情,让我们采用以下三个集合:
1) [-5, 5, 0.1]
2) [-2, 2, 0.1]
3) 和[-2, 2, 0.5](注意在 y_os 的定义中 step 没有改变)。

下图显示了上述三组的原始信号以及去卷积信号。
原始信号
去卷积信号的比较

谁能解释这种行为?是否有任何要求divisor保证此功能的正确行为?

先感谢您。