1

作成した他のコードで使用できる単純な積分関数と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

このコードの出力は次のとおりです。00.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関数を使用する必要はありません。サンプルサイズは大きくないので問題ありません。

4

1 に答える 1

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[:]
    #...
于 2012-04-30T02:38:39.613 に答える