问题标签 [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.
math - 如何实现数值稳定的加权 logaddexp?
什么是数值上最稳定的计算方式:
权重在wx, wy > 0
哪里?
如果没有权重,这个函数可以logaddexp
并且可以在 Python 中使用 NumPy 实现,如下所示:
我应该如何将其推广到加权版本?
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.0
内1.0
。t
通常在 到 的范围0.0
内200.0
。(但在该范围的前半部分拟合度很差。)
这是一个图表,不是很好吗?
好吧,这里有一张图表,它比我用语言更好地解释了这个问题。您可以忽略绿线,它仅显示在运行拟合算法之前给出的初始参数,该算法会更改这些参数。
GNUPlot 拟合结果:
C++ GSL 拟合结果:
仔细检查后,您会发现粉红色和蓝色线条并没有以相当大的余量相互重叠。粉红线是许多人所说的“合身”。相比之下,蓝线并不是特别好。
我已经尝试使误差条(尽管它们对于所有点的大小都相同——它们不是“真正的”误差条,只是人造的)更小——这没有帮助,只会改变每个点的卡方值和相关错误拟合后的参数。
进一步的随机想法:
- 我建的 GSL 错了吗?
- Gnuplot 将数据集拆分为小块,以使加在一起的数字保持大致相同的数量级?(有点像 FFT 的工作原理。)
GSL 拟合输出:
floating-point - Range 给了我别的东西来代替 0,为什么?
我想把一些FrameTicks
与Plot
并得到
所以有小数字而不是零。
使用Table
给出相同的输出:
但是0.25
作为步长值,一切都很好:
如何替换小数并将其设置为零?
precision - 平面上两个三角形的交点
两个三角形的交点要么是空的,要么是 n 边形(n 最多为 6)。
理论上,很容易想出一个算法来计算交叉区域。可以计算所有线段的可能交点,并将它们与三角形角点的点结合起来。
在实践中,存在一些数字问题。如果线段(几乎)平行,它们可能有也可能没有交点,并且其计算可能不精确(通常除以矩阵的行列式,然后近似为零)。
有什么建议可以避免这些数值不稳定性吗?
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,尽管我认为这无关紧要。
干杯,托马斯。
fortran - 如何在 fortran x 中将 nxn 矩阵 A 相乘以获得其功率而不放大舍入误差?
如何在 Fortran x 中将 NxN 矩阵 A 相乘以获得其功率而不放大舍入误差?
double - 在 Java 中添加 3 个数字(或 4 或 N)的最佳方法 - Kahan Sums?
我对这个问题找到了一个完全不同的答案,整个原始问题不再有意义。但是,答案方式很有用,所以我对其进行了一些修改...
我想以数字上最稳定的方式总结三个double
数字,比如a
、b
和。我认为使用Kahan Sum是可行的方法。c
然而,我想到了一个奇怪的想法:这样做有意义吗:
- 首先总结
a
,b
,c
并记住补偿的(绝对值)。 - 然后总结一下
a
,,,c
b
- 如果第二个总和的(的绝对值)补偿较小,则改用这个总和。
- 以类似的方式处理
b
、a
和c
其他数字排列。 - 返回具有最小关联绝对补偿的总和。
这样我会得到一个更“稳定”的三个数字相加吗?或者总和中的数字顺序对总和结束时留下的补偿没有(可用)影响?使用(可用)我的意思是问补偿值本身是否足够稳定以包含我可以使用的信息?
(我使用的是 Java 编程语言,尽管我认为这在这里无关紧要。)
非常感谢,托马斯。
python - 通过递归稳定计算大数量
我有两个量 a 和 b 由递归定义,并通过引用另一个值列表 x = [ x_1, x_2, ... x_N ],这将是程序的输入。该程序将遍历 x 中的所有值并根据以下内容更新 a 和 b:
和起始值
x 中的值不是很大的数字(总是<10),但 N 将是数百个,并且由于所有指数,a 和 b 的最终值将非常大。我担心由于递归的形式,我们不断地将指数大的数字与指数小的数字相乘并将它们相加,这个方案将在数值上变得非常不稳定。
理想情况下,我会计算 log(a) 和 log(b) 来阻止值变得太大。但是由于递归方案是不可能的,除非我计算出更混乱的东西
我在这里关心的数字稳定性是正确的吗?如果是这样,基于日志的方案是否有助于稳定它?
math - 计算指数数的数值问题(来自高斯 PDF)
我有一个由高斯 PDF 生成 的非常小的指数值列表(例如exp(n)
,带有)。n<-300
我想计算它们中的每一个与总和成正比的程度,例如下面的类似 python 的伪代码:
问题是,由于 的值n
都非常小,总和s
有时会为零,我会得到被零除的错误。
我知道我可以做的一件事是向 all 添加一个常量值(比如 300)n
以防止下溢,但在其他情况下会导致上溢。
我该如何解决这个问题?
不知道有没有表达清楚,如有不妥或语法错误,请指正。提前致谢。
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
保证此功能的正确行为?
先感谢您。