2012-04-30 4 views
1

J'ai créé une fonction intégrale simple et une fonction DFT que je peux utiliser avec un autre code que j'ai écrit.DFT donne des résultats différents si itéré

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) 

Ce code donne une sortie de 249,028500022 qui est proche de la valeur 250 attendue. Cependant, quand j'itérer la TFD je reçois une valeur tout à fait différente pour la transformation à 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 

La sortie de ce code est: 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

Quelqu'un peut-il me dire ce qui est à l'origine de ce problème? Merci d'avance.

Remarque: À l'heure actuelle, je ne me soucie pas d'utiliser une fonction fft plus efficace. La taille de l'échantillon n'est pas grande, donc cela n'a pas d'importance.

Répondre

1

partialdft fonction modifie x. Voici x après la première boucle:

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

Voici x après que vous appelez la fonction:

>>> 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] 

Pour éviter d'écraser x, faire une copie:

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

n'est pas da variable locale bien que? – user1133383

+0

@ user1133383, 'd' fait référence à une liste - la même liste que vous avez passée à' partialdft'. C'est mutable, donc quand vous le changez dans la fonction, vous le changez partout. Si vous ne voulez pas faire des changements partout, vous devez en faire une copie. – senderle

+0

Pour développer davantage sur ce qui précède, 'd' _is_ est une variable locale, mais cela signifie seulement que lorsque vous affectez une nouvelle valeur à' d' - c'est-à-dire lorsque vous faites 'd' se référer à un nouvel objet - il n'affecte pas les autres variables nommées 'd'. Mais si une autre variable ailleurs dans le programme fait référence au même objet auquel 'd' se réfère, alors les modifications apportées à cet objet auront des effets aux deux endroits. – senderle

Questions connexes