関数sequence_fit_by_bending_line マニュアル

(The documentation of function sequence_fit_by_bending_line)

Last Update: 2024/12/9


◆機能・用途(Purpose)

時系列データを折れ線でフィットしたときの折れ曲がり点での値を求める。
Calculate the values at the bending points of a bending line that best fits a time series data.


◆形式(Format)

#include <sequence/statistics.h>
inline double ∗sequence_fit_by_bending_line
(struct sequence seq,const int Nbends,const double ∗bend_times)


◆引数(Arguments)

seq 計算に用いる時系列データを表す構造体。
A structure to represent the time series data used for the computation.
Nbends 折れ曲がり点の個数。
The number of bending points.
bend_times 折れ曲がり点の時刻を昇順に並べた配列。
An array composed of the times of bending points sorted in an ascending order.


◆戻り値(Return value)

折れ曲がり点での値を時刻順に並べた配列。
An array composed of the values at the bending points sorted in a time order.


◆使用例(Example)

struct sequence seq;
double bend_times[]={1.2,3.4,5.6,7.8};
double ∗bend_values=sequence_fit_by_bending_line(seq,4,bend_times);


◆計算式(Formula)

●問題設定 (The problem)

引数seqで与える時系列データを\(f(t)\)、その定義域を\([t_{min},t_{max}]\)とする。 \(f(t)\)を以下の条件を満たす折れ線\(g(t)\)で近似する。
Let \(f(t)\) be the time series data given by argument seq and \([t_{min},t_{max}]\) be its definition range. Consider to approximate \(f(t)\) by a bending line \(g(t)\) that satisfies the requirements below.

以上の条件を満たす最適な\(\{g_i; i=0,\cdots,M-1\}\)を求める。
The problem is to determine optimal \(\{g_i; i=0,\cdots,M-1\}\) values that satisfy these requirements.


●最適解が満たす条件 (Conditions of the optimal solution)

\(g(t)\)が上記の条件を満たすとき、各区間\([t_{i-1},t_i]\)において\(g(t)\)は \[\begin{eqnarray} g(t) &=& g_{i-1}+\frac{g_i-g_{i-1}}{t_i-t_{i-1}}(t-t_{i-1}) \nonumber \\ &=& \frac{t_i-t}{t_i-t_{i-1}}g_{i-1} +\frac{t-t_{i-1}}{t_i-t_{i-1}}g_i \hspace{1em} (t_{i-1}\leq t\leq t_i) \label{eq.g} \end{eqnarray}\] と表される。したがって\(f(t)\)と\(g(t)\)の残差は \[\begin{eqnarray} E &=& \int_{t_{min}}^{t_{max}} \left\{g(t)-f(t)\right\}^2 dt \nonumber \\ &=& \sum_{i=0}^M \int_{t_{i-1}}^{t_i} \left\{g(t)-f(t)\right\}^2 dt \nonumber \\ &=& \sum_{i=0}^M \int_{t_{i-1}}^{t_i} \left\{\frac{t_i-t}{t_i-t_{i-1}}g_{i-1} +\frac{t-t_{i-1}}{t_i-t_{i-1}}g_i -f(t)\right\}^2 dt \label{eq.E} \end{eqnarray}\] と書ける。
The function \(g(t)\) that satisfies these requirements is expressed by Eq. (\ref{eq.g}) in each section \([t_{i-1},t_i]\). Therefore, the residual between \(f(t)\) and \(g(t)\) is expressed by Eq. (\ref{eq.E}).

