У меня есть некоторые периодические данные, но объем данных не кратен периоду.Как я могу Фурье проанализировать эти данные?Пример:
% Давайте создадим некоторые данные для тестирования:
data = Table[N[753+919*Sin[x/623-125]], {x,1,25000}]
% Я сейчас получаю эти данные, но не знаю, что они получены из формулы выше.Я пытаюсь восстановить формулу только из «данных».
% Рассматривая первые несколько непостоянных членов ряда Фурье:
ListPlot[Table[Abs[Fourier[data]][[x]], {x,2,20}], PlotJoined->True,
PlotRange->All]
показывает ожидаемый всплеск в 6 (поскольку числопериоды действительно 25000 / (623 * 2 * Pi) или около 6,38663, хотя мы этого не знаем).
% Теперь, как мне вернуться к 6.38663?Одним из способов является «свертка» данных с произвольными кратными Cos [x].
convolve[n_] := Sum[data[[x]]*Cos[n*x], {x,1,25000}]
% И изобразите «свертку» вблизи n = 6:
Plot[convolve[n],{n,5,7}, PlotRange->All]
, мы видим всплеск примерно там, где и ожидалось.
% Мы пытаемся найти FindMaximum:
FindMaximum[convolve[n],{n,5,7}]
, но результат бесполезен и неточен:
FindMaximum::fmmp:
Machine precision is insufficient to achieve the requested accuracy or
precision.
Out[119]= {98.9285, {n -> 5.17881}}
, потому что функция очень волнистая.
% Уточняя наш интервал (используя визуальный анализ на графиках), мы, наконец, находим интервал, в котором свертка [] не слишком сильно покачивается:
Plot[convolve[n],{n,6.2831,6.2833}, PlotRange->All]
и FindMaximum работают:
FindMaximum[convolve[n],{n,6.2831,6.2833}] // FortranForm
List(1.984759605826571e7,List(Rule(n,6.2831853071787975)))
% Тем не менее, этот процесс уродлив, требует вмешательства человека, и вычисление convolve [] ДЕЙСТВИТЕЛЬНО медленное.Есть лучший способ сделать это?
% Глядя на ряд данных Фурье, могу ли я как-то угадать "истинное" количество периодов, равное 6,38663?Конечно, фактический результат будет 6,283185, так как мои данные соответствуют этому лучше (потому что я выбираю только в конечном количестве точек).