Salome HOME
Documentation update
[modules/adao.git] / doc / fr / ref_algorithm_KalmanFilter.rst
1 ..
2    Copyright (C) 2008-2023 EDF R&D
3
4    This file is part of SALOME ADAO module.
5
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.
10
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.
15
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
19
20    See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21
22    Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
23
24 .. index:: single: KalmanFilter
25 .. _section_ref_algorithm_KalmanFilter:
26
27 Algorithme de calcul "*KalmanFilter*"
28 -------------------------------------
29
30 .. ------------------------------------ ..
31 .. include:: snippets/Header2Algo01.rst
32
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.
43
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`.
48
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
52 itératif discret :
53
54   .. _schema_temporel_KF:
55   .. image:: images/schema_temporel_KF.png
56     :align: center
57     :width: 100%
58   .. centered::
59     **Schéma temporel des étapes en assimilation de données par filtre de Kalman**
60
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.
67
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.
73
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`.
80
81 .. ------------------------------------ ..
82 .. include:: snippets/Header2Algo02.rst
83
84 .. include:: snippets/Background.rst
85
86 .. include:: snippets/BackgroundError.rst
87
88 .. include:: snippets/EvolutionError.rst
89
90 .. include:: snippets/EvolutionModel.rst
91
92 .. include:: snippets/Observation.rst
93
94 .. include:: snippets/ObservationError.rst
95
96 .. include:: snippets/ObservationOperator.rst
97
98 .. ------------------------------------ ..
99 .. include:: snippets/Header2Algo03AdOp.rst
100
101 .. include:: snippets/EstimationOf_State.rst
102
103 StoreSupplementaryCalculations
104   .. index:: single: StoreSupplementaryCalculations
105
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*") : [
116   "Analysis",
117   "APosterioriCorrelations",
118   "APosterioriCovariance",
119   "APosterioriStandardDeviations",
120   "APosterioriVariances",
121   "BMA",
122   "CostFunctionJ",
123   "CostFunctionJAtCurrentOptimum",
124   "CostFunctionJb",
125   "CostFunctionJbAtCurrentOptimum",
126   "CostFunctionJo",
127   "CostFunctionJoAtCurrentOptimum",
128   "CurrentOptimum",
129   "CurrentState",
130   "CurrentStepNumber",
131   "ForecastCovariance",
132   "ForecastState",
133   "IndexOfOptimum",
134   "InnovationAtCurrentAnalysis",
135   "InnovationAtCurrentState",
136   "SimulatedObservationAtCurrentAnalysis",
137   "SimulatedObservationAtCurrentOptimum",
138   "SimulatedObservationAtCurrentState",
139   ].
140
141   Exemple :
142   ``{"StoreSupplementaryCalculations":["CurrentState", "Residu"]}``
143
144 .. ------------------------------------ ..
145 .. include:: snippets/Header2Algo04.rst
146
147 .. include:: snippets/Analysis.rst
148
149 .. ------------------------------------ ..
150 .. include:: snippets/Header2Algo05.rst
151
152 .. include:: snippets/Analysis.rst
153
154 .. include:: snippets/APosterioriCorrelations.rst
155
156 .. include:: snippets/APosterioriCovariance.rst
157
158 .. include:: snippets/APosterioriStandardDeviations.rst
159
160 .. include:: snippets/APosterioriVariances.rst
161
162 .. include:: snippets/BMA.rst
163
164 .. include:: snippets/CostFunctionJ.rst
165
166 .. include:: snippets/CostFunctionJAtCurrentOptimum.rst
167
168 .. include:: snippets/CostFunctionJb.rst
169
170 .. include:: snippets/CostFunctionJbAtCurrentOptimum.rst
171
172 .. include:: snippets/CostFunctionJo.rst
173
174 .. include:: snippets/CostFunctionJoAtCurrentOptimum.rst
175
176 .. include:: snippets/CurrentOptimum.rst
177
178 .. include:: snippets/CurrentState.rst
179
180 .. include:: snippets/CurrentStepNumber.rst
181
182 .. include:: snippets/ForecastCovariance.rst
183
184 .. include:: snippets/ForecastState.rst
185
186 .. include:: snippets/IndexOfOptimum.rst
187
188 .. include:: snippets/InnovationAtCurrentAnalysis.rst
189
190 .. include:: snippets/InnovationAtCurrentState.rst
191
192 .. include:: snippets/SimulatedObservationAtCurrentAnalysis.rst
193
194 .. include:: snippets/SimulatedObservationAtCurrentOptimum.rst
195
196 .. include:: snippets/SimulatedObservationAtCurrentState.rst
197
198 .. ------------------------------------ ..
199 .. _section_ref_algorithm_KalmanFilter_examples:
200 .. include:: snippets/Header2Algo09.rst
201
202 .. --------- ..
203 .. include:: scripts/simple_KalmanFilter1.rst
204
205 .. literalinclude:: scripts/simple_KalmanFilter1.py
206
207 .. include:: snippets/Header2Algo10.rst
208
209 .. literalinclude:: scripts/simple_KalmanFilter1.res
210     :language: none
211
212 .. include:: snippets/Header2Algo11.rst
213
214 .. _simple_KalmanFilter1_state:
215 .. image:: scripts/simple_KalmanFilter1_state.png
216   :align: center
217   :width: 90%
218
219 .. _simple_KalmanFilter1_variance:
220 .. image:: scripts/simple_KalmanFilter1_variance.png
221   :align: center
222   :width: 90%
223
224 .. --------- ..
225 .. include:: scripts/simple_KalmanFilter2.rst
226
227 .. literalinclude:: scripts/simple_KalmanFilter2.py
228
229 .. include:: snippets/Header2Algo10.rst
230
231 .. literalinclude:: scripts/simple_KalmanFilter2.res
232     :language: none
233
234 .. include:: snippets/Header2Algo11.rst
235
236 .. _simple_KalmanFilter2_state:
237 .. image:: scripts/simple_KalmanFilter2_state.png
238   :align: center
239   :width: 90%
240
241 .. _simple_KalmanFilter2_variance:
242 .. image:: scripts/simple_KalmanFilter2_variance.png
243   :align: center
244   :width: 90%
245
246 .. ------------------------------------ ..
247 .. include:: snippets/Header2Algo06.rst
248
249 - :ref:`section_ref_algorithm_ExtendedKalmanFilter`
250 - :ref:`section_ref_algorithm_EnsembleKalmanFilter`
251 - :ref:`section_ref_algorithm_UnscentedKalmanFilter`
252
253 .. ------------------------------------ ..
254 .. include:: snippets/Header2Algo07.rst
255
256 - [Welch06]_
257 - [WikipediaKF]_