\(E\)を最小にする\(\{g_i;i=0,\cdots,M-1\}\)は以下の式で求められる。 \[\begin{eqnarray} \PartialDiff{E}{g_j} &=& \PartialDiff{}{g_j} \sum_{i=0}^M \int_{t_{i-1}}^{t_i} \left\{\frac{t_i-t}{t_i-t_{i-1}}g_{i-1} +\frac{t-t_{i-1}}{t_i-t_{i-1}}g_i -f(t)\right\}^2 dt \nonumber \\ &=& \PartialDiff{}{g_j} \int_{t_{j-1}}^{t_j} \left\{\frac{t_j-t}{t_j-t_{j-1}}g_{j-1} +\frac{t-t_{j-1}}{t_j-t_{j-1}}g_j -f(t)\right\}^2 dt \nonumber \\ & & +\PartialDiff{}{g_j} \int_{t_j}^{t_{j+1}} \left\{\frac{t_{j+1}-t}{t_{j+1}-t_j}g_j +\frac{t-t_j}{t_{j+1}-t_j}g_{j+1} -f(t)\right\}^2 dt \nonumber \\ &=& \int_{t_{j-1}}^{t_j} 2\left\{\frac{t_j-t}{t_j-t_{j-1}}g_{j-1} +\frac{t-t_{j-1}}{t_j-t_{j-1}}g_j -f(t)\right\} \frac{t-t_{j-1}}{t_j-t_{j-1}} dt \nonumber \\ & & +\int_{t_j}^{t_{j+1}} 2\left\{\frac{t_{j+1}-t}{t_{j+1}-t_j}g_j +\frac{t-t_j}{t_{j+1}-t_j}g_{j+1} -f(t)\right\} \frac{t_{j+1}-t}{t_{j+1}-t_j} dt \nonumber \\ &=& \left[\left\{\frac{-(t_j-t)^2}{t_j-t_{j-1}}g_{j-1} +\frac{(t-t_{j-1})^2}{t_j-t_{j-1}}g_j -2F_1(t)\right\} \frac{t-t_{j-1}}{t_j-t_{j-1}}\right]_{t_{j-1}}^{t_j} \nonumber \\ & & -\int_{t_{j-1}}^{t_j} \left\{\frac{-(t_j-t)^2}{t_j-t_{j-1}}g_{j-1} +\frac{(t-t_{j-1})^2}{t_j-t_{j-1}}g_j -2F_1(t)\right\} \frac{1}{t_j-t_{j-1}} dt \nonumber \\ & & +\left[\left\{\frac{-(t_{j+1}-t)^2}{t_{j+1}-t_j}g_j +\frac{(t-t_j)^2}{t_{j+1}-t_j}g_{j+1} -2F_1(t)\right\} \frac{t_{j+1}-t}{t_{j+1}-t_j}\right]_{t_j}^{t_{j+1}} \nonumber \\ & & -\int_{t_j}^{t_{j+1}} \left\{\frac{-(t_{j+1}-t)^2}{t_{j+1}-t_j}g_j +\frac{(t-t_j)^2}{t_{j+1}-t_j}g_{j+1} -2F_1(t)\right\} \frac{-1}{t_{j+1}-t_j} dt \nonumber \\ &=& \left[\left\{\frac{-(t_j-t)^2}{t_j-t_{j-1}}g_{j-1} +\frac{(t-t_{j-1})^2}{t_j-t_{j-1}}g_j -2F_1(t)\right\} \frac{t-t_{j-1}}{t_j-t_{j-1}}\right]_{t_{j-1}}^{t_j} \nonumber \\ & & -\left[\left\{\frac{(t_j-t)^3}{3(t_j-t_{j-1})}g_{j-1} +\frac{(t-t_{j-1})^3}{3(t_j-t_{j-1})}g_j -2F_2(t)\right\} \frac{1}{t_j-t_{j-1}}\right]_{t_{j-1}}^{t_j} \nonumber \\ & & +\left[\left\{\frac{-(t_{j+1}-t)^2}{t_{j+1}-t_j}g_j +\frac{(t-t_j)^2}{t_{j+1}-t_j}g_{j+1} -2F_1(t)\right\} \frac{t_{j+1}-t}{t_{j+1}-t_j}\right]_{t_j}^{t_{j+1}} \nonumber \\ & & -\left[\left\{\frac{(t_{j+1}-t)^3}{3(t_{j+1}-t_j)}g_j +\frac{(t-t_j)^3}{3(t_{j+1}-t_j)}g_{j+1} -2F_2(t)\right\} \frac{-1}{t_{j+1}-t_j}\right]_{t_j}^{t_{j+1}} \nonumber \\ &=& \left[\left\{(t_j-t_{j-1})g_j-2F_1(t_j)\right\}\right] \nonumber \\ & & -\left[\left\{\frac{t_j-t_{j-1}}{3}g_j -\frac{2F_2(t_j)}{t_j-t_{j-1}}\right\} -\left\{\frac{t_j-t_{j-1}}{3}g_{j-1} -\frac{2F_2(t_{j-1})}{t_j-t_{j-1}}\right\}\right] \nonumber \\ & & +\left[-\left\{-(t_{j+1}-t_j)g_j-2F_1(t_j)\right\}\right] \nonumber \\ & & -\left[-\left\{\frac{t_{j+1}-t_j}{3}g_{j+1} -\frac{2F_2(t_{j+1})}{t_{j+1}-t_j}\right\} +\left\{\frac{t_{j+1}-t_j}{3}g_j -\frac{2F_2(t_j)}{t_{j+1}-t_j}\right\}\right] \nonumber \\ &=& (t_j-t_{j-1})g_j-2F_1(t_j) \nonumber \\ & & -\frac{t_j-t_{j-1}}{3}g_j +\frac{2F_2(t_j)}{t_j-t_{j-1}} +\frac{t_j-t_{j-1}}{3}g_{j-1} -\frac{2F_2(t_{j-1})}{t_j-t_{j-1}} \nonumber \\ & & +(t_{j+1}-t_j)g_j+2F_1(t_j) \nonumber \\ & & +\frac{t_{j+1}-t_j}{3}g_{j+1} -\frac{2F_2(t_{j+1})}{t_{j+1}-t_j} -\frac{t_{j+1}-t_j}{3}g_j +\frac{2F_2(t_j)}{t_{j+1}-t_j} \nonumber \\ &=& \frac{t_j-t_{j-1}}{3}g_{j-1} +\frac{2}{3}(t_{j+1}-t_{j-1})g_j +\frac{t_{j+1}-t_j}{3}g_{j+1} \nonumber \\ & & -\frac{2F_2(t_{j-1})}{t_j-t_{j-1}} +\left(\frac{2}{t_j-t_{j-1}}+\frac{2}{t_{j+1}-t_j}\right)F_2(t_j) -\frac{2F_2(t_{j+1})}{t_{j+1}-t_j} \nonumber \\ &=& \frac{t_j-t_{j-1}}{3}g_{j-1} +\frac{2}{3}(t_{j+1}-t_{j-1})g_j +\frac{t_{j+1}-t_j}{3}g_{j+1} \nonumber \\ & & -\frac{2F_2(t_{j-1})}{t_j-t_{j-1}} +\frac{2(t_{j+1}-t_{j-1})F_2(t_j)}{(t_{j+1}-t_j)(t_j-t_{j-1})} -\frac{2F_2(t_{j+1})}{t_{j+1}-t_j} \nonumber \\ &=& 0 \label{eq.minE} \end{eqnarray}\] ここで\(f(t)\)の1階積分および2階積分を \(F_1(t)\), \(F_2(t)\)とおいた。
The values of \(\{g_i;i=0,\cdots,M-1\}\) that minimize \(E\) can be obtained by Eq. (\ref{eq.minE}), where \(F_1(t)\) and \(F_2(t)\) are the 1st- and 2nd-order integrals of \(f(t)\), respectively.

