]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Documentation example improvement with dynamic
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Sun, 6 Dec 2020 07:20:43 +0000 (08:20 +0100)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Sun, 6 Dec 2020 07:20:43 +0000 (08:20 +0100)
doc/en/ref_algorithm_KalmanFilter.rst
doc/en/scripts/simple_KalmanFilter2.py [new file with mode: 0644]
doc/en/scripts/simple_KalmanFilter2.rst [new file with mode: 0644]
doc/fr/ref_algorithm_KalmanFilter.rst
doc/fr/scripts/simple_KalmanFilter2.py [new file with mode: 0644]
doc/fr/scripts/simple_KalmanFilter2.rst [new file with mode: 0644]

index 24de1ca80c059f6b726948d5f7816104dddc642d..eb958fb09dbefa58774ab614474557df2e240b22 100644 (file)
@@ -196,6 +196,10 @@ StoreSupplementaryCalculations
   :align: center
   :width: 90%
 
+.. include:: scripts/simple_KalmanFilter2.rst
+
+.. literalinclude:: scripts/simple_KalmanFilter2.py
+
 .. ------------------------------------ ..
 .. include:: snippets/Header2Algo06.rst
 
diff --git a/doc/en/scripts/simple_KalmanFilter2.py b/doc/en/scripts/simple_KalmanFilter2.py
new file mode 100644 (file)
index 0000000..d0acc80
--- /dev/null
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+#
+from numpy import array, random
+random.seed(1234567)
+Xtrue = -0.37727
+Yobs = []
+for i in range(51):
+    Yobs.append([random.normal(Xtrue, 0.1, size=(1,)),])
+#
+print("Estimation of a constant variable by filtering")
+print("----------------------------------------------")
+print("  Noisy measurements acquired on %i time steps"%(len(Yobs)-1,))
+print("")
+from adao import adaoBuilder
+case = adaoBuilder.New('')
+#
+case.setObservationOperator(Matrix             = [1.])
+case.setObservationError   (ScalarSparseMatrix = 0.1**2)
+#
+case.setEvolutionModel     (Matrix             = [1.])
+case.setEvolutionError     (ScalarSparseMatrix = 1e-5)
+#
+case.setAlgorithmParameters(
+    Algorithm="KalmanFilter",
+    Parameters={
+        "StoreSupplementaryCalculations":[
+            "Analysis",
+            "APosterioriCovariance",
+            ],
+        },
+    )
+#
+XaStep, VaStep = 0., 1.
+for i in range(1,len(Yobs)):
+    case.setBackground         (Vector             = "%s"%float(XaStep))
+    case.setBackgroundError    (ScalarSparseMatrix = "%s"%float(VaStep))
+    case.setObservation        (Vector             = Yobs[i])
+    case.execute( nextStep = True )
+    XaStep = case.get("Analysis")[-1]
+    VaStep = case.get("APosterioriCovariance")[-1]
+#
+Xa = case.get("Analysis")
+Pa = case.get("APosterioriCovariance")
+#
+print("")
+print("  Final a posteriori variance:",Pa[-1])
+print("")
diff --git a/doc/en/scripts/simple_KalmanFilter2.rst b/doc/en/scripts/simple_KalmanFilter2.rst
new file mode 100644 (file)
index 0000000..bdd55ae
--- /dev/null
@@ -0,0 +1,10 @@
+The Kalman filter can also be used for a **running analysis of the observations
+of a given dynamic model**. In this case, the analysis is conducted
+iteratively, at the arrival of each observation.
+
+The following example deals with the same simple dynamic system from the
+reference [Welch06]_. The essential difference consists in carrying out the
+execution of a Kalman step at the arrival of each observation provided
+iteratively. The keyword "*nextStep*", included in the execution order, allows
+to not store the background in duplicate of the previous analysis.
+
index 6153115dd6f1627f35675c6e02fc3abbdaf9779b..c84f906e1df03bc16deb04c85133a79e8e84e8c9 100644 (file)
@@ -197,6 +197,10 @@ StoreSupplementaryCalculations
   :align: center
   :width: 90%
 
+.. include:: scripts/simple_KalmanFilter2.rst
+
+.. literalinclude:: scripts/simple_KalmanFilter2.py
+
 .. ------------------------------------ ..
 .. include:: snippets/Header2Algo06.rst
 
diff --git a/doc/fr/scripts/simple_KalmanFilter2.py b/doc/fr/scripts/simple_KalmanFilter2.py
new file mode 100644 (file)
index 0000000..3b2135c
--- /dev/null
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+#
+from numpy import array, random
+random.seed(1234567)
+Xtrue = -0.37727
+Yobs = []
+for i in range(51):
+    Yobs.append([random.normal(Xtrue, 0.1, size=(1,)),])
+#
+print("Estimation par filtrage d'une variable constante")
+print("------------------------------------------------")
+print("  Observations bruitées acquises sur %i pas de temps"%(len(Yobs)-1,))
+print("")
+from adao import adaoBuilder
+case = adaoBuilder.New('')
+#
+case.setObservationOperator(Matrix             = [1.])
+case.setObservationError   (ScalarSparseMatrix = 0.1**2)
+#
+case.setEvolutionModel     (Matrix             = [1.])
+case.setEvolutionError     (ScalarSparseMatrix = 1e-5)
+#
+case.setAlgorithmParameters(
+    Algorithm="KalmanFilter",
+    Parameters={
+        "StoreSupplementaryCalculations":[
+            "Analysis",
+            "APosterioriCovariance",
+            ],
+        },
+    )
+#
+XaStep, VaStep = 0., 1.
+for i in range(1,len(Yobs)):
+    case.setBackground         (Vector             = "%s"%float(XaStep))
+    case.setBackgroundError    (ScalarSparseMatrix = "%s"%float(VaStep))
+    case.setObservation        (Vector             = Yobs[i])
+    case.execute( nextStep = True )
+    XaStep = case.get("Analysis")[-1]
+    VaStep = case.get("APosterioriCovariance")[-1]
+#
+Xa = case.get("Analysis")
+Pa = case.get("APosterioriCovariance")
+#
+print("")
+print("  Variance a posteriori finale :",Pa[-1])
+print("")
diff --git a/doc/fr/scripts/simple_KalmanFilter2.rst b/doc/fr/scripts/simple_KalmanFilter2.rst
new file mode 100644 (file)
index 0000000..21cc5a6
--- /dev/null
@@ -0,0 +1,10 @@
+Le filtre de Kalman peut aussi être utilisé pour une **analyse courante des
+observations d'un modèle dynamique donné**. Dans ce cas, l'analyse est conduite
+de manière itérative, lors de l'arrivée de chaque observation.
+
+L'exemple suivant porte sur le même système dynamique simple issu de la
+référence [Welch06]_. La différence essentielle consiste à effectuer
+l'exécution d'une étape de Kalman à l'arrivée de chaque observation fournie
+itérativement. Le mot-clé "*nextStep*", inclut dans l'ordre d'exécution, permet
+de ne pas stocker l'ébauche en double de l'analyse précédente.
+