2016-02-29 38 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的變體 –