Я заинтересован в создании функции синуса в 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?