From ba40494d409b6d3a6639571e701fb7bee1c18d31 Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Fri, 25 Nov 2022 16:10:44 +0100 Subject: [PATCH] Minor documentation and code review corrections (35) --- doc/en/examples.rst | 1 + ...f_algorithm_DerivativeFreeOptimization.rst | 19 +++++ doc/en/scripts/simple_3DVAR.py | 2 + doc/en/scripts/simple_3DVAR.res | 2 + .../simple_DerivativeFreeOptimization.png | Bin 0 -> 39917 bytes .../simple_DerivativeFreeOptimization.py | 74 ++++++++++++++++++ .../simple_DerivativeFreeOptimization.res | 69 ++++++++++++++++ .../simple_DerivativeFreeOptimization.rst | 17 ++++ .../scripts/simple_NonLinearLeastSquares.py | 2 + .../scripts/simple_NonLinearLeastSquares.res | 2 + doc/fr/examples.rst | 1 + ...f_algorithm_DerivativeFreeOptimization.rst | 19 +++++ doc/fr/scripts/simple_3DVAR.py | 2 + doc/fr/scripts/simple_3DVAR.res | 2 + .../simple_DerivativeFreeOptimization.png | Bin 0 -> 40236 bytes .../simple_DerivativeFreeOptimization.py | 74 ++++++++++++++++++ .../simple_DerivativeFreeOptimization.res | 69 ++++++++++++++++ .../simple_DerivativeFreeOptimization.rst | 18 +++++ .../scripts/simple_NonLinearLeastSquares.py | 2 + .../scripts/simple_NonLinearLeastSquares.res | 2 + 20 files changed, 377 insertions(+) create mode 100644 doc/en/scripts/simple_DerivativeFreeOptimization.png create mode 100644 doc/en/scripts/simple_DerivativeFreeOptimization.py create mode 100644 doc/en/scripts/simple_DerivativeFreeOptimization.res create mode 100644 doc/en/scripts/simple_DerivativeFreeOptimization.rst create mode 100644 doc/fr/scripts/simple_DerivativeFreeOptimization.png create mode 100644 doc/fr/scripts/simple_DerivativeFreeOptimization.py create mode 100644 doc/fr/scripts/simple_DerivativeFreeOptimization.res create mode 100644 doc/fr/scripts/simple_DerivativeFreeOptimization.rst diff --git a/doc/en/examples.rst b/doc/en/examples.rst index 3c60dc0..2c822bc 100644 --- a/doc/en/examples.rst +++ b/doc/en/examples.rst @@ -45,6 +45,7 @@ Calculation algorithms uses #. :ref:`Examples with the "3DVAR" algorithm` #. :ref:`Examples with the "Blue" algorithm` +#. :ref:`Examples with the "DerivativeFreeOptimization" algorithm` #. :ref:`Examples with the "ExtendedBlue" algorithm` #. :ref:`Examples with the "KalmanFilter" algorithm` #. :ref:`Examples with the "NonLinearLeastSquares" algorithm` diff --git a/doc/en/ref_algorithm_DerivativeFreeOptimization.rst b/doc/en/ref_algorithm_DerivativeFreeOptimization.rst index 8797d45..c29e4e0 100644 --- a/doc/en/ref_algorithm_DerivativeFreeOptimization.rst +++ b/doc/en/ref_algorithm_DerivativeFreeOptimization.rst @@ -168,6 +168,25 @@ StoreSupplementaryCalculations .. ------------------------------------ .. .. _section_ref_algorithm_DerivativeFreeOptimization_examples: +.. include:: snippets/Header2Algo09.rst + +.. include:: scripts/simple_DerivativeFreeOptimization.rst + +.. literalinclude:: scripts/simple_DerivativeFreeOptimization.py + +.. include:: snippets/Header2Algo10.rst + +.. literalinclude:: scripts/simple_DerivativeFreeOptimization.res + :language: none + +.. include:: snippets/Header2Algo11.rst + +.. _simple_DerivativeFreeOptimization: +.. image:: scripts/simple_DerivativeFreeOptimization.png + :align: center + :width: 90% + +.. ------------------------------------ .. .. include:: snippets/Header2Algo06.rst - :ref:`section_ref_algorithm_ParticleSwarmOptimization` diff --git a/doc/en/scripts/simple_3DVAR.py b/doc/en/scripts/simple_3DVAR.py index a87ecdc..65a390d 100644 --- a/doc/en/scripts/simple_3DVAR.py +++ b/doc/en/scripts/simple_3DVAR.py @@ -55,6 +55,8 @@ print("A priori background state..........:", ravel(case.get('Background'))) print("") print("Expected theoretical coefficients..:", ravel((2,-1,2))) print("") +print("Number of iterations...............:", len(case.get('CurrentState'))) +print("Number of simulations..............:", len(case.get('CurrentState'))*4) print("Calibration resulting coefficients.:", ravel(case.get('Analysis')[-1])) # Xa = case.get('Analysis')[-1] diff --git a/doc/en/scripts/simple_3DVAR.res b/doc/en/scripts/simple_3DVAR.res index aaa1c4c..8713620 100644 --- a/doc/en/scripts/simple_3DVAR.res +++ b/doc/en/scripts/simple_3DVAR.res @@ -35,4 +35,6 @@ A priori background state..........: [1. 1. 1.] Expected theoretical coefficients..: [ 2 -1 2] +Number of iterations...............: 25 +Number of simulations..............: 100 Calibration resulting coefficients.: [ 2. -0.99999992 1.99999987] diff --git a/doc/en/scripts/simple_DerivativeFreeOptimization.png b/doc/en/scripts/simple_DerivativeFreeOptimization.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb44ce487fe2314f09d1ceb25155c0cdc0bcbbd GIT binary patch literal 39917 zcmdSBc~p*V8!y~|NF-^JiYU@Zlx7h^i9)4GrP4glBT)!RrP9P>2&GZwZq_^(r9tyt zn&-Lp@8Wsiz4rR{`o6WkzxM83&+|TVcXwasb)LuZn~v+@F+wGh@BI4hA;1#+DX)j|$*_e0y)(*;$DT3jWU*2w2(} z3Hn6WZzUt!OLksP_Nr6FNSmV_!_QwOljG+t58TL8PAg-kD-+s+8{`tN?8>74@pkj6XWRjX&knubD1T_5eY;F`RhHP>9S3?h zEVwtkOs%dQX`ZgEEW0}}a+I+^h(_-3S7H2~5jL*}f4>gNGSU6{;-L$A<@fh{L1Y(d z&-{Ju1v0Kd&c9z=UOVmnzBFLx$t@XwUn;-l)dsDLPF23f4*_VwqHR&E8{Ak^&V-r(CSDDl^i$cJ$v>f zs`1gVOEP;^ga}SgRS2q(Yz!hIBa_tl>JxN0$oz`#7U}Ifabh8(M$E91d3wQlx}Txz zXRl>ryw+nDVV@)V#fcuPOL}4hPs)ecYr;iqTBY$iTUS3u{>ssF{_Om7YANHRGedQ@ zqZNXNbaVl^6=m(@4<3|`>bGUs+YL87sf$r+Fgg72v{EzA!e}}avR&s5 zhZ{aSkFknc>`5`K${0Gb%U3JYVREj;GJKf-#+O7Lq4d`yuB^Lu-CE1r&&g?%Lfpmx zPV0$IS#i6;ydpm)^3AlgMk@=G^`EZ!`7sG58`p6gR)$_Nn=C9WB%Y1$C?+F|rp{}Cnu&71WfuGGhCvC`7g zwzjo>ycWx7nLW!`R#rx;p6v0L`9ZQZqM)F#vbKJ$NwTpU`ccH)RXt`H6&1BTZ*h8n zN9FzF=FwKYq(qlllN7g#7yP(4hW`ZXFwF-A?c%-^Az$FLjpy2@UGeep8#ZqI{#ipb zUX!F}JC>F4m5F;Uc6ed%jX$%L%Q0D5Stlo_9lLj%(7Re$3DrnWKdut~no(hIX2z$L zVYhGZUNR#iBR4m<59%r0SZ0Hgr)(Rgl@I-I9Y$ zHD0qT%qZ$L?*GE_a!+^n-I$nz_QMSZGlSpn?{2spI@bO0;lr8HmXKtFites1S=`L# z6eEAdu+Gk#DN#*LYV4jX)>+xv#FE@}-_9oC@b*Tk$-=@yXK$}ubFu;PYjM35vwM

