Решил я тут кое-какие расчёты сделать и внезапно начал получать значения нормированной автокорреляции > 1, чего быть не должно. Код выглядит примерно так, проблемы возникают, когда я начинаю считать корреляцию для центра масс, просто усредненная выглядит нормально (алгоритм и циклы те же):
for (size_t lag = 0; lag < TLIM / PCOUNT_LIMIT_VALUE; lag++)
{
for (size_t time = 0; time < TLIM / PCOUNT_LIMIT_VALUE - lag; time++)
{
vx_squared = centre_of_mass_vx[time] * centre_of_mass_vx[time + lag];
vy_squared = centre_of_mass_vy[time] * centre_of_mass_vy[time + lag];
magnitude = centre_of_mass_vx[time] * centre_of_mass_vx[time] +
centre_of_mass_vy[time] * centre_of_mass_vy[time];
magnitudeShifted = centre_of_mass_vx[time + lag] * centre_of_mass_vx[time + lag] +
centre_of_mass_vy[time + lag] * centre_of_mass_vy[time + lag];
VACF_com[lag] += vx_squared + vy_squared;
VACF_com_module[lag] += sqrt(magnitudeShifted * magnitude);
VACF_com_orientation[lag] += (vx_squared + vy_squared) / sqrt(magnitudeShifted * magnitude);
}
VACF_com[lag] /= TLIM / PCOUNT_LIMIT_VALUE - lag;
VACF_com_module[lag] /= TLIM / PCOUNT_LIMIT_VALUE - lag;
VACF_com_orientation[lag] /= TLIM / PCOUNT_LIMIT_VALUE - lag;
}
norm1 = VACF_com[0];
norm2 = VACF_com_module[0];
norm3 = VACF_com_orientation[0];
Если честно, ощущения, что слегка едет кукуха: отклонения невелики, но на ошибку округления не похоже. Плохих значений вроде нет (хотя нужно проверить). Я что-то упускаю, но не могу понять, что именно.
Upd. Нет, проблема не в алгоритме: я проверил с помощью np.correlate, получил тот же результат. Ирония в том, что начальная точка всегда максимум, такого быть не может. Upd2. Минимальный набор vx, vy для проверки
7.162431e+00 1.572510e-03
7.281370e+00 -1.435231e-01
7.353923e+00 -2.122551e-02
7.367500e+00 1.025319e-01
7.377404e+00 9.108236e-02