From dd94d7c1ba3dcd186cf8e8de6912efca4de00905 Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Wed, 2 Dec 2020 21:11:37 +0100 Subject: [PATCH] Documentation example improvement with figures --- doc/en/ref_algorithm_KalmanFilter.rst | 12 ++++++++ doc/en/scripts/simple_KalmanFilter1.py | 28 ++++++++++++++++++ doc/en/scripts/simple_KalmanFilter1.rst | 19 ++++++++++++ doc/en/scripts/simple_KalmanFilter1_state.png | Bin 0 -> 31855 bytes .../scripts/simple_KalmanFilter1_variance.png | Bin 0 -> 25847 bytes doc/en/snippets/Header2Algo11.rst | 1 + doc/fr/ref_algorithm_KalmanFilter.rst | 12 ++++++++ doc/fr/scripts/simple_KalmanFilter1.py | 28 ++++++++++++++++++ doc/fr/scripts/simple_KalmanFilter1.rst | 20 +++++++++++++ doc/fr/snippets/Header2Algo11.rst | 1 + 10 files changed, 121 insertions(+) create mode 100644 doc/en/scripts/simple_KalmanFilter1_state.png create mode 100644 doc/en/scripts/simple_KalmanFilter1_variance.png create mode 100644 doc/en/snippets/Header2Algo11.rst create mode 100644 doc/fr/snippets/Header2Algo11.rst diff --git a/doc/en/ref_algorithm_KalmanFilter.rst b/doc/en/ref_algorithm_KalmanFilter.rst index 83050e1..24de1ca 100644 --- a/doc/en/ref_algorithm_KalmanFilter.rst +++ b/doc/en/ref_algorithm_KalmanFilter.rst @@ -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 diff --git a/doc/en/scripts/simple_KalmanFilter1.py b/doc/en/scripts/simple_KalmanFilter1.py index fa5322a..1a2cb5a 100644 --- a/doc/en/scripts/simple_KalmanFilter1.py +++ b/doc/en/scripts/simple_KalmanFilter1.py @@ -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") diff --git a/doc/en/scripts/simple_KalmanFilter1.rst b/doc/en/scripts/simple_KalmanFilter1.rst index 3b2282a..f6423e7 100644 --- a/doc/en/scripts/simple_KalmanFilter1.rst +++ b/doc/en/scripts/simple_KalmanFilter1.rst @@ -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 index 0000000000000000000000000000000000000000..fce0c7cf39a3e8c75413b35669f500e57de93a01 GIT binary patch literal 31855 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 z zo=S>n7*uA3BL)d?+B;FSQW_c>>E$$pIG(`r5Kx=ya~cNN)p)YbO}pBGx#8^81CSmT zT=d0WD!&a)0;gUu;P{!wvlDI>5VdQaIgyJ1Dz7`)8$Hv}-EEhHwnfKCvd2@^4+q=7;{IGCQY1#`XYqjeL zc(k6Zy9Dfin;HQ zNaOXFJXS(b8&e<&&~OsBGm+Jy!qmm_>e9ht+lIq;P=;gaL6Xo1dEx=kVc3x}ASB3W zX(jY5JFkuo{yq!eoNbTTgQBXv0A%?ZDiqkG;uus+HdH7KoWhvgb805(+qZ*Aq+xsL zL8T833_O?bc!5q>qi(C~I<|q;&SL+}e4-&GFu>W*7ceAOChNz3HMmVlL<|}F=$Bay zsko1S)c*@z^1a}y%ur{63kMJGy}4x-4sa5<{VQ>=8aqcvvZbY^f$jA4bm_t&g3=KV zn|z>;P}F{zB<};?BL}2X^!{*n$gooQj;m`GwWw=R&;Cy-=H1tfXm@g`#8(4J{5cnS z-w4{H8xCd&IP`1C0eAvEA+uW=V17<3bP;vKZdy_~Sy*%Q3_hnF9-YVP2S<{)7Y#73 z7JyjYYjb=nGb%FC*Mx;>V8}zm!u+6@85~VZCb8I*{+F1$!E}IVZiJIRUehvE`?XN5K5?|&ggz_vcCx=r~ zT3T$}cAoGO?_ByVev3ZI8pAwwX6Vbv4{444rKGH?DWF^6AhpQF#bs%4@PXma@oL8b zo(M|LmeO8v0z*T?s@htU&RFJwfwalV$Jq0Y|K~Kf&I8ku zgX(s}ZEH@N)sY!0Qa50v6&+wCPsgkLhKIG04bdyQO;}+);twnj3x%}q-3VEEc|5H` zgGj&yOfZmu3R_{i`!Zw+stsCZ0jOlOBW35(O*6*p*9mAM-+gZpLLmYe%)To?i0x;$ zsQ7>3kOqCQ&@Irt1@zk(fbDR#Bdc6AeI$q!B(OdG;^N5QNq?@aJO>S@X=LQm>({Sc zp*S$;X2!+EIT>cF>xflYcXxJTpq6^q8_(!f#dco~dP5sR`2tBbhL!Q^ra2LiT5K2x z&x4;Kg035BW$Pu6yKg)l7i?{BHvugC3JRF>%CH|4v6kj$rm3SB$;ruuYv(E0wZ*=6 zc1nS!R19e8MJ>t(BhTXaZNAfI?8me43(SOU~cr_WoLs0~iM~nZ-?VAOl z2MwLyeaGTCz1Zk4#|rN!ixag1?)z&ef%)vrv;nXPn=SYhe~Q8g$z>L6-2Q{h;OPsC zBOSV~)>weQ{{|puJsTx?c}dvU=V=+%fBy~#IF|``Lw(bX5auHUx*39qka7tkX_55^ zub_y?6(~Qg=Dx)L;53-AK-icgB4V<{{=r0B~l1Kq0^;VB1oiwTb=Qw&bIED|Q9gAt?n#5Wt(VC*N?O zBC%izlah*&V+nVLa4yR1gmRFz=+u0si;XI*-=q0GR7i{(hC&eMTIEEV@(La7f>0DwY4>BJ_{1)IzfdEf6fB|xou>`n80lq1uc#V zkOS()%a?&LSF|9FA0*aT$Rujq*h>0BFdq(7}R$ZvBKl@)=fE6kr-ET|KBa zeeX4|@2rfFK|PV4sCi~T-$em>9=4dr-j^ZfhFrzpb)fD7hHZs@IK8$;WNT{+sEQ9j zkgCK9ALwSq(0`WJqeDY;Z@?PZLiWm?4I@F^5A9i0W#`7?-p@Bb9lQI6uNfL+vHPy2 z==PVJ>IK+6H6KCvFzvip_H=^g0u5i&NB!EOC*N2!%651$5s^ADFfi@uM2)JocHF#I zGC)Nbt?0hKd)A|63g@Q*e77ob*9XFYms#{<3OpSzvb^i!==cc~y3MU_?o3#72o(Ap zMHfMOMGl36u0RSqxHFD5Q>WCd>e+Gv`6NN6dS21vZc1b$-wq~}f>lX!=~5U06&HC; zxWbcUmw_w=z%mFwC@kcLb$2dOE�hExEK#aIRBcgtH)G)_9oFOtTb+zV^L`K(qQ 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 L%U#bq2k-n(Uz73j literal 0 HcmV?d00001 diff --git a/doc/en/snippets/Header2Algo11.rst b/doc/en/snippets/Header2Algo11.rst new file mode 100644 index 0000000..0c4db3c --- /dev/null +++ b/doc/en/snippets/Header2Algo11.rst @@ -0,0 +1 @@ +The figures illustrating the result of its execution are as follows: diff --git a/doc/fr/ref_algorithm_KalmanFilter.rst b/doc/fr/ref_algorithm_KalmanFilter.rst index 656c85a..6153115 100644 --- a/doc/fr/ref_algorithm_KalmanFilter.rst +++ b/doc/fr/ref_algorithm_KalmanFilter.rst @@ -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 diff --git a/doc/fr/scripts/simple_KalmanFilter1.py b/doc/fr/scripts/simple_KalmanFilter1.py index 71f6c70..adf3107 100644 --- a/doc/fr/scripts/simple_KalmanFilter1.py +++ b/doc/fr/scripts/simple_KalmanFilter1.py @@ -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") diff --git a/doc/fr/scripts/simple_KalmanFilter1.rst b/doc/fr/scripts/simple_KalmanFilter1.rst index b71f2b8..3fc4fa9 100644 --- a/doc/fr/scripts/simple_KalmanFilter1.rst +++ b/doc/fr/scripts/simple_KalmanFilter1.rst @@ -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 index 0000000..5f1ef1a --- /dev/null +++ b/doc/fr/snippets/Header2Algo11.rst @@ -0,0 +1 @@ +Les graphiques illustrant le résultat de son exécution sont les suivants : -- 2.39.2