]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Documentation example improvement with figures
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Wed, 2 Dec 2020 20:11:37 +0000 (21:11 +0100)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Wed, 2 Dec 2020 20:11:37 +0000 (21:11 +0100)
doc/en/ref_algorithm_KalmanFilter.rst
doc/en/scripts/simple_KalmanFilter1.py
doc/en/scripts/simple_KalmanFilter1.rst
doc/en/scripts/simple_KalmanFilter1_state.png [new file with mode: 0644]
doc/en/scripts/simple_KalmanFilter1_variance.png [new file with mode: 0644]
doc/en/snippets/Header2Algo11.rst [new file with mode: 0644]
doc/fr/ref_algorithm_KalmanFilter.rst
doc/fr/scripts/simple_KalmanFilter1.py
doc/fr/scripts/simple_KalmanFilter1.rst
doc/fr/snippets/Header2Algo11.rst [new file with mode: 0644]

index 83050e14c5815256a771565dcabc16d65c94a56f..24de1ca80c059f6b726948d5f7816104dddc642d 100644 (file)
@@ -184,6 +184,18 @@ StoreSupplementaryCalculations
 
 .. literalinclude:: scripts/simple_KalmanFilter1.res
 
+.. include:: snippets/Header2Algo11.rst
+
+.. _simple_KalmanFilter1_state:
+.. image:: scripts/simple_KalmanFilter1_state.png
+  :align: center
+  :width: 90%
+
+.. _simple_KalmanFilter1_variance:
+.. image:: scripts/simple_KalmanFilter1_variance.png
+  :align: center
+  :width: 90%
+
 .. ------------------------------------ ..
 .. include:: snippets/Header2Algo06.rst
 
index fa5322a8cd23a5904f49ff7b1ead9a3a3691909e..1a2cb5af67dca4ceacd3b71a5a130db8b3caf7cd 100644 (file)
@@ -45,3 +45,31 @@ Pa = case.get("APosterioriCovariance")
 print("")
 print("  Final a posteriori variance:",Pa[-1])
 print("")
+#
+#-------------------------------------------------------------------------------
+#
+Observations = array([yo[0]   for yo in Yobs])
+Estimates    = array([xa[0]   for xa in case.get("Analysis")])
+Variances    = array([pa[0,0] for pa in case.get("APosterioriCovariance")])
+#
+import matplotlib.pyplot as plt
+plt.rcParams['figure.figsize'] = (10, 4)
+#
+plt.figure()
+plt.plot(Observations,'kx',label='Noisy measurements')
+plt.plot(Estimates,'r-',label='Estimated state')
+plt.axhline(Xtrue,color='b',label='Truth value')
+plt.legend()
+plt.title('Estimate of the state', fontweight='bold')
+plt.xlabel('Observation step')
+plt.ylabel('Voltage')
+plt.savefig("simple_KalmanFilter1_state.png")
+#
+plt.figure()
+iobs = range(1,len(Observations))
+plt.plot(iobs,Variances[iobs],label='A posteriori error variance')
+plt.title('Estimate of the a posteriori error variance', fontweight='bold')
+plt.xlabel('Observation step')
+plt.ylabel('$(Voltage)^2$')
+plt.setp(plt.gca(),'ylim',[0,.01])
+plt.savefig("simple_KalmanFilter1_variance.png")
index 3b2282a33025ba241c2086b64fe89864a5bc0416..f6423e74f542dd621fccde38294b2a72e0d389a3 100644 (file)
@@ -6,3 +6,22 @@ is already known at the beginning of the time windows that it is called
 *reanalysis*, even if the iterative analysis keeps unkown the future
 observations at a given time step.
 
+This example describes iterative estimation of a constant physical quantity (a
+voltage) following seminal example of [Welch06]_ (pages 11 and following, also
+available in the SciPy Cookbook). This model allows to illustrate the excellent
+behavior of this algorithm with respect to the measurement noise when the
+evolution model is simple. The physical problem is the estimation of the
+voltage, observed on 50 time steps, with noise, which imply 50 analysis steps
+by the filter. The idealized state (said the "true" value, unknown in a real
+case) is specified as ``Xtrue`` in the example. The observations
+:math:`\mathbf{y}^o` (denoted by ``Yobs`` in the example) are to be set, using
+the keyword "*VectorSerie*", as a measure time series. We choose to emphasize
+the observations versus the background, by setting a great value for the
+background error variance with respect to the observation error variance. The
+first observation is not used because the background :math:`\mathbf{x}^b` is
+used as the first state estimate.
+
+The adjustment is carried out by displaying intermediate results during
+iterative filtering. Using these intermediate results, one can also obtain
+figures that illustrate the state estimation and the associated *a posteriori*
+covariance estimation.
diff --git a/doc/en/scripts/simple_KalmanFilter1_state.png b/doc/en/scripts/simple_KalmanFilter1_state.png
new file mode 100644 (file)
index 0000000..fce0c7c
Binary files /dev/null and b/doc/en/scripts/simple_KalmanFilter1_state.png differ
diff --git a/doc/en/scripts/simple_KalmanFilter1_variance.png b/doc/en/scripts/simple_KalmanFilter1_variance.png
new file mode 100644 (file)
index 0000000..9b13815
Binary files /dev/null and b/doc/en/scripts/simple_KalmanFilter1_variance.png differ
diff --git a/doc/en/snippets/Header2Algo11.rst b/doc/en/snippets/Header2Algo11.rst
new file mode 100644 (file)
index 0000000..0c4db3c
--- /dev/null
@@ -0,0 +1 @@
+The figures illustrating the result of its execution are as follows:
index 656c85a5ca13ed3d548cbbc78c480bb7ed30af83..6153115dd6f1627f35675c6e02fc3abbdaf9779b 100644 (file)
@@ -185,6 +185,18 @@ StoreSupplementaryCalculations
 
 .. literalinclude:: scripts/simple_KalmanFilter1.res
 
