2 Copyright (C) 2008-2023 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: KalmanFilter
25 .. _section_ref_algorithm_KalmanFilter:
27 Algorithme de calcul "*KalmanFilter*"
28 -------------------------------------
30 .. ------------------------------------ ..
31 .. include:: snippets/Header2Algo01.rst
33 Cet algorithme réalise une estimation de l'état d'un système dynamique par un
34 filtre de Kalman. Sous forme discrète, c'est un estimateur itératif (ou
35 récursif) de l'état courant à l'aide de l'état précédent et des observations
36 actuelles. Le temps (ou pseudo-temps) entre deux pas est celui qui sépare les
37 observations successives. Chaque pas d'itération est composé de deux étapes
38 successives dites classiquement de "*prédiction*" puis de "*correction*".
39 L'étape de prédiction utilise un opérateur d'évolution incrémentale pour
40 établir une estimation de l'état courant à partir de l'état estimé au pas
41 précédent. L'étape de correction (ou de *mise à jour*) utilise les observations
42 courantes pour améliorer l'estimation en corrigeant l'état prédit.
44 Il est théoriquement réservé aux cas d'opérateurs d'observation et d'évolution
45 incrémentale (processus) linéaires, même s'il fonctionne parfois dans les cas
46 "faiblement" non-linéaire. On peut vérifier la linéarité de l'opérateur
47 d'observation à l'aide d'un :ref:`section_ref_algorithm_LinearityTest`.
49 Conceptuellement, on peut représenter le schéma temporel d'action des
50 opérateurs d'évolution et d'observation dans cet algorithme de la manière
51 suivante, avec **x** l'état, **P** la covariance d'erreur d'état, *t* le temps
54 .. _schema_temporel_KF:
55 .. image:: images/schema_temporel_KF.png
59 **Schéma temporel des étapes en assimilation de données par filtre de Kalman**
61 Dans ce schéma, l'analyse **(x,P)** est obtenue à travers la "*correction*" par
62 l'observation de la "*prévision*" de l'état précédent. On remarque qu'il n'y a
63 pas d'analyse effectuée au pas de temps initial (numéroté 0 dans l'indexage
64 temporel) car il n'y a pas de prévision à cet instant (l'ébauche est stockée
65 comme pseudo-analyse au pas initial). Si les observations sont fournies en
66 série par l'utilisateur, la première n'est donc pas utilisée.
68 Ce filtre peut aussi être utilisé pour estimer (conjointement ou uniquement)
69 des paramètres et non pas l'état, auquel cas ni le temps ni l'évolution n'ont
70 plus de signification. Les pas d'itération sont alors liés à l'insertion d'une
71 nouvelle observation dans l'estimation récursive. On consultera la section
72 :ref:`section_theory_dynamique` pour les concepts de mise en oeuvre.
74 En cas de non-linéarité des opérateurs, même peu marquée, on lui préférera un
75 :ref:`section_ref_algorithm_ExtendedKalmanFilter`, ou un
76 :ref:`section_ref_algorithm_EnsembleKalmanFilter` et un
77 :ref:`section_ref_algorithm_UnscentedKalmanFilter` qui sont plus stables,
78 supportent des bornes sur l'état, etc. On peut vérifier la linéarité des
79 opérateurs à l'aide d'un :ref:`section_ref_algorithm_LinearityTest`.
81 .. ------------------------------------ ..
82 .. include:: snippets/Header2Algo02.rst
84 .. include:: snippets/Background.rst
86 .. include:: snippets/BackgroundError.rst
88 .. include:: snippets/EvolutionError.rst
90 .. include:: snippets/EvolutionModel.rst
92 .. include:: snippets/Observation.rst
94 .. include:: snippets/ObservationError.rst
96 .. include:: snippets/ObservationOperator.rst
98 .. ------------------------------------ ..
99 .. include:: snippets/Header2Algo03AdOp.rst
101 .. include:: snippets/EstimationOf_State.rst
103 StoreSupplementaryCalculations
104 .. index:: single: StoreSupplementaryCalculations
106 *Liste de noms*. Cette liste indique les noms des variables supplémentaires,
107 qui peuvent être disponibles au cours du déroulement ou à la fin de
108 l'algorithme, si elles sont initialement demandées par l'utilisateur. Leur
109 disponibilité implique, potentiellement, des calculs ou du stockage coûteux.
110 La valeur par défaut est donc une liste vide, aucune de ces variables n'étant
111 calculée et stockée par défaut (sauf les variables inconditionnelles). Les
112 noms possibles pour les variables supplémentaires sont dans la liste suivante
113 (la description détaillée de chaque variable nommée est donnée dans la suite
114 de cette documentation par algorithme spécifique, dans la sous-partie
115 "*Informations et variables disponibles à la fin de l'algorithme*") : [
117 "APosterioriCorrelations",
118 "APosterioriCovariance",
119 "APosterioriStandardDeviations",
120 "APosterioriVariances",
123 "CostFunctionJAtCurrentOptimum",
125 "CostFunctionJbAtCurrentOptimum",
127 "CostFunctionJoAtCurrentOptimum",
131 "ForecastCovariance",
134 "InnovationAtCurrentAnalysis",
135 "InnovationAtCurrentState",
136 "SimulatedObservationAtCurrentAnalysis",
137 "SimulatedObservationAtCurrentOptimum",
138 "SimulatedObservationAtCurrentState",
142 ``{"StoreSupplementaryCalculations":["CurrentState", "Residu"]}``
144 .. ------------------------------------ ..
145 .. include:: snippets/Header2Algo04.rst
147 .. include:: snippets/Analysis.rst
149 .. ------------------------------------ ..
150 .. include:: snippets/Header2Algo05.rst
152 .. include:: snippets/Analysis.rst
154 .. include:: snippets/APosterioriCorrelations.rst
156 .. include:: snippets/APosterioriCovariance.rst
158 .. include:: snippets/APosterioriStandardDeviations.rst
160 .. include:: snippets/APosterioriVariances.rst
162 .. include:: snippets/BMA.rst
164 .. include:: snippets/CostFunctionJ.rst
166 .. include:: snippets/CostFunctionJAtCurrentOptimum.rst
168 .. include:: snippets/CostFunctionJb.rst
170 .. include:: snippets/CostFunctionJbAtCurrentOptimum.rst
172 .. include:: snippets/CostFunctionJo.rst
174 .. include:: snippets/CostFunctionJoAtCurrentOptimum.rst
176 .. include:: snippets/CurrentOptimum.rst
178 .. include:: snippets/CurrentState.rst
180 .. include:: snippets/CurrentStepNumber.rst
182 .. include:: snippets/ForecastCovariance.rst
184 .. include:: snippets/ForecastState.rst
186 .. include:: snippets/IndexOfOptimum.rst
188 .. include:: snippets/InnovationAtCurrentAnalysis.rst
190 .. include:: snippets/InnovationAtCurrentState.rst
192 .. include:: snippets/SimulatedObservationAtCurrentAnalysis.rst
194 .. include:: snippets/SimulatedObservationAtCurrentOptimum.rst
196 .. include:: snippets/SimulatedObservationAtCurrentState.rst
198 .. ------------------------------------ ..
199 .. _section_ref_algorithm_KalmanFilter_examples:
201 .. include:: snippets/Header2Algo09.rst
204 .. include:: scripts/simple_KalmanFilter1.rst
206 .. literalinclude:: scripts/simple_KalmanFilter1.py
208 .. include:: snippets/Header2Algo10.rst
210 .. literalinclude:: scripts/simple_KalmanFilter1.res
213 .. include:: snippets/Header2Algo11.rst
215 .. _simple_KalmanFilter1_state:
216 .. image:: scripts/simple_KalmanFilter1_state.png
220 .. _simple_KalmanFilter1_variance:
221 .. image:: scripts/simple_KalmanFilter1_variance.png
226 .. include:: scripts/simple_KalmanFilter2.rst
228 .. literalinclude:: scripts/simple_KalmanFilter2.py
230 .. include:: snippets/Header2Algo10.rst
232 .. literalinclude:: scripts/simple_KalmanFilter2.res
235 .. include:: snippets/Header2Algo11.rst
237 .. _simple_KalmanFilter2_state:
238 .. image:: scripts/simple_KalmanFilter2_state.png
242 .. _simple_KalmanFilter2_variance:
243 .. image:: scripts/simple_KalmanFilter2_variance.png
247 .. ------------------------------------ ..
248 .. include:: snippets/Header2Algo06.rst
250 - :ref:`section_ref_algorithm_ExtendedKalmanFilter`
251 - :ref:`section_ref_algorithm_EnsembleKalmanFilter`
252 - :ref:`section_ref_algorithm_UnscentedKalmanFilter`
254 .. ------------------------------------ ..
255 .. include:: snippets/Header2Algo07.rst