2016-02-29 60 views
1

我试图分裂DFT矩阵的乘法中实部和虚部差异对复数numpy的

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 

我想是W1和Wxme给出相同的值但他们根本没有。我缩小了该bug多一点:

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 

我在想什么?

+0

'1 + -j - 1 + j = 0' – hpaulj

回答

4

由于舍入误差,这些结果是相等的。由于诸如不同求和次序或用于表示中间结果的不同精度水平等因素,结果具有稍微不同的舍入误差。

+0

你是说这两个'''Wx = W.dot(x)''' '''Wxme = np.real(W).dot x)+ np.imag(W).dot(x)* j.0'''是否相同直至舍入误差?因为情节真的说其他的智慧就像它真的感觉我的数学有一个错误,或者有一个重大的错误。如果有帮助,我可以附上阴谋。 –

+0

@FranciscoVargas - 试试这个:'1.83697020e-16 + 1.00000000e + 00 + 6.12323400e-17 + -1.00000000e + 00'(我只是改变了加法的顺序)。最大的问题是'1.0'和'-1.0' ...当你开始添加大约16个数量级的数字时,舍入误差可能非常重要。 – mgilson

+0

所以我无法做到我的分裂?为了在我的项目上进一步简化计算,我需要一个Wxme的变体 –