2016-05-05 2 views
1

Все, что я пытаюсь сделать, это вычислить авто корреляцию с JX массива, для которого я использую следующую формулу,Вычисление автокорреляционной функции с Python

autocorrelation formula

где п есть время, при котором Я хочу рассчитать функцию автокорреляции, Mt - максимальное время, а tk - это временные шаги от 1 до Mt-n.

Это код, который я написал. Я проверяю свою программу простым массивом jx=linspace(1,10,20). Я также делаю программу сохранять значения автокорреляции для разных n и строить их с помощью 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() 

Выход возвращает это: enter image description here

Но она также возвращает следующее messsage об ошибке:

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

Где я буду неправильно?

+0

Я совершенно не знаком с корреляцией. Могу ли я сделать это более простым способом? – kanayamalakar

ответ

2

Кажется, что у вас есть деление на ноль. Она работает следующим образом:

1) В строке for n in linspace(0,Mt-1,Mt): вы имеете n==Mt-1,

2) Таким образом, в следующей строке ac=Hcacf(n+1) вызове функции Hcacf(Mt),

3) Но внутри этой функции Hcacf вы имеют строку avg = Sum*1.0/(Mt-n). Это место, где возможно деление на ноль.

Чтобы исправить это, вы можете исключить конечную точку интервала в первой строке. Попробуйте заменить его по этой строке:

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

Спасибо! Теперь это сработало! :) – kanayamalakar

+1

Добро пожаловать. В будущем: действительно опасно делить без нулевой проверки. Например, в этом случае было бы полезно добавить 'if Mt == n: return 0' в самом начале функции' Hcacf'. – Ilya

Смежные вопросы