b 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 literal 0 HcmV?d00001 diff --git a/doc/en/scripts/simple_DerivativeFreeOptimization.py b/doc/en/scripts/simple_DerivativeFreeOptimization.py new file mode 100644 index 0000000..7fb3083 --- /dev/null +++ b/doc/en/scripts/simple_DerivativeFreeOptimization.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# +from numpy import array, ravel +def QuadFunction( coefficients ): + """ + Quadratic simulation in x: y = a x^2 + b x + c + """ + a, b, c = list(ravel(coefficients)) + x_points = (-5, 0, 1, 3, 10) + y_points = [] + for x in x_points: + y_points.append( a*x*x + b*x + c ) + return array(y_points) +# +Xb = array([1., 1., 1.]) +Yobs = array([57, 2, 3, 17, 192]) +# +print("Resolution of the calibration problem") +print("-------------------------------------") +print("") +from adao import adaoBuilder +case = adaoBuilder.New('') +case.setBackground( Vector = Xb, Stored=True ) +case.setBackgroundError( ScalarSparseMatrix = 1.e6 ) +case.setObservation( Vector = Yobs, Stored=True ) +case.setObservationError( ScalarSparseMatrix = 1. ) +case.setObservationOperator( OneFunction = QuadFunction ) +case.setAlgorithmParameters( + Algorithm='DerivativeFreeOptimization', + Parameters={ + 'MaximumNumberOfIterations': 100, + 'StoreSupplementaryCalculations': [ + 'CurrentState', + ], + }, + ) +case.setObserver( + Info=" Intermediate state at the current iteration:", + Template='ValuePrinter', + Variable='CurrentState', + ) +case.execute() +print("") +# +#------------------------------------------------------------------------------- +# +print("Calibration of %i coefficients in a 1D quadratic function on %i measures"%( + len(case.get('Background')), + len(case.get('Observation')), + )) +print("----------------------------------------------------------------------") +print("") +print("Observation vector.................:", ravel(case.get('Observation'))) +print("A priori background state..........:", ravel(case.get('Background'))) +print("") +print("Expected theoretical coefficients..:", ravel((2,-1,2))) +print("") +print("Number of iterations...............:", len(case.get('CurrentState'))) +print("Number of simulations..............:", len(case.get('CurrentState'))) +print("Calibration resulting coefficients.:", ravel(case.get('Analysis')[-1])) +# +Xa = case.get('Analysis')[-1] +import matplotlib.pyplot as plt +plt.rcParams['figure.figsize'] = (10, 4) +# +plt.figure() +plt.plot((-5,0,1,3,10),QuadFunction(Xb),'b-',label="Simulation at background") +plt.plot((-5,0,1,3,10),Yobs, 'kX',label='Observation',markersize=10) +plt.plot((-5,0,1,3,10),QuadFunction(Xa),'r-',label="Simulation at optimum") +plt.legend() +plt.title('Coefficients calibration', fontweight='bold') +plt.xlabel('Arbitrary coordinate') +plt.ylabel('Observations') +plt.savefig("simple_DerivativeFreeOptimization.png") diff --git a/doc/en/scripts/simple_DerivativeFreeOptimization.res b/doc/en/scripts/simple_DerivativeFreeOptimization.res new file mode 100644 index 0000000..80d272c --- /dev/null +++ b/doc/en/scripts/simple_DerivativeFreeOptimization.res @@ -0,0 +1,69 @@ +Resolution of the calibration problem +------------------------------------- + + Intermediate state at the current iteration: [1. 1. 1.] + Intermediate state at the current iteration: [2. 1. 1.] + Intermediate state at the current iteration: [1. 2. 1.] + Intermediate state at the current iteration: [1. 1. 2.] + Intermediate state at the current iteration: [0. 1. 1.] + Intermediate state at the current iteration: [1. 0. 1.] + Intermediate state at the current iteration: [1. 1. 0.] + Intermediate state at the current iteration: [1.82475484 1.96682811 1.18582936] + Intermediate state at the current iteration: [1.89559338 0.54235283 1.17221593] + Intermediate state at the current iteration: [ 1.90222657 -0.20823061 1.83295831] + Intermediate state at the current iteration: [ 1.94478151 -0.55541624 2.76978872] + Intermediate state at the current iteration: [ 2.04021458 -1.49397981 2.43813988] + Intermediate state at the current iteration: [ 2.26677171 -0.58498556 2.84248383] + Intermediate state at the current iteration: [ 1.9902328 -1.04021448 2.88338819] + Intermediate state at the current iteration: [ 1.98695318 -0.92116383 2.47695648] + Intermediate state at the current iteration: [ 1.99320312 -1.02368518 2.64731215] + Intermediate state at the current iteration: [ 1.79473809 -0.96379959 2.44856121] + Intermediate state at the current iteration: [ 1.98630908 -0.91207212 2.5394595 ] + Intermediate state at the current iteration: [ 1.99262279 -0.97073591 2.4801914 ] + Intermediate state at the current iteration: [ 1.99434434 -0.99814626 2.51840027] + Intermediate state at the current iteration: [ 1.98838712 -0.93500739 2.44986416] + Intermediate state at the current iteration: [ 1.99080633 -0.94768294 2.46780354] + Intermediate state at the current iteration: [ 2.01588592 -0.97086338 2.47667529] + Intermediate state at the current iteration: [ 1.99098142 -0.96519905 2.48111896] + Intermediate state at the current iteration: [ 1.99157918 -0.97086422 2.47290017] + Intermediate state at the current iteration: [ 1.9929175 -0.98359308 2.45753186] + Intermediate state at the current iteration: [ 1.99550241 -1.01497755 2.43286745] + Intermediate state at the current iteration: [ 1.99505414 -1.00691754 2.44681334] + Intermediate state at the current iteration: [ 1.97993261 -1.01100857 2.43408454] + Intermediate state at the current iteration: [ 1.99503312 -1.0022575 2.42298652] + Intermediate state at the current iteration: [ 1.99337049 -0.98139127 2.3984825 ] + Intermediate state at the current iteration: [ 1.99387512 -0.97303786 2.33457311] + Intermediate state at the current iteration: [ 1.99742055 -0.99371791 2.20738214] + Intermediate state at the current iteration: [ 2.0002882 -0.98541744 1.96740743] + Intermediate state at the current iteration: [ 2.00047429 -0.99646137 2.01501424] + Intermediate state at the current iteration: [ 2.0009106 -1.00072301 2.00881512] + Intermediate state at the current iteration: [ 1.9909278 -1.00127001 2.00860374] + Intermediate state at the current iteration: [ 2.0009174 -1.00688459 2.01669134] + Intermediate state at the current iteration: [ 1.99994608 -1.00029476 2.00923274] + Intermediate state at the current iteration: [ 2.00031465 -1.00202777 1.98931137] + Intermediate state at the current iteration: [ 1.99389877 -1.00336389 2.01658192] + Intermediate state at the current iteration: [ 2.00003478 -1.00017674 1.99950089] + Intermediate state at the current iteration: [ 1.99970222 -0.99882654 1.99924329] + Intermediate state at the current iteration: [ 2.00000228 -0.99960552 1.99820757] + Intermediate state at the current iteration: [ 2.00103142 -1.0000571 1.9985047 ] + Intermediate state at the current iteration: [ 1.99925894 -1.0009752 1.9986288 ] + Intermediate state at the current iteration: [ 1.99998604 -0.99994926 2.00089583] + Intermediate state at the current iteration: [ 2.00000344 -0.99996363 1.9994818 ] + Intermediate state at the current iteration: [ 1.99980383 -0.99996386 1.9994693 ] + Intermediate state at the current iteration: [ 1.99998362 -0.99985392 1.99931575] + Intermediate state at the current iteration: [ 2.00000605 -1.00001563 1.9996749 ] + Intermediate state at the current iteration: [ 2.00000343 -1.00002045 1.99987483] + Intermediate state at the current iteration: [ 2.00000165 -1.0000257 2.00006119] + Intermediate state at the current iteration: [ 2.00000167 -1.00001085 1.99996478] + +Calibration of 3 coefficients in a 1D quadratic function on 5 measures +---------------------------------------------------------------------- + +Observation vector.................: [ 57. 2. 3. 17. 192.] +A priori background state..........: [1. 1. 1.] + +Expected theoretical coefficients..: [ 2 -1 2] + +Number of iterations...............: 54 +Number of simulations..............: 54 +Calibration resulting coefficients.: [ 2.00000167 -1.00001085 1.99996478] diff --git a/doc/en/scripts/simple_DerivativeFreeOptimization.rst b/doc/en/scripts/simple_DerivativeFreeOptimization.rst new file mode 100644 index 0000000..cb47c74 --- /dev/null +++ b/doc/en/scripts/simple_DerivativeFreeOptimization.rst @@ -0,0 +1,17 @@ +.. index:: single: 3DVAR (example) + +This example describes the calibration of parameters :math:`\mathbf{x}` of a +quadratic observation model :math:`H`. This model is here represented as a +function named ``QuadFunction``. This function get as input the coefficients +vector :math:`\mathbf{x}`, and return as output the evaluation vector +:math:`\mathbf{y}` of the quadratic model at the predefined internal control +points. The calibration is done using an initial coefficient set (background +state specified by ``Xb`` in the code), and with the information +:math:`\mathbf{y}^o` (specified by ``Yobs`` in the code) of 5 measures obtained +in these same internal control points. We set twin experiments (see +:ref:`section_methodology_twin`) and the measurements are supposed to be +perfect. We choose to emphasize the observations versus the background by +setting a great variance for the background error, here of :math:`10^{6}`. + +The adjustment is carried out by displaying intermediate results during +iterative optimization. diff --git a/doc/en/scripts/simple_NonLinearLeastSquares.py b/doc/en/scripts/simple_NonLinearLeastSquares.py index 71705c1..6bae490 100644 --- a/doc/en/scripts/simple_NonLinearLeastSquares.py +++ b/doc/en/scripts/simple_NonLinearLeastSquares.py @@ -54,6 +54,8 @@ print("A priori background state..........:", ravel(case.get('Background'))) print("") print("Expected theoretical coefficients..:", ravel((2,-1,2))) print("") +print("Number of iterations...............:", len(case.get('CurrentState'))) +print("Number of simulations..............:", len(case.get('CurrentState'))*4) print("Calibration resulting coefficients.:", ravel(case.get('Analysis')[-1])) # Xa = case.get('Analysis')[-1] diff --git a/doc/en/scripts/simple_NonLinearLeastSquares.res b/doc/en/scripts/simple_NonLinearLeastSquares.res index 17cc93f..2a85a4c 100644 --- a/doc/en/scripts/simple_NonLinearLeastSquares.res +++ b/doc/en/scripts/simple_NonLinearLeastSquares.res @@ -35,4 +35,6 @@ A priori background state..........: [1. 1. 1.] Expected theoretical coefficients..: [ 2 -1 2] +Number of iterations...............: 25 +Number of simulations..............: 100 Calibration resulting coefficients.: [ 2. -0.99999995 2.00000015] diff --git a/doc/fr/examples.rst b/doc/fr/examples.rst index 0ab0681..6c9cd1b 100644 --- a/doc/fr/examples.rst +++ b/doc/fr/examples.rst @@ -46,6 +46,7 @@ Utilisations d'algorithmes de calcul #. :ref:`Exemples avec l'algorithme de "3DVAR"` #. :ref:`Exemples avec l'algorithme de "Blue"` +#. :ref:`Exemples avec l'algorithme de "DerivativeFreeOptimization" algorithm` #. :ref:`Exemples avec l'algorithme de "ExtendedBlue"` #. :ref:`Exemples avec l'algorithme de "KalmanFilter"` #. :ref:`Exemples avec l'algorithme de "NonLinearLeastSquares"` diff --git a/doc/fr/ref_algorithm_DerivativeFreeOptimization.rst b/doc/fr/ref_algorithm_DerivativeFreeOptimization.rst index d3593c1..7ccd870 100644 --- a/doc/fr/ref_algorithm_DerivativeFreeOptimization.rst +++ b/doc/fr/ref_algorithm_DerivativeFreeOptimization.rst @@ -170,6 +170,25 @@ StoreSupplementaryCalculations .. ------------------------------------ .. .. _section_ref_algorithm_DerivativeFreeOptimization_examples: +.. include:: snippets/Header2Algo09.rst + +.. include:: scripts/simple_DerivativeFreeOptimization.rst + +.. literalinclude:: scripts/simple_DerivativeFreeOptimization.py + +.. include:: snippets/Header2Algo10.rst + +.. literalinclude:: scripts/simple_DerivativeFreeOptimization.res + :language: none + +.. include:: snippets/Header2Algo11.rst + +.. _simple_DerivativeFreeOptimization: +.. image:: scripts/simple_DerivativeFreeOptimization.png + :align: center + :width: 90% + +.. ------------------------------------ .. .. include:: snippets/Header2Algo06.rst - :ref:`section_ref_algorithm_ParticleSwarmOptimization` diff --git a/doc/fr/scripts/simple_3DVAR.py b/doc/fr/scripts/simple_3DVAR.py index c06b92b..cde70b4 100644 --- a/doc/fr/scripts/simple_3DVAR.py +++ b/doc/fr/scripts/simple_3DVAR.py @@ -55,6 +55,8 @@ print("État d'ébauche a priori...........:", ravel(case.get('Background'))) print("") print("Coefficients théoriques attendus..:", ravel((2,-1,2))) print("") +print("Nombre d'itérations...............:", len(case.get('CurrentState'))) +print("Nombre de simulations.............:", len(case.get('CurrentState'))*4) print("Coefficients résultants du calage.:", ravel(case.get('Analysis')[-1])) # Xa = case.get('Analysis')[-1] diff --git a/doc/fr/scripts/simple_3DVAR.res b/doc/fr/scripts/simple_3DVAR.res index a50796a..d28148a 100644 --- a/doc/fr/scripts/simple_3DVAR.res +++ b/doc/fr/scripts/simple_3DVAR.res @@ -35,4 +35,6 @@ Vecteur d'observation.............: [ 57. 2. 3. 17. 192.] Coefficients théoriques attendus..: [ 2 -1 2] +Nombre d'itérations...............: 25 +Nombre de simulations.............: 100 Coefficients résultants du calage.: [ 2. -0.99999992 1.99999987] diff --git a/doc/fr/scripts/simple_DerivativeFreeOptimization.png b/doc/fr/scripts/simple_DerivativeFreeOptimization.png new file mode 100644 index 0000000000000000000000000000000000000000..00388bac2e1c14fed8f93b5e5dc244af3cac17fd GIT binary patch literal 40236 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 M*-J8M(gt_`4_$^mf&c&j literal 0 HcmV?d00001 diff --git a/doc/fr/scripts/simple_DerivativeFreeOptimization.py b/doc/fr/scripts/simple_DerivativeFreeOptimization.py new file mode 100644 index 0000000..361106d --- /dev/null +++ b/doc/fr/scripts/simple_DerivativeFreeOptimization.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# +from numpy import array, ravel +def QuadFunction( coefficients ): + """ + Simulation quadratique aux points x : y = a x^2 + b x + c + """ + a, b, c = list(ravel(coefficients)) + x_points = (-5, 0, 1, 3, 10) + y_points = [] + for x in x_points: + y_points.append( a*x*x + b*x + c ) + return array(y_points) +# +Xb = array([1., 1., 1.]) +Yobs = array([57, 2, 3, 17, 192]) +# +print("Résolution du problème de calage") +print("--------------------------------") +print("") +from adao import adaoBuilder +case = adaoBuilder.New('') +case.setBackground( Vector = Xb, Stored=True ) +case.setBackgroundError( ScalarSparseMatrix = 1.e6 ) +case.setObservation( Vector = Yobs, Stored=True ) +case.setObservationError( ScalarSparseMatrix = 1. ) +case.setObservationOperator( OneFunction = QuadFunction ) +case.setAlgorithmParameters( + Algorithm='DerivativeFreeOptimization', + Parameters={ + 'MaximumNumberOfIterations': 100, + 'StoreSupplementaryCalculations': [ + 'CurrentState', + ], + }, + ) +case.setObserver( + Info=" État intermédiaire en itération courante :", + Template='ValuePrinter', + Variable='CurrentState', + ) +case.execute() +print("") +# +#------------------------------------------------------------------------------- +# +print("Calage de %i coefficients pour une forme quadratique 1D sur %i mesures"%( + len(case.get('Background')), + len(case.get('Observation')), + )) +print("--------------------------------------------------------------------") +print("") +print("Vecteur d'observation.............:", ravel(case.get('Observation'))) +print("État d'ébauche a priori...........:", ravel(case.get('Background'))) +print("") +print("Coefficients théoriques attendus..:", ravel((2,-1,2))) +print("") +print("Nombre d'itérations...............:", len(case.get('CurrentState'))) +print("Nombre de simulations.............:", len(case.get('CurrentState'))) +print("Coefficients résultants du calage.:", ravel(case.get('Analysis')[-1])) +# +Xa = case.get('Analysis')[-1] +import matplotlib.pyplot as plt +plt.rcParams['figure.figsize'] = (10, 4) +# +plt.figure() +plt.plot((-5,0,1,3,10),QuadFunction(Xb),'b-',label="Simulation à l'ébauche") +plt.plot((-5,0,1,3,10),Yobs, 'kX',label='Observation',markersize=10) +plt.plot((-5,0,1,3,10),QuadFunction(Xa),'r-',label="Simulation à l'optimum") +plt.legend() +plt.title('Calage de coefficients', fontweight='bold') +plt.xlabel('Coordonnée arbitraire') +plt.ylabel('Observations') +plt.savefig("simple_DerivativeFreeOptimization.png") diff --git a/doc/fr/scripts/simple_DerivativeFreeOptimization.res b/doc/fr/scripts/simple_DerivativeFreeOptimization.res new file mode 100644 index 0000000..19db089 --- /dev/null +++ b/doc/fr/scripts/simple_DerivativeFreeOptimization.res @@ -0,0 +1,69 @@ +Résolution du problème de calage +-------------------------------- + + État intermédiaire en itération courante : [1. 1. 1.] + État intermédiaire en itération courante : [2. 1. 1.] + État intermédiaire en itération courante : [1. 2. 1.] + État intermédiaire en itération courante : [1. 1. 2.] + État intermédiaire en itération courante : [0. 1. 1.] + État intermédiaire en itération courante : [1. 0. 1.] + État intermédiaire en itération courante : [1. 1. 0.] + État intermédiaire en itération courante : [1.82475484 1.96682811 1.18582936] + État intermédiaire en itération courante : [1.89559338 0.54235283 1.17221593] + État intermédiaire en itération courante : [ 1.90222657 -0.20823061 1.83295831] + État intermédiaire en itération courante : [ 1.94478151 -0.55541624 2.76978872] + État intermédiaire en itération courante : [ 2.04021458 -1.49397981 2.43813988] + État intermédiaire en itération courante : [ 2.26677171 -0.58498556 2.84248383] + État intermédiaire en itération courante : [ 1.9902328 -1.04021448 2.88338819] + État intermédiaire en itération courante : [ 1.98695318 -0.92116383 2.47695648] + État intermédiaire en itération courante : [ 1.99320312 -1.02368518 2.64731215] + État intermédiaire en itération courante : [ 1.79473809 -0.96379959 2.44856121] + État intermédiaire en itération courante : [ 1.98630908 -0.91207212 2.5394595 ] + État intermédiaire en itération courante : [ 1.99262279 -0.97073591 2.4801914 ] + État intermédiaire en itération courante : [ 1.99434434 -0.99814626 2.51840027] + État intermédiaire en itération courante : [ 1.98838712 -0.93500739 2.44986416] + État intermédiaire en itération courante : [ 1.99080633 -0.94768294 2.46780354] + État intermédiaire en itération courante : [ 2.01588592 -0.97086338 2.47667529] + État intermédiaire en itération courante : [ 1.99098142 -0.96519905 2.48111896] + État intermédiaire en itération courante : [ 1.99157918 -0.97086422 2.47290017] + État intermédiaire en itération courante : [ 1.9929175 -0.98359308 2.45753186] + État intermédiaire en itération courante : [ 1.99550241 -1.01497755 2.43286745] + État intermédiaire en itération courante : [ 1.99505414 -1.00691754 2.44681334] + État intermédiaire en itération courante : [ 1.97993261 -1.01100857 2.43408454] + État intermédiaire en itération courante : [ 1.99503312 -1.0022575 2.42298652] + État intermédiaire en itération courante : [ 1.99337049 -0.98139127 2.3984825 ] + État intermédiaire en itération courante : [ 1.99387512 -0.97303786 2.33457311] + État intermédiaire en itération courante : [ 1.99742055 -0.99371791 2.20738214] + État intermédiaire en itération courante : [ 2.0002882 -0.98541744 1.96740743] + État intermédiaire en itération courante : [ 2.00047429 -0.99646137 2.01501424] + État intermédiaire en itération courante : [ 2.0009106 -1.00072301 2.00881512] + État intermédiaire en itération courante : [ 1.9909278 -1.00127001 2.00860374] + État intermédiaire en itération courante : [ 2.0009174 -1.00688459 2.01669134] + État intermédiaire en itération courante : [ 1.99994608 -1.00029476 2.00923274] + État intermédiaire en itération courante : [ 2.00031465 -1.00202777 1.98931137] + État intermédiaire en itération courante : [ 1.99389877 -1.00336389 2.01658192] + État intermédiaire en itération courante : [ 2.00003478 -1.00017674 1.99950089] + État intermédiaire en itération courante : [ 1.99970222 -0.99882654 1.99924329] + État intermédiaire en itération courante : [ 2.00000228 -0.99960552 1.99820757] + État intermédiaire en itération courante : [ 2.00103142 -1.0000571 1.9985047 ] + État intermédiaire en itération courante : [ 1.99925894 -1.0009752 1.9986288 ] + État intermédiaire en itération courante : [ 1.99998604 -0.99994926 2.00089583] + État intermédiaire en itération courante : [ 2.00000344 -0.99996363 1.9994818 ] + État intermédiaire en itération courante : [ 1.99980383 -0.99996386 1.9994693 ] + État intermédiaire en itération courante : [ 1.99998362 -0.99985392 1.99931575] + État intermédiaire en itération courante : [ 2.00000605 -1.00001563 1.9996749 ] + État intermédiaire en itération courante : [ 2.00000343 -1.00002045 1.99987483] + État intermédiaire en itération courante : [ 2.00000165 -1.0000257 2.00006119] + État intermédiaire en itération courante : [ 2.00000167 -1.00001085 1.99996478] + +Calage de 3 coefficients pour une forme quadratique 1D sur 5 mesures +-------------------------------------------------------------------- + +Vecteur d'observation.............: [ 57. 2. 3. 17. 192.] +État d'ébauche a priori...........: [1. 1. 1.] + +Coefficients théoriques attendus..: [ 2 -1 2] + +Nombre d'itérations...............: 54 +Nombre de simulations.............: 54 +Coefficients résultants du calage.: [ 2.00000167 -1.00001085 1.99996478] diff --git a/doc/fr/scripts/simple_DerivativeFreeOptimization.rst b/doc/fr/scripts/simple_DerivativeFreeOptimization.rst new file mode 100644 index 0000000..c2c2c29 --- /dev/null +++ b/doc/fr/scripts/simple_DerivativeFreeOptimization.rst @@ -0,0 +1,18 @@ +.. index:: single: 3DVAR (exemple) + +Cet exemple décrit le recalage des paramètres :math:`\mathbf{x}` d'un modèle +d'observation :math:`H` quadratique. Ce modèle est représenté ici comme une +fonction nommée ``QuadFunction``. Cette fonction accepte en entrée le vecteur +de coefficients :math:`\mathbf{x}`, et fournit en sortie le vecteur +:math:`\mathbf{y}` d'évaluation du modèle quadratique aux points de contrôle +internes prédéfinis dans le modèle. Le calage s'effectue sur la base d'un jeu +initial de coefficients (état d'ébauche désigné par ``Xb`` dans l'exemple), et +avec l'information :math:`\mathbf{y}^o` (désignée par ``Yobs`` dans l'exemple) +de 5 mesures obtenues à ces mêmes points de contrôle internes. On se place en +expériences jumelles (voir :ref:`section_methodology_twin`) et les mesures sont +parfaites. On privilégie les observations au détriment de l'ébauche par +l'indication d'une très importante variance d'erreur d'ébauche, ici de +:math:`10^{6}`. + +L'ajustement s'effectue en affichant des résultats intermédiaires lors de +l'optimisation itérative. diff --git a/doc/fr/scripts/simple_NonLinearLeastSquares.py b/doc/fr/scripts/simple_NonLinearLeastSquares.py index 48fcbfc..9f3ed1d 100644 --- a/doc/fr/scripts/simple_NonLinearLeastSquares.py +++ b/doc/fr/scripts/simple_NonLinearLeastSquares.py @@ -54,6 +54,8 @@ print("État d'ébauche a priori...........:", ravel(case.get('Background'))) print("") print("Coefficients théoriques attendus..:", ravel((2,-1,2))) print("") +print("Nombre d'itérations...............:", len(case.get('CurrentState'))) +print("Nombre de simulations.............:", len(case.get('CurrentState'))*4) print("Coefficients résultants du calage.:", ravel(case.get('Analysis')[-1])) # Xa = case.get('Analysis')[-1] diff --git a/doc/fr/scripts/simple_NonLinearLeastSquares.res b/doc/fr/scripts/simple_NonLinearLeastSquares.res index d98630a..f8bb263 100644 --- a/doc/fr/scripts/simple_NonLinearLeastSquares.res +++ b/doc/fr/scripts/simple_NonLinearLeastSquares.res @@ -35,4 +35,6 @@ Vecteur d'observation.............: [ 57. 2. 3. 17. 192.] Coefficients théoriques attendus..: [ 2 -1 2] +Nombre d'itérations...............: 25 +Nombre de simulations.............: 100 Coefficients résultants du calage.: [ 2. -0.99999995 2.00000015] -- 2.39.2