类 HarmonicCurveFitter.ParameterGuesser

java.lang.Object
org.hipparchus.fitting.HarmonicCurveFitter.ParameterGuesser
封闭类:
HarmonicCurveFitter

public static class HarmonicCurveFitter.ParameterGuesser extends Object
该类从样本中猜测谐波系数。

用于猜测系数的算法如下:

我们在一些采样点\( t_i \)处知道\( f(t) \),并希望找到\( a \)、\( \omega \) 和\( \phi \),使得\( f(t) = a \cos (\omega t + \phi) \)。

从解析表达式中,我们可以计算两个原始函数:\[ If2(t) = \int f^2 dt = a^2 (t + S(t)) / 2 \] \[ If'2(t) = \int f'^2 dt = a^2 \omega^2 (t - S(t)) / 2 \] 其中\(S(t) = \frac{\sin(2 (\omega t + \phi))}{2\omega}\)

我们可以在这些表达式之间消除\(S\):\[ If'2(t) = a^2 \omega^2 t - \omega^2 If2(t) \]

前述表达式表明\(If'2 (t)\)是\(t\)和\(If2(t)\)的线性组合:\[ If'2(t) = A t + B If2(t) \]

从原始函数中,我们可以推断出对于每个\(t_i\)的\(t_1\)到\(t_i\)之间的定积分也具有相同的形式:\[ If2(t_i) - If2(t_1) = A (t_i - t_1) + B (If2 (t_i) - If2(t_1)) \]

我们可以通过为每个采样点计算定积分来找到最适合这个线性表达式的系数\(A\)和\(B\)。

对于双线性表达式\(z(x_i, y_i) = A x_i + B y_i\),最小化最小二乘准则\(\sum (z_i - z(x_i, y_i))^2\)的系数\(A\)和\(B\)由以下表达式给出:

\[ A = \frac{\sum y_i y_i \sum x_i z_i - \sum x_i y_i \sum y_i z_i} {\sum x_i x_i \sum y_i y_i - \sum x_i y_i \sum x_i y_i} \] \[ B = \frac{\sum x_i x_i \sum y_i z_i - \sum x_i y_i \sum x_i z_i} {\sum x_i x_i \sum y_i y_i - \sum x_i y_i \sum x_i y_i} \]

实际上,我们可以假设\(a\)和\( \omega \)都是正的,并直接计算它们,知道\(A = a^2 \omega^2\)和\(B = -\omega^2\)。因此,完整的算法如下:

对于每个从\(t_1\)到\(t_{n-1}\)的\(t_i\),计算:\[ f(t_i) \] \[ f'(t_i) = \frac{f (t_{i+1}) - f(t_{i-1})}{t_{i+1} - t_{i-1}} \] \[ x_i = t_i - t_1 \] \[ y_i = \int_{t_1}^{t_i} f^2(t) dt \] \[ z_i = \int_{t_1}^{t_i} f'^2(t) dt \] 并更新总和:\[ \sum x_i x_i, \sum y_i y_i, \sum x_i y_i, \sum x_i z_i, \sum y_i z_i \] 然后:\[ a = \sqrt{\frac{\sum y_i y_i \sum x_i z_i - \sum x_i y_i \sum y_i z_i } {\sum x_i y_i \sum x_i z_i - \sum x_i x_i \sum y_i z_i }} \] \[ \omega = \sqrt{\frac{\sum x_i y_i \sum x_i z_i - \sum x_i x_i \sum y_i z_i} {\sum x_i x_i \sum y_i y_i - \sum x_i y_i \sum x_i y_i}} \]

一旦我们知道\( \omega \),我们可以计算:\[ fc = \omega f(t) \cos(\omega t) - f'(t) \sin(\omega t) \] \[ fs = \omega f(t) \sin(\omega t) + f'(t) \cos(\omega t) \]

显然,\(fc = a \omega \cos(\phi)\)和\(fs = -a \omega \sin(\phi)\),因此我们可以使用这些表达式来计算\( \phi \)。对于样本的最佳估计由这些表达式的平均值给出。

由于前述估计涉及积分和均值,这些操作在\(O(n)\)时间内运行,其中\(n\)是测量次数。