# Engineering Applications of Adaptive Kalman Filtering Based on Singular Value Decomposition (SVD)
## 5 Numerical Experiments: Applications in Navigation
In each run, the dynamic state real trajectory was \(x_{k}^{true},\ k=1,\ldots,K\); the estimated dynamic state path was \(\hat{x}_{k/k},\ k=1,\ldots,K\); and the root mean square error (RMSE) of the state vector for each component is given as follows [22]:  
\[\mathrm{RMSE}_{\mathrm{xi}}=\sqrt{\frac{1}{\mathrm{MK}}\sum_{i=1}^{M}\sum_{j=1 }^{k}\left(x_{k}^{true}-\hat{x}_{k/k}\right)^{2}}. \tag{45}\]Examples 2 and 3 use a GPS configuration loaded as Yuma ephemeris data from a GPS satellite from March 2014, downloaded from the US Coast Guard site YUMA Almanac [2]. **Example 2**. : _The following example shows a navigation simulation with a dual-frequency GPS receiver on a 100 km-long figure-8 track for 1 h with signal outages of 1 min each. The problem is taken from [PERSON] and Andrews, and it is significant as it shows the filter's observational behavior [2]. The state vector corresponds to nine host vehicle model dynamic variables and two receiver clock error variables. The nine host vehicle variables are: east error (m), north error (m), altitude error (m), east velocity error (m/s), north velocity error (m/s), altitude rate error (m/s), east acceleration error (m), north acceleration error (m), and upward acceleration error (m). The MATLAB m-file solves the Riccati equation with a dynamic coefficient matrix structure [2], where the 9 \(\times\) 9 matrix corresponds to the host vehicle dynamics and the 2 \(\times\) 2 to the clock error._  
\[\left[ \begin{array}{cccc}9\times 9&\cdots&0\\ \vdots&\ddots&\vdots\\ 0&\cdots&2\times 2\end{array} \right] \tag{46}\]  
Table 1 summarizes the outcome for a simulation using real ephemeris GPS data and an ill-conditioned intermediate result where \(R^{-1}=HPH^{T}+R\) for inversion in the Kalman gain formula in Equation (8). The example does not make use of the Algorithm 1 adaptive computation from Equations (29) and (30), and the resulting algorithm is called K-SVD. The results in Table 1 show that the conventional KF is not suitable to gracefully handle round-off errors, and other filter methods can be used to better handle the round-off issue. A large \(\delta\) corresponds to a well-conditioned state. Once degradation happens, some of the filters decay faster than the K-SVD. The filter robustness can then be obtained by comparing the outcomes shown in Table 1 against those with the worst performance. The threshold where the filter can handle the error is reached when the algorithm produces \"NaN,\" or not a number, and this happens when the conventional KF is at \(\delta=10^{-10}\). A comparison of the K-SVD with SQR-KF and UD-KF shows that the K-SVD algorithm is superior in handling round-off errors. UD-KF is slightly better than SQR-KF, and the conventional KF performs as well as the other two. Regarding the execution time, K-SVD and conventional KF are slower than SQRT and UD, and this is because SVD is computationally more costly than Cholesky decomposition [22]. However, SVD is suitable for parallel computing and has a better numerical stability. Figure 1: Degradation of observational updates with the problem conditioning of the Riccati equation. **Example 3**. : _To compare and evaluate the performance of the new algorithm with conventional KF implementations, we include example 3, which is taken from [2]. The example is a comparison of the GNSS navigation performance with four vehicle tracking models, using a simulated racetrack with a 1.5 km figure-8 track at 90, 140, 240, and 360 kph average speed and a nominal low-cost clock, with a relative stability of \(1\times 10^{-9}\) part/part over 1 s. The number of states in the KF model varies as satellites come into and fall from view. The vehicle states (position, velocity, and acceleration) are as follows: position north, position east, position up (vertical), velocity north, velocity east, velocity vertical, acceleration north, acceleration east, acceleration vertical.