【问题标题】:Sine Wave Curve Fitting in JavaJava中的正弦波曲线拟合
【发布时间】:2014-01-23 22:56:12
【问题描述】:

我正在使用Apache Commons Math 包,我有以下正弦波...

  0.90, 0.85, 0.80, 0.83, 0.89
  0.90, 0.85, 0.80, 0.83, 0.89
  0.90, 0.85, 0.80, 0.83, 0.89
  0.90, 0.85, 0.80, 0.83, 0.89

从以上数据可以看出,波浪有以下属性...

  • 幅度 = .05
  • 相位 = 0
  • 频率 = 5

但是,当我将正弦波添加到 HarmonicFitter 时...

HarmonicFitter fitter = new HarmonicFitter(new LevenbergMarquardtOptimizer());

fitter.addObservedPoint(0, 0.90);
fitter.addObservedPoint(1, 0.85);
fitter.addObservedPoint(2, 0.80);
fitter.addObservedPoint(3, 0.83);
fitter.addObservedPoint(4, 0.89);

fitter.addObservedPoint(5, 0.90);
fitter.addObservedPoint(6, 0.85);
fitter.addObservedPoint(7, 0.80);
fitter.addObservedPoint(8, 0.83);
fitter.addObservedPoint(9, 0.89);

fitter.addObservedPoint(10, 0.90);
fitter.addObservedPoint(11, 0.85);
fitter.addObservedPoint(12, 0.80);
fitter.addObservedPoint(13, 0.83);
fitter.addObservedPoint(14, 0.89);

fitter.addObservedPoint(15, 0.90);
fitter.addObservedPoint(16, 0.85);
fitter.addObservedPoint(17, 0.80);
fitter.addObservedPoint(18, 0.83);
fitter.addObservedPoint(19, 0.89);

double[] vals = fitter.fit();

return vals;

返回的值更像...

Amplitude: 5.19813329138371
Frequency: 4.69209750375546E-5
Phase: 1.405312649084833

为什么曲线拟合会导致具有 4 个相同频率的正弦波具有如此截然不同的属性?

【问题讨论】:

  • 会不会只是因为你的数据点不够精确?
  • +1;这是我这几天看到的最完整、格式正确、语法正确的问题。
  • 另外,我觉得很奇怪,你观察到的点在 5 的周期上是周期性的,鉴于你说频率是 5,你的样本的周期性不应该是 PI/5 吗?跨度>
  • 你所拥有的不是正弦波,它是正弦波在常数上的叠加,其中常数占主导地位。您的数学 API 是否有望弥补这一点?
  • @LordOfThePigs 那么,这肯定是最突出的问题。

标签: java math apache-commons curve-fitting


【解决方案1】:

您似乎混淆了输出的顺序,并且没有将其正确映射到标签(fitreturns 一个数组)。

您获得的值真正反映了您的输入:

尝试在纸上画出你的值并在它们上面加上正弦波——你断言 0.5 表示幅度和 5 表示频率是不正确的。相位正常,由 4.69e-5 确认。您的频率远高于 5。0.5 的幅度是您想要的,而不是数据显示的,1.4:因为在正弦的下坡上没有点,优化器实际上认为点 0.8、0.83 和 0.89 都属于正弦波的上坡幅度更大——这减少了误差。

总而言之,你试图用基本上 5 个点拟合 3 个值是过度拟合的。

【讨论】:

    【解决方案2】:

    @Marko Topolnik 有问题。 Fitter 期待一个简单的谐波(即单个余弦或正弦),其均值为零。因此,从所有内容中减去 0.854(平均值),然后将该常数加回生成的正弦波。

    事实上,微小的频率给出了一个平坦的正弦波,所以其他数字是无关紧要的。尝试绘制所有内容(包括生成的函数)。


    编辑:这里有两个图。第一个有你的观点以及三个函数:你想要的y=.05*cos(2πx/5),相同的函数加上.0854(看起来你的相位不会为零),以及包的最佳拟合函数: 但是在您缩小到[-1e5,1e5]x[-8,8] 的窗口之前,您无法区分包的最佳拟合函数: 这也意味着包的最佳拟合函数非常不稳定。您的点数的微小变化会导致输出的巨大变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多