Java中的正弦函数拟合-解释commons.apache的输出

时间:2019-06-28 10:33:48

标签: java android trigonometry

我有兴趣用Java创建最适合某些给定点的正弦函数。这些点在以下数组中给出:

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

我找到了Java的HarmonicCurveFitter函数,并决定在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
  • 角频率(Ω):0.6273
  • 阶段:-2.7699

我已经使用SciPy在 Python中完成了相同的练习,具有以下输出:

  • 放大器:3.7572
  • 角频率(Ω):0.6273
  • 阶段:-1.1991

如您所见,相位值是不同的。当我在图表中绘制两个函数时:

Visual output graph results

如您所见,用Python创建的正弦函数确实不错,而Android的正弦函数似乎在水平轴上略有偏移...

有人知道原因吗?我会错误地解释HarmonicCurveFitter函数的相位输出吗?

1 个答案:

答案 0 :(得分:0)

解决了!错误是我期望正弦,但是此lib中的函数用余弦表示。功能如前所述

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