Подгонка функции синуса в Java - интерпретация вывода из commons.apache - PullRequest
0 голосов
/ 28 июня 2019

Я заинтересован в создании функции синуса в Java, которая наилучшим образом адаптируется к некоторым заданным точкам.Эти точки приведены в следующем массиве:

double[] array_to_fit = {0,2,4,6,8,8,5,3,3,0};

Я нашел функцию HarmonicCurveFitter для Java и решил использовать ее в Android.Чтобы использовать их с этой функцией, я считаю, что мне нужно «предварительно обработать» данные, вычтя среднее значение для каждой точки, что дает мне следующее:

double[] array_to_fit = {-3.9,-1.9,0.1,2.1,4.1,4.1,1.1,-0.9,-0.9,-3.9};

И вписать данные в HarmonicCurveFitter объект:

        //add points to WeightedObservedPoints object
        for (int index = 0; index < array_to_fit.length; index++) {
            obs.add(index, array_to_fit[index]-average);
        }
        double[] bestFit = fitter.fit(obs.toList());
        amp = bestFit[0];
        freq = bestFit[1];
        phase = bestFit[2];

Возвращенный результат от функции Android следующий:

  • Ампер: 3,7572
  • Angular Freq (омега): 0,6273
  • Фаза: -2,7699

Я проделал то же упражнение в Python с использованием SciPy , со следующимвыходы:

  • Ампер: 3,7572
  • Угловая частота (омега): 0,6273
  • Фаза: -1.1991

Как видите, значения фазы отличаются.Когда я отображаю обе функции на графике:

Результаты визуального вывода графика

Как вы можете видеть, функция синуса, созданная в Python, действительно выглядит нормально, в то время как синусФункция от Android кажется слегка смещенной по горизонтальной оси ...

Кто-нибудь знает причину этого?Я неправильно интерпретирую фазовый выход из функции HarmonicCurveFitter?

1 Ответ

0 голосов
/ 28 июня 2019

Решено!Ошибка состояла в том, что я ожидал синуса, но функция в этой библиотеке выражена в косинусе.Функция как указано

f(t) = A * cos(omega*t + phi)
...