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函數。樣本量不大,因此無關緊要。
不達局部變量雖然? – user1133383
@ user1133383,'d'指的是一個列表 - 你傳遞給'partialdft'的同樣的列表。它是可變的,所以當你在函數中改變它時,你隨時隨地改變它。如果你不想在任何地方進行更改,你必須製作一份副本。 – senderle
爲了進一步擴展上述內容,'d' _is_是一個局部變量,但這隻意味着當您爲'd'指定一個新值時 - 也就是說,當您導致'd'指向一個新對象時 - 它不會影響名爲'd'的任何其他變量。但是,如果程序中的其他變量引用與'd'引用的對象相同的對象,那麼對該對象的更改將在兩個地方都有效果。 – senderle