未知パラメータは\(g_0,\cdots,g_{M-1}\)であり、 これらが左辺にくるように(\ref{eq.minE})式を書き換える。
Let us arrange Eq. (\ref{eq.minE}) to put the unknown parameters \(g_0,\cdots,g_{M-1}\) in the left hand side.

以上の関係式を用いて最適な\(g_i\)の値を以下のように求められる。
Using these relations, the optimal \(g_i\) values can be calculated as follows.


●\(M=1\)の場合の解 (Solution for \(M=1\))

(\ref{eq.minE.M1.use_minmax})式よりただちに \[\begin{eqnarray} g_0 &=& \frac{3F_2(t_{min})}{(t_0-t_{min})(t_{max}-t_{min})} -\frac{3F_2(t_0)}{(t_{max}-t_0)(t_0-t_{min})} +\frac{3F_2(t_{max})}{(t_{max}-t_0)(t_{max}-t_{min})} \nonumber \\ & & -\frac{t_0-t_{min}}{2(t_{max}-t_{min})}f(t_{min}) -\frac{t_{max}-t_0}{2(t_{max}-t_{min})}f(t_{max}) \label{eq.solution.M1} \end{eqnarray}\] を得る。
Eq. (\ref{eq.minE.M1.use_minmax}) is solved directly to obtain Eq. (\ref{eq.solution.M1}).


●\(M=2\)の場合の解 (Solution for \(M=2\))

