2 Copyright (C) 2008-2024 EDF R&D
4 This file is part of SALOME ADAO module.
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
24 .. index:: single: UnscentedKalmanFilter
25 .. _section_ref_algorithm_UnscentedKalmanFilter:
27 Calculation algorithm "*UnscentedKalmanFilter*"
28 -----------------------------------------------
30 .. ------------------------------------ ..
31 .. include:: snippets/Header2Algo01.rst
33 This algorithm realizes an estimation of the state of a dynamic system by a
34 Kalman Filter using an "unscented" transform and a sampling by "sigma" points,
35 avoiding to have to perform the tangent and adjoint operators for the
36 observation and evolution operators, as in the simple or extended Kalman
39 It applies to non-linear observation and incremental evolution (process)
40 operators with excellent robustness and performance qualities. It can be
41 compared to the :ref:`section_ref_algorithm_EnsembleKalmanFilter`, whose
42 qualities are similar for non-linear systems.
44 We notice that there is no analysis performed at the initial time step
45 (numbered 0 in the time indexing) because there is no forecast at this time
46 (the background is stored as a pseudo analysis at the initial time step). If
47 the observations are provided in series by the user, the first one is therefore
48 not used. For a good understanding of time management, please refer to the
49 :ref:`schema_d_AD_temporel` and the explanations in the section
50 :ref:`section_theory_dynamic`.
52 In case of linear of "slightly" non-linear operators, one can easily use the
53 :ref:`section_ref_algorithm_ExtendedKalmanFilter` or even the
54 :ref:`section_ref_algorithm_KalmanFilter`, which are often far less expensive
55 to evaluate on small systems. One can verify the linearity of the operators
56 with the help of the :ref:`section_ref_algorithm_LinearityTest`.
58 There exists various variants of this algorithm. The following stable and
59 robust formulations are proposed here:
68 - "UKF" (Unscented Kalman Filter, see [Julier95]_, [Julier00]_, [Wan00]_),
69 original and reference canonical algorithm, highly robust and efficient,
70 - "CUKF", also named "2UKF" (Constrained Unscented Kalman Filter, see
71 [Julier07]_), inequality or boundary constrained version of the algorithm
73 - "S3F" (Scaled Spherical Simplex Filter, see [Papakonstantinou22]_),
74 improved algorithm, reducing the number of sampling (sigma) points to achieve
75 the same quality as the canonical "UKF" variant,
76 - "CS3F" (Constrained Scaled Spherical Simplex Filter), inequality or boundary
77 constrained version of the algorithm "S3F".
79 The following are a few practical suggestions for the effective use of these
82 - The recommended variant of this algorithm is the "S3F" even if the canonical
83 "UKF" algorithm remains by default the more robust one.
84 - When there are no defined bounds, the constraint-aware versions of the
85 algorithms are identical to the unconstrained versions. This is not the case
86 if constraints are defined, even if the bounds are very wide.
87 - An essential difference between the algorithms is the number of sampling
88 "sigma" points used, depending on the :math:`n` dimension of the state space.
89 The canonical "UKF" algorithm uses :math:`2n+1`, the "S3F" algorithm uses
90 :math:`n+2`. This means that about twice as many evaluations of the function to
91 be simulated are required for one as for the other.
92 - The evaluations of the function to be simulated are algorithmically
93 independent at each filtering stage (evolution or observation) and can
94 therefore be parallelized or distributed if the function to be simulated
97 .. ------------------------------------ ..
98 .. include:: snippets/Header2Algo12.rst
100 .. include:: snippets/FeaturePropLocalOptimization.rst
102 .. include:: snippets/FeaturePropDerivativeFree.rst
104 .. include:: snippets/FeaturePropParallelAlgorithm.rst
106 .. ------------------------------------ ..
107 .. include:: snippets/Header2Algo02.rst
109 .. include:: snippets/Background.rst
111 .. include:: snippets/BackgroundError.rst
113 .. include:: snippets/EvolutionError.rst
115 .. include:: snippets/EvolutionModel.rst
117 .. include:: snippets/Observation.rst
119 .. include:: snippets/ObservationError.rst
121 .. include:: snippets/ObservationOperator.rst
123 .. ------------------------------------ ..
124 .. include:: snippets/Header2Algo03AdOp.rst
126 .. include:: snippets/BoundsWithNone.rst
128 .. include:: snippets/ConstrainedBy.rst
130 .. include:: snippets/EstimationOf_State.rst
132 .. include:: snippets/AlphaBeta.rst
134 StoreSupplementaryCalculations
135 .. index:: single: StoreSupplementaryCalculations
137 *List of names*. This list indicates the names of the supplementary
138 variables, that can be available during or at the end of the algorithm, if
139 they are initially required by the user. Their availability involves,
140 potentially, costly calculations or memory consumptions. The default is then
141 a void list, none of these variables being calculated and stored by default
142 (excepted the unconditional variables). The possible names are in the
143 following list (the detailed description of each named variable is given in
144 the following part of this specific algorithmic documentation, in the
145 sub-section "*Information and variables available at the end of the
148 "APosterioriCorrelations",
149 "APosterioriCovariance",
150 "APosterioriStandardDeviations",
151 "APosterioriVariances",
154 "CostFunctionJAtCurrentOptimum",
156 "CostFunctionJbAtCurrentOptimum",
158 "CostFunctionJoAtCurrentOptimum",
161 "ForecastCovariance",
164 "InnovationAtCurrentAnalysis",
165 "InnovationAtCurrentState",
166 "SimulatedObservationAtCurrentAnalysis",
167 "SimulatedObservationAtCurrentOptimum",
168 "SimulatedObservationAtCurrentState",
172 ``{"StoreSupplementaryCalculations":["CurrentState", "Residu"]}``
174 .. include:: snippets/Variant_UKF.rst
176 .. ------------------------------------ ..
177 .. include:: snippets/Header2Algo04.rst
179 .. include:: snippets/Analysis.rst
181 .. ------------------------------------ ..
182 .. include:: snippets/Header2Algo05.rst
184 .. include:: snippets/Analysis.rst
186 .. include:: snippets/APosterioriCorrelations.rst
188 .. include:: snippets/APosterioriCovariance.rst
190 .. include:: snippets/APosterioriStandardDeviations.rst
192 .. include:: snippets/APosterioriVariances.rst
194 .. include:: snippets/BMA.rst
196 .. include:: snippets/CostFunctionJ.rst
198 .. include:: snippets/CostFunctionJAtCurrentOptimum.rst
200 .. include:: snippets/CostFunctionJb.rst
202 .. include:: snippets/CostFunctionJbAtCurrentOptimum.rst
204 .. include:: snippets/CostFunctionJo.rst
206 .. include:: snippets/CostFunctionJoAtCurrentOptimum.rst
208 .. include:: snippets/CurrentOptimum.rst
210 .. include:: snippets/CurrentState.rst
212 .. include:: snippets/ForecastCovariance.rst
214 .. include:: snippets/ForecastState.rst
216 .. include:: snippets/IndexOfOptimum.rst
218 .. include:: snippets/InnovationAtCurrentAnalysis.rst
220 .. include:: snippets/InnovationAtCurrentState.rst
222 .. include:: snippets/SimulatedObservationAtCurrentAnalysis.rst
224 .. include:: snippets/SimulatedObservationAtCurrentOptimum.rst
226 .. include:: snippets/SimulatedObservationAtCurrentState.rst
228 .. ------------------------------------ ..
229 .. _section_ref_algorithm_UnscentedKalmanFilter_examples:
231 .. include:: snippets/Header2Algo06.rst
233 - :ref:`section_ref_algorithm_KalmanFilter`
234 - :ref:`section_ref_algorithm_ExtendedKalmanFilter`
235 - :ref:`section_ref_algorithm_EnsembleKalmanFilter`
237 .. ------------------------------------ ..
238 .. include:: snippets/Header2Algo07.rst
243 - [Papakonstantinou22]_