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.
n'est pas da variable locale bien que? – user1133383
@ 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
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