【问题标题】:Numerical differences in NumPy conjugate and angleNumPy 共轭和角度的数值差异
【发布时间】:2021-09-14 11:13:48
【问题描述】:

假设使用 Python 和 NumPy (1.20.1) 有两个复数:

a = 5 + 1j*3
a0 = 4 + 1j*2

我想计算相移,也就是两个角度之间的距离。我得到两个略有不同的结果:

>>> np.angle(a*np.conjugate(a0))
0.07677189126977804
>>> np.angle(a) - np.angle(a0)
0.07677189126977807

我想最正确的方法应该是第一种。 在某些情况下差异更大,在其他情况下则没有。

有人知道这种差异的根源吗?

干杯。

编辑 我找到了一个更相关的例子:

>>> a = 41.887609743111966+3.868827773225067j
>>> a0 = -65.06495257694792-0.19335140606773393j
>>> np.angle(a) - np.angle(a0)
3.2307217955357035
>>> np.angle(a*np.conjugate(a0))
-3.0524635116438827

【问题讨论】:

  • 每当您使用计算机和浮点数时,几乎所有地方都会遇到数字不准确的情况。
  • 当然。我很清楚这一点。但是,问题是关于这个错误的起源。谢谢。
  • @NilsWerner 请检查添加的示例。我机器上的差异不可忽略。

标签: python-3.x numpy complex-numbers


【解决方案1】:

第一个例子只是由于浮点计算固有的数值不精确性;以不同的顺序执行这些操作会导致不同的舍入,从而导致它们由(非常轻微)不同的浮点值表示。对于大多数应用程序而言,两者之间的价值差异可以忽略不计。

但是,正如您的第二个示例所示,这两个表达式并不等价。 np.angle 返回一个从 -pi 到 pi 的值,这在角度差大于该值时很重要。当你在两个角度之间取差时,你可以得到一个超出这个范围的值,这就是第一个 sn-p 中发生的情况。结果直接来自np.angle 的第二个 sn-p 必须在 -pi 到 pi 的范围内。这两个结果之间的差异只是 2pi。

因此,如果您想确定两点之间的绝对角度,您可以使用第一个公式。如果你只是想确定 -pi 和 pi 之间的相对相位,你会使用第二个。

【讨论】:

  • 请注意,使用np.fmod 也可以在[0;2pi[ 范围内对结果进行归一化,实际上,我们通过归一化得到相同的结果。
猜你喜欢
  • 2018-04-24
  • 2020-06-05
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
相关资源
最近更新 更多