我正在观察一个正弦波变化的源,即 f(x) = a sin (bx + d) + c,并希望确定振幅 a、偏移量 c 和周期/频率 b - 移位 d 不重要。测量结果稀疏,每个源通常测量 6 到 12 次,并且观测时间是随机的,观测间隔大约在四分之一到十倍周期之间(强调一下,每个源的观测间距不是恒定的)。在每个源中,偏移 c 通常比测量误差大得多,而振幅则有所变化 - 在极端情况下,它们仅与测量误差相当,而在另一种极端情况下,它们大约是误差的二十倍。希望这充分概述了问题,如果没有,请问我并进行澄清。
直觉地思考这个问题,测量值的平均值将是偏移 c 的良好估计值,而测量 f(x) 最小值和最大值之间的范围的一半将是振幅的合理估计值,特别是随着测量次数的增加,观察到从平均值偏离的最大值的前景会改善。然而,如果振幅很小,那么我认为几乎没有机会准确地确定 b,而对于大振幅源,即使它们只被观察了最少的次数,前景也应该更好。
无论如何,我编写了一些代码来对数据进行最小二乘拟合,以适应周期范围,并且对于较大振幅的源有效地识别出最佳拟合值 a、b 和 d。然而,我看到它找到了许多可能的周期,虽然其中一个是“最佳的”(在尽可能给出最小误差加权残差的情况下),但在大多数情况下,不同候选周期的残差差异并不大。因此,我现在想量化导出周期是“假阳性”的可能性(或者稍微换句话说,我可以对导出周期的正确性有多大信心)。
有人对如何最好地继续进行有任何建议吗?我想到的一个想法是使用 Monte-Carlo 算法构造大量具有已知 a、b 和 c 值的源,构造与我的测量时间相对应的样本,用我的拟合代码拟合所得样本,并查看我恢复正确周期的百分比。但是这似乎非常繁重,而且我不确定它是否特别有用,除了给出假阳性率的一般感觉。
还有任何可以帮助的框架建议吗?我有一种感觉,在 Mathematica 中可能只需要一行或两行代码就能完成这项工作,但是(a)我不知道它,(b)也没有访问权限。我精通 Java,熟练掌握 IDL,并且可能可以弄清楚其他东西...
直觉地思考这个问题,测量值的平均值将是偏移 c 的良好估计值,而测量 f(x) 最小值和最大值之间的范围的一半将是振幅的合理估计值,特别是随着测量次数的增加,观察到从平均值偏离的最大值的前景会改善。然而,如果振幅很小,那么我认为几乎没有机会准确地确定 b,而对于大振幅源,即使它们只被观察了最少的次数,前景也应该更好。
无论如何,我编写了一些代码来对数据进行最小二乘拟合,以适应周期范围,并且对于较大振幅的源有效地识别出最佳拟合值 a、b 和 d。然而,我看到它找到了许多可能的周期,虽然其中一个是“最佳的”(在尽可能给出最小误差加权残差的情况下),但在大多数情况下,不同候选周期的残差差异并不大。因此,我现在想量化导出周期是“假阳性”的可能性(或者稍微换句话说,我可以对导出周期的正确性有多大信心)。
有人对如何最好地继续进行有任何建议吗?我想到的一个想法是使用 Monte-Carlo 算法构造大量具有已知 a、b 和 c 值的源,构造与我的测量时间相对应的样本,用我的拟合代码拟合所得样本,并查看我恢复正确周期的百分比。但是这似乎非常繁重,而且我不确定它是否特别有用,除了给出假阳性率的一般感觉。
还有任何可以帮助的框架建议吗?我有一种感觉,在 Mathematica 中可能只需要一行或两行代码就能完成这项工作,但是(a)我不知道它,(b)也没有访问权限。我精通 Java,熟练掌握 IDL,并且可能可以弄清楚其他东西...