Подгонка временных рядов с компонентами Фурье: оценка коэффициентов ряда Фурье

Проблема: у меня есть набор измерений (время, измерение, ошибка), которые демонстрируют периодические изменения, и я хочу сопоставить их с рядом Фурье формы

введите здесь описание изображения

где A0 — среднее значение моих измерений, t — время, t0 — (известное) контрольное время, а P — (известный) период. Я хочу подобрать коэффициенты A_k и phi_k.

Вот что у меня есть на данный момент:

# Find Fourier components
# nfourier is the number of fourier components 

    def fourier(coeffs, time_data, epoch, period, nfourier, A0):
       import numpy as np
       omega = 2.0*np.pi/period
       fseries = np.zeros(len(time_data))
       fseries.fill(A0)
       for k in range(nfourier):
          ak = coeffs[k]
          phik = coeffs[k+1]
          time_diff = time_data - epoch
          fseries = fseries + ak * np.cos(k * omega * time_diff + phik)

       return fseries

Я оцениваю остатки следующим образом:

def residuals(coeffs, measurement_data, time_data, error_data, epoch, period, nfourier, A0):
   model = fourier(coeffs, time_data, epoch, period, nfourier, A0)
   result = measurement_data - model
   return result

Затем я сопоставляю это с:

def fit_it(coeffs, measurement_data, time_data, error_data, epoch, period, nfourier, A0):
   from scipy.optimize import leastsq
   opt_coeff = leastsq(residuals, coeffs, args=(measurement_data, time_data, error_data, epoch, period, nfourier, A0))
   return opt_coeff

Программа завершается успешно, но подгонка не удалась, как видно из этого рисунка: введите здесь описание изображения

Я не уверен, что я делаю неправильно здесь, но, возможно, эксперт может дать несколько советов. Я был бы рад предоставить тестовый набор данных, если кто-то готов помочь.


person Hooloovoo    schedule 18.12.2015    source источник
comment
почему бы не использовать определение и не оценить коэффициенты, усредняя масштабированные данные с каждым cos() фактором? должно быть проще. Трудно понять код, который вы используете   -  person Nikos M.    schedule 18.12.2015
comment
Привет, Нико, можешь привести пример того, что ты имеешь в виду? Мои данные — это просто временной ряд, и я передаю некоторые из фиксированных параметров (эпоха, период, nfourier, A0) в качестве аргументов между функциями. Функция определена в Fourier(), а fit_it() минимизирует (или, по крайней мере, должна) остатки. Это просто линейный метод наименьших квадратов.   -  person Hooloovoo    schedule 18.12.2015
comment
хорошо, я имел в виду фактическое определение коэффициентов Фурье, но в любом случае, не Слишком хорошо понимаете код, например, как связана эпоха или какие-то другие параметры?   -  person Nikos M.    schedule 18.12.2015
comment
На основе формулы, которую я дал в исходном посте: coeffs — это коэффициенты A_k, phi_k. Measurement_data — это мои значения по оси Y. time_data - Значения по оси X (t) error_data - Неопределенности для каждой точки в Measurement_Data epoch - Известное время отсчета (t0) period - Известный период (P) nfourier - Количество параметров Фурье для подгонки (например, 9) A0 - mean(measurement_data) Имеет ли это смысл?   -  person Hooloovoo    schedule 19.12.2015
comment
использование наименьших квадратов в качестве приближения является подходом, однако обратите внимание, что метод наименьших квадратов попытается найти глобальное приближение. Это означает, что, например, изменив параметр nfourier, например, с 2 на 3 и выполнив метод наименьших квадратов, первые 2 коэффициента nfourier 3 НЕ будут соответствовать первым 2 коэффициентам nfourier 2 (хотя они должны совпадать). Опять же, если я правильно понимаю код до сих пор   -  person Nikos M.    schedule 19.12.2015


Ответы (2)


Я не понимаю причину подгонки Фурье. Я думаю, вы хотите знать компоненты частоты модуляции ваших данных. Я бы посоветовал вам каждый раз брать среднее значение данных и брать его, это даст вам больше информации о частотном спектре ваших данных.

Что касается вашего кода, я хотел бы сделать два комментария. Сначала фаза k-го элемента является амплитудой k+1-го элемента. И, во-вторых, error_data ничего не берет из остатков функции. Вы можете проверить эти пункты.

Это больше похоже на комментарий, но у меня недостаточно репутации, чтобы оставить комментарий. Просто пытаюсь помочь.

С уважением

person hsinghal    schedule 20.12.2015
comment
Привет hsinghal, Спасибо за комментарии. Мне нужно будет изменить код и посмотреть, как он работает после того, как я приму их во внимание. Что касается первой части вашего комментария, то мне нужны коэффициенты Фурье для расчета некоторых других параметров. - person Hooloovoo; 21.12.2015

Если вы знаете период данных, вы должны сложить ось x по фазе. Похоже, что ось X находится в юлианском дне. Вы должны рассчитать фазу во время измерений.

Фаза = ((Время - Базовое время) % Период) / Период

Вы захотите подогнать ряд Фурье к графику зависимости измерения от фазы, который будет больше похож на периодический сигнал.

person Michael Busch    schedule 03.11.2018