2012-04-30 61 views
1

我創建了一個簡單的積分函數和DFT函數,我可以使用我寫的其他代碼。DFT給出了不同的結果,如果迭代

from math import sin,pi 
from time import time 
def aintegral(d,step): 
    return sum(d)*step 

def partialdft(d,step,w): 
    i = 0 
    x = d 
    while i/step < len(d): 
     x[int(i/step)]*=sin(w*pi*i) 
     i+=step 
    return aintegral(x,step) 


x = [] 
y = 0 
while y<100: 
    x.append(5*sin(4*pi*y)) 
    y+=.01 

print partialdft(x,.01,4) 

此代碼給出了接近預期250值的249.028500022的輸出。然而,當我迭代DFT我得到了一個完全不同的值在4

from math import sin,pi 
from time import time 
def aintegral(d,step): 
    return sum(d)*step 

def partialdft(d,step,w): 
    i = 0 
    x = d 
    while i/step < len(d): 
     x[int(i/step)]*=sin(w*pi*i) 
     i+=step 
    return aintegral(x,step) 


x = [] 
y = 0 
while y<100: 
    x.append(5*sin(4*pi*y)) 
    y+=.01 

y = 0 
while y<10.: 
    print y,partialdft(x,.01,y) 
    y+=.1 

變換輸出這個代碼是: 0 0.0514628731431

0.1 0.0514628731431

0.2 0.0514628731431

。 。 。 。

4.0 0.0514628731431

。 。 。 。

9.8 0.0514628731431

9.9 0.0514628731431

10.0 0.0514628731431

誰能告訴我是什麼原因造成這個問題?提前致謝。

注意:此時我不在乎使用更高效的fft函數。樣本量不大,因此無關緊要。

回答

1

partialdft功能修改x。這裏的x第一循環之後:

>>> x[0:10] 
[0.0, 0.62666616782152129, 1.243449435824274, 1.8406227634233896, 2.4087683705085765, 2.9389262614623659, 3.4227355296434436, 3.852566213878946, 4.2216396275100756, 4.5241352623300983] 

這裏的x調用該函數後:

>>> partialdft(x, 0.01, y) 
0.051462873158853464 
>>> x[0:10] 
[0.0, -2.8072359998573911e-13, 1.114040042207106e-12, -2.4744131119314365e-12, 4.316161702819329e-12, -6.5865746141630883e-12, 9.202604511389696e-12, -1.2082375495190468e-11, 1.5129125329320302e-11, -8.1617793532956823e-23] 

爲了避免覆蓋x,做一個副本:

def partialdft(d,step,w): 
    i = 0 
    x = d[:] 
    #... 
+0

不達局部變量雖然? – user1133383

+0

@ user1133383,'d'指的是一個列表 - 你傳遞給'partialdft'的同樣的列表。它是可變的,所以當你在函數中改變它時,你隨時隨地改變它。如果你不想在任何地方進行更改,你必須製作一份副本。 – senderle

+0

爲了進一步擴展上述內容,'d' _is_是一個局部變量,但這隻意味着當您爲'd'指定一個新值時 - 也就是說,當您導致'd'指向一個新對象時 - 它不會影響名爲'd'的任何其他變量。但是,如果程序中的其他變量引用與'd'引用的對象相同的對象,那麼對該對象的更改將在兩個地方都有效果。 – senderle

相關問題