+.. include:: snippets/Header2Algo11.rst
+
+.. _simple_KalmanFilter1_state:
+.. image:: scripts/simple_KalmanFilter1_state.png
+  :align: center
+  :width: 90%
+
+.. _simple_KalmanFilter1_variance:
+.. image:: scripts/simple_KalmanFilter1_variance.png
+  :align: center
+  :width: 90%
+
 .. ------------------------------------ ..
 .. include:: snippets/Header2Algo06.rst
 
index 71f6c700c422ef91b76b99da3c8cc67f3641fafa..adf31076731aa3c75377625f4a3d1af5b055c509 100644 (file)
@@ -45,3 +45,31 @@ Pa = case.get("APosterioriCovariance")
 print("")
 print("  Variance a posteriori finale :",Pa[-1])
 print("")
+#
+#-------------------------------------------------------------------------------
+#
+Observations = array([yo[0]   for yo in Yobs])
+Estimates    = array([xa[0]   for xa in case.get("Analysis")])
+Variances    = array([pa[0,0] for pa in case.get("APosterioriCovariance")])
+#
+import matplotlib.pyplot as plt
+plt.rcParams['figure.figsize'] = (10, 4)
+#
+plt.figure()
+plt.plot(Observations,'kx',label='Mesures bruitées')
+plt.plot(Estimates,'r-',label='État estimé')
+plt.axhline(Xtrue,color='b',label='Valeur vraie')
+plt.legend()
+plt.title('Estimation de l\'état', fontweight='bold')
+plt.xlabel('Pas d\'observation')
+plt.ylabel('Tension')
+plt.savefig("simple_KalmanFilter1_state.png")
+#
+plt.figure()
+iobs = range(1,len(Observations))
+plt.plot(iobs,Variances[iobs],label='Variance d\'erreur a posteriori')
+plt.title('Estimation de la variance d\'erreur a posteriori', fontweight='bold')
+plt.xlabel('Pas d\'observation')
+plt.ylabel('$(Tension)^2$')
+plt.setp(plt.gca(),'ylim',[0,.01])
+plt.savefig("simple_KalmanFilter1_variance.png")
index b71f2b8b087c2def2750df994480a468b40435da..3fc4fa9a33aa37fc914ebe2bf70dd7b5bbede5a6 100644 (file)
@@ -6,3 +6,23 @@ complet de l'observation est déjà connu au début des fenêtres temporelles qu
 parle de *réanalyse*, même si l'analyse itérative conserve inconnues les
 observations futures à un pas de temps donné.
 
+Cet exemple décrit l'estimation itérative d'une quantité physique constante
+(une tension électrique) selon l'exemple de [Welch06]_ (pages 11 et suivantes,
+aussi disponible dans le SciPy Cookbook). Ce modèle permet d'illustrer
+l'excellent comportement de cet algorithme vis-à-vis du bruit de mesure lorsque
+le modèle d'évolution est simple. Le problème physique est l'estimation d'une
+tension électrique, observée sur 50 pas de temps, avec du bruit, ce qui
+implique ensuite 50 étapes d'analyses par le filtre. L'état idéalisé (valeur
+dite "vraie", inconnu dans un cas réel) est désigné par ``Xtrue`` dans
+l'exemple. Les observations :math:`\mathbf{y}^o` (désignée par ``Yobs`` dans
+l'exemple) sont à renseigner, en utilisant le mot-clé "*VectorSerie*", comme
+une série chronologique de mesures. On privilégie les observations au détriment
+de l'ébauche, par l'indication d'une importante variance d'erreur d'ébauche par
+rapport à la variance d'erreur d'observation. La première observation n'est pas
+utilisée car l'ébauche :math:`\mathbf{x}^b` sert de première estimation de
+l'état.
+
+L'estimation s'effectue en affichant des résultats intermédiaires lors du
+filtrage itératif. Grâce à ces informations intermédiaires, on peut aussi
+obtenir les graphiques illustrant l'estimation de l'état et de la covariance
+d'erreur a posteriori associée.
diff --git a/doc/fr/snippets/Header2Algo11.rst b/doc/fr/snippets/Header2Algo11.rst
new file mode 100644 (file)
index 0000000..5f1ef1a
--- /dev/null
@@ -0,0 +1 @@
+Les graphiques illustrant le résultat de son exécution sont les suivants :