\(M=2\)のときは(\ref{eq.minE.jM1.use_max})式を \[\begin{eqnarray} (t_1-t_0)g_0+2(t_{max}-t_0)g_1 &=& \frac{6F_2(t_0)}{t_1-t_0} -\frac{6(t_{max}-t_0)F_2(t_1)}{(t_{max}-t_1)(t_1-t_0)} +\frac{6F_2(t_{max})}{t_{max}-t_1} \nonumber \\ & & -(t_{max}-t_1)f(t_{max}) \label{eq.minE.jM1.use_max.M2} \end{eqnarray}\] と書き直せる。 (\ref{eq.minE.j0.use_min})(\ref{eq.minE.jM1.use_max.M2})式を行列形式で \[\begin{equation} \myvector{d}=\myvector{G}\myvector{m} \label{eq.minE.matrix} \end{equation}\] \[\begin{equation} \myvector{d}= \begin{pmatrix} \frac{6F_2(t_{min})}{t_0-t_{min}} -\frac{6(t_1-t_{min})F_2(t_0)}{(t_1-t_0)(t_0-t_{min})} +\frac{6F_2(t_1)}{t_1-t_0} -(t_0-t_{min})f(t_{min}) \\ \frac{6F_2(t_0)}{t_1-t_0} -\frac{6(t_{max}-t_0)F_2(t_1)}{(t_{max}-t_1)(t_1-t_0)} +\frac{6F_2(t_{max})}{t_{max}-t_1} -(t_{max}-t_1)f(t_{max}) \end{pmatrix} \label{eq.matrix_d.M2} \end{equation}\] \[\begin{equation} \myvector{G}= \begin{pmatrix} 2(t_1-t_{min}) & (t_1-t_0) \\ (t_1-t_0) & 2(t_{max}-t_0) \end{pmatrix} \label{eq.matrix_G.M2} \end{equation}\] \[\begin{equation} \myvector{m}= \begin{pmatrix} g_0 \\ g_1 \end{pmatrix} \label{eq.matrix_m.M2} \end{equation}\] と表した上で\(\myvector{m}\)について解けば最適な\(\{g_i\}\)が得られる。
In case of \(M=2\), Eq. (\ref{eq.minE.jM1.use_max}) is rewritten as (\ref{eq.minE.jM1.use_max.M2}). Eqs. (\ref{eq.minE.j0.use_min}) and (\ref{eq.minE.jM1.use_max.M2}) are rewritten in a matrix form as Eqs. (\ref{eq.minE.matrix})-(\ref{eq.matrix_m.M2}). The solution of this equation for \(\myvector{m}\) gives the optimal values of \({g_i}\).


●\(M\geq 3\)の場合の解 (Solution for \(M\geq 3\))

(\ref{eq.minE.j0.use_min}) (\ref{eq.minE.intermediate_j}) (\ref{eq.minE.jM1.use_max}) 式は行列形式(\ref{eq.minE.matrix}式)で書ける。ここで \[\begin{equation} \myvector{d}= \begin{pmatrix} \frac{6F_2(t_{min})}{t_0-t_{min}} -\frac{6(t_1-t_{min})F_2(t_0)}{(t_1-t_0)(t_0-t_{min})} +\frac{6F_2(t_1)}{t_1-t_0} -(t_0-t_{min})f(t_{min}) \\ \frac{6F_2(t_0)}{t_1-t_0} -\frac{6(t_2-t_0)F_2(t_1)}{(t_2-t_1)(t_1-t_0)} +\frac{6F_2(t_2)}{t_2-t_1} \\ \vdots \\ \frac{6F_2(t_{M-3})}{t_{M-2}-t_{M-3}} -\frac{6(t_{M-1}-t_{M-3})F_2(t_{M-2})}{(t_{M-1}-t_{M-2})(t_{M-2}-t_{M-3})} +\frac{6F_2(t_{M-1})}{t_{M-1}-t_{M-2}} \\ \frac{6F_2(t_{M-2})}{t_{M-1}-t_{M-2}} -\frac{6(t_{max}-t_{M-2})F_2(t_{M-1})}{(t_{max}-t_{M-1})(t_{M-1}-t_{M-2})} +\frac{6F_2(t_{max})}{t_{max}-t_{M-1}} -(t_{max}-t_{M-1})f(t_{max}) \end{pmatrix} \label{eq.matrix_d} \end{equation}\] \[\begin{equation} \myvector{G}= \begin{pmatrix} 2(t_1-t_{min}) & (t_1-t_0) & 0 & \cdots & 0 \\ (t_1-t_0) & 2(t_2-t_0) & (t_2-t_1) & \ddots & \vdots \\ 0 & \ddots & \ddots & \ddots & 0 \\ \vdots & \ddots & (t_{M-2}-t_{M-3}) & 2(t_{M-1}-t_{M-3}) & (t_{M-1}-t_{M-2}) \\ 0 & \cdots & 0 & (t_{M-1}-t_{M-2}) & 2(t_{max}-t_{M-2}) \end{pmatrix} \label{eq.matrix_G} \end{equation}\] \[\begin{equation} \myvector{m}= \begin{pmatrix} g_0 \\ \vdots \\ g_{M-1} \end{pmatrix} \label{eq.matrix_m} \end{equation}\] である。\(\myvector{G}\)のサイズは\(M\times M\)となる。 (\ref{eq.minE.matrix}), (\ref{eq.matrix_d})-(\ref{eq.matrix_m})式を \(\myvector{m}\)について解けば最適な\(\{g_i\}\)が得られる。
Eqs. (\ref{eq.minE.j0.use_min}), (\ref{eq.minE.intermediate_j}), and (\ref{eq.minE.jM1.use_max}) can be rewritten in a matrix form (Eq. \ref{eq.minE.matrix}) with the matrices defined by Eqs. (\ref{eq.matrix_d})-(\ref{eq.matrix_m}); the size of \(\myvector{G}\) is \(M\times M\). Solving Eqs. (\ref{eq.minE.matrix}) and (\ref{eq.matrix_d})-(\ref{eq.matrix_m}) for \(\myvector{m}\) gives the optimal \(\{g_i\}\).


