类 HarmonicCurveFitter.ParameterGuesser
- 封闭类:
-
HarmonicCurveFitter
用于猜测系数的算法如下:
我们在一些采样点\( 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\)是测量次数。
-
构造器概要
-
方法概要
-
构造器详细资料
-
ParameterGuesser
简单构造函数。- 参数:
-
observations
- 采样观测值。 - 抛出:
-
MathIllegalArgumentException
- 如果样本太短。 -
MathIllegalArgumentException
- 如果横坐标范围为零。 -
MathIllegalStateException
- 当猜测过程无法产生合理结果时。
-
-
方法详细资料
-
guess
public double[] guess()获取参数的估计。- 返回:
-
估计的参数,按以下顺序:
- 振幅
- 角频率
- 相位
-