2016-05-05 9 views
1

Alles, was ich zu tun versuche, ist die Autokorrelation eines Arrays jx zu berechnen, für die ich die folgende Formel verwenden,Berechnung Autokorrelationsfunktion mit Python

autocorrelation formula

wobei n die Zeit ist, Ich möchte die Autokorrelationsfunktion berechnen, Mt ist die maximale Zeit und tk sind Zeitschritte, die von 1 bis Mt-n laufen.

Dies ist der Code, den ich geschrieben habe. Ich überprüfe mein Programm mit einem einfachen Array jx=linspace(1,10,20). Ich mache auch das Programm die Autokorrelationswerte für verschiedene n speichern und plotten sie mit n.

from numpy import * 
from pylab import* 

jx=linspace(1,10,20) 

Mt=len(jx) 

def Hcacf(n): 
    Sum=0.0 
    coeff1=0 
    while coeff1 < (Mt-n) : 
     Sum = Sum + jx[coeff1]*jx[coeff1+n]# + jy[coeff1]*jy[coeff1+n] 
     coeff1=coeff1+1 
    avg = Sum*1.0/(Mt-n) 
    return avg 

autocorrelation=[] 
for n in linspace(0,Mt-1,Mt): 
    ac=Hcacf(n+1) 
    autocorrelation.append(ac) 

lag=linspace(0,Mt-1,Mt) 
plot(lag,autocorrelation,marker='o') 
show() 

Der Ausgang kehrt, ist dies: enter image description here

Aber es gibt auch die folgende Fehlermesssage:

RuntimeWarning: invalid value encountered in double_scalars 
    avg = Sum*1.0/(Mt-n) 

Wohin gehe ich falsch?

+0

Ich bin völlig neu in der Korrelation. Kann ich es einfacher machen? – kanayamalakar

Antwort

2

Es scheint, dass Sie eine Division durch Null haben. Es funktioniert so:

1) In der Zeile for n in linspace(0,Mt-1,Mt): Sie n==Mt-1 haben,

2) Also, in der nächsten Zeile ac=Hcacf(n+1) Sie die Funktion aufrufen Hcacf(Mt),

3), aber innerhalb dieser Funktion Hcacf Sie habe eine Linie avg = Sum*1.0/(Mt-n). Es ist der Ort, an dem Division durch Null möglich ist.

Um es zu beheben, können Sie den Endpunkt des Intervalls in der ersten Zeile ausschließen. Versuchen Sie, es durch diese Zeile zu ersetzen:

for n in linspace(0, Mt-1, num=Mt, endpoint=False): 
+0

Danke! Es hat jetzt funktioniert !! :) – kanayamalakar

+1

Gern geschehen. Für die Zukunft: Es ist wirklich gefährlich, sich ohne Null-Check zu teilen. Zum Beispiel wäre es in diesem Fall gut, 'if Mt == n: return 0 'am Anfang der Funktion' Hcacf' hinzuzufügen. – Ilya