【问题标题】:Difference between sum and np.sum for complex numbers numpy复数numpy的sum和np.sum之间的区别
【发布时间】:2016-06-12 01:43:51
【问题描述】:

我正在尝试将 dft 矩阵的乘法拆分为实部和虚部

from scipy.linalg import dft
improt numpy as np
# x is always real
x = np.ones(4)
W = dft(4)
Wx = W.dot(x)
Wxme = np.real(W).dot(x) + np.imag(W).dot(x)*1.0j

我希望 Wx 和 Wxme 给出相同的值,但它们根本不是。我已经进一步缩小了错误范围:

In [62]: W[1]
Out[62]: 
array([  1.00000000e+00 +0.00000000e+00j,
         6.12323400e-17 -1.00000000e+00j,
        -1.00000000e+00 -1.22464680e-16j,  -1.83697020e-16 +1.00000000e+00j])

In [63]: np.sum(W[1])
Out[63]: (-2.2204460492503131e-16-1.1102230246251565e-16j)

In [64]: sum(W[1])
Out[64]: (-1.8369701987210297e-16-2.2204460492503131e-16j)

为什么sumnp.sum 给出不同的值?复数的加法不应该只是将实部和虚部分别相加吧??

手动添加给了我预期的结果,而不是 numy 给我的结果:

In [65]: 1.00000000e+00 + 6.12323400e-17 + -1.00000000e+00 + 1.83697020e-16
Out[65]: 1.8369702e-16

我错过了什么??

【问题讨论】:

  • 1 + -j - 1 + j = 0

标签: python numpy scipy fft complex-numbers


【解决方案1】:

在取整误差之前,这些结果是相等的。由于求和顺序不同或用于表示中间结果的精度水平不同等因素,结果的舍入误差略有不同。

【讨论】:

  • 你是说这两个Wx = W.dot(x)Wxme = np.real(W).dot(x) + np.imag(W).dot(x)*j.0 是相同的,直到舍入误差?因为情节真的像其他方面一样,真的感觉要么我的数学有错误,要么有一个重大错误。如果有帮助,我不能附上情节。
  • @FranciscoVargas -- 试试这个:1.83697020e-16 + 1.00000000e+00 + 6.12323400e-17 + -1.00000000e+00(我只是更改了添加的顺序)。最大的问题是 1.0-1.0 ...当您开始添加相差约 16 个数量级的数字时,舍入误差可能非常显着。
  • 所以我没有办法进行拆分吗?为了进一步简化我的项目的计算,我需要Wxme 的变体
猜你喜欢
  • 2013-08-08
  • 2020-10-17
  • 2013-07-04
  • 1970-01-01
  • 2016-11-11
  • 2022-01-04
  • 2012-06-17
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多