4

为什么会出现以下除零错误?

>>> from uncertainties import ufloat
>>> a = ufloat((0,0))
>>> x = ufloat((0.3,0.017))
>>> a**x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/uncertainties/__init__.py", line 601, in f_with_affine_output
    if arg.derivatives
  File "<string>", line 1, in <lambda>
ZeroDivisionError: 0.0 cannot be raised to a negative power
>>> 0.0**x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/uncertainties/__init__.py", line 601, in f_with_affine_output
    if arg.derivatives
  File "<string>", line 1, in <lambda>
ValueError: math domain error

这两个都不应该返回0.0吗?

4

2 回答 2

3

情况非常微妙:

  1. 一方面,你是对的,两个结果在数学上都应该是 0。

    实际上,行为应该与 Python 的相同:

    >>> 0.**0.3
    0.0
    

    当指数具有不确定性时,结果应该正好为 0(无不确定性),因为 Python 结果始终为 0。

    这种情况a = 0±0很特殊:即使 有不确定性(对于零值或负值,结果未定义 ),a**x为正数为 0 。另一方面,如果, 的值 是未定义的,因为不能取负数的(实数)幂(并且可以是负数,如果它具有非零不确定性)(除非使用复数,这不是不确定性包的目的)。xxxa=0±0.1a**xa

  2. 另一方面,不确定性模块允许用户随时更改数字的不确定性,仍然可以获得正确的结果。这与上面的“理想”数学结果相冲突:如果a = 0±0,则a**x 可能稍后的结果是 undefined;相反,如果a = 0±0.3,结果应该是未定义的,但如果不确定性a后来变为 0,则结​​果应该以某种方式变为 0。

从技术上讲,这一切都归结为这样一个事实,即a**x0 < x < 1 在 a = 0 中定义,但在那里不可微:零不确定性的情况应该有效(函数已定义),但非零不确定性必须产生错误(未定义导数)。这两种情况都必须以某种方式动态处理,因为用户可以即时更改不确定性。

这是一个有趣的情况,所以我会再次考虑不确定性模块是否可以以某种优雅的方式进行修改并适应这个问题。

PS:从版本 2.3.5 开始,不确定性包正确处理问题的情况,更一般地说,所有具有不确定性的数字实际上具有零不确定性的情况(即使相同的数字但具有非零不确定性也会给出通过错误的线性传播产生未定义的错误,就像问题中一样)。

于 2012-04-18T03:36:05.357 回答
0

我认为ZeroDivisionError只要指数小于 1,就会发生这种情况。阻塞的代码部分正试图取导数。我对高中微积分的模糊回忆告诉我, 的导数x ** yy * x ** (y - 1)

也就是说,我同意你的例子评估为 0 是直观的。要么我们的直觉是错误的(就像我的微积分一样糟糕,我不知道真正的数学家和科学家如何希望不确定性起作用,以及那个人写这个包似乎知道他在做什么,加上他包含了很多测试),或者我们确实是对的,他需要添加处理将零(零不确定性)提高到幂的特殊情况。

于 2012-04-17T22:38:36.747 回答