●解の計算 (Computation of the solution)

いずれのケースにおいても解の計算には 関数solution_LU を用いている。
In either cases, function solution_LU is used to compute the solution.


◆検証(Validation)

\(f(t)\)が直線の場合、\(f(t)\)と\(g(t)\)は完全に一致するはずであるので、 実際にこの関数を用いて\(g(t)\)を求めてみて \(f(t)\)と一致することを確かめた。
The functions \(f(t)\) and \(g(t)\) should be identical if \(f(t)\) is a straight line. I confirmed that they are indeed identical when \(f(t)\) was a straight line and \(g(t)\) was estimated by this function.

検証に用いたのは \[\begin{equation} f(t)=3.45+6.78t \label{eq.f.test} \end{equation}\] であり、時刻12.0 sから0.1 s刻みで1000サンプル (\(t_{min}=12.0\) s, \(t_{max}=111.9\) s) とした。
For this examination, \(f(t)\) was generated according to Eq. (\ref{eq.f.test}). It was expressed by 1000 samples at 0.1 s intervals from 12.0 s (\(t_{min}=12.0\) s, \(t_{max}=111.9\) s).

はじめに時刻\(t=34.5\) sに1つの折れ曲がり点を設けた場合 (\(M=1\), \(t_0=34.5\) s)をテストした。 その結果、\(g_0=237.360\)と求まり、この値は\(f(t_0)\)と一致した。
The first test used a bending point at time \(t=34.5\) s (\(M=1\), \(t_0=34.5\) s). The result was \(g_0=237.360\), which was identical to the value of \(f(t_0)\).

次に2つの折れ曲がり点\(t_0=45.6\) s, \(t_1=78.9\) sを設けた場合(\(M=2\))をテストした。 結果は\(g_0=312.618\), \(g_1=538.392\)であり、 これらは\(f(t_0)\), \(f(t_1)\)と一致した。
The second test used two bending points (\(M=2\)) at times \(t_0=45.6\) s and \(t_1=78.9\) s. The results were \(g_0=312.618\) and \(g_1=538.392\), which were identical to the values of \(f(t_0)\) and \(f(t_1)\), respectively.

最後に5つの折れ曲がり点 \(t_0=23.4\) s, \(t_1=56.7\) s, \(t_2=67.8\) s, \(t_3=87.6\) s, \(t_4=98.7\) s を設けた場合(\(M=5\))をテストした。結果は \(g_0=162.102\), \(g_1=387.876\), \(g_2=463.134\), \(g_3=597.378\), \(g_4=672.636\)であり、 これらは\(f(t_0)\)-\(f(t_4)\)の値と一致した。
The final test used five bending points (\(M=5\)) at times \(t_0=23.4\) s, \(t_1=56.7\) s, \(t_2=67.8\) s, \(t_3=87.6\) s, and \(t_4=98.7\) s. The results were \(g_0=162.102\), \(g_1=387.876\), \(g_2=463.134\), \(g_3=597.378\), and \(g_4=672.636\), which were identical to the values of \(f(t_0)\)-\(f(t_4)\), respectively.