2 Copyright (C) 2008-2015 EDF R&D
4 This file is part of SALOME ADAO module.
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.
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.
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
20 See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
24 .. index:: single: NonLinearLeastSquares
25 .. _section_ref_algorithm_NonLinearLeastSquares:
27 Algorithme de calcul "*NonLinearLeastSquares*"
28 ----------------------------------------------
33 Cet algorithme réalise une estimation d'état par minimisation variationnelle de
34 la fonctionnelle :math:`J` d'écart classique de "Moindres Carrés" pondérés:
36 .. math:: J(\mathbf{x})=(\mathbf{y}^o-\mathbf{H}.\mathbf{x})^T.\mathbf{R}^{-1}.(\mathbf{y}^o-\mathbf{H}.\mathbf{x})
38 Il est similaire à l':ref:`section_ref_algorithm_3DVAR` amputé de sa partie
39 ébauche. L'ébauche, requise dans l'interface, ne sert que de point initial pour
40 la minimisation variationnelle.
42 Dans tous les cas, il est recommandé de lui préférer
43 l':ref:`section_ref_algorithm_3DVAR` pour sa stabilité comme pour son
44 comportement lors de l'optimisation.
46 Commandes requises et optionnelles
47 ++++++++++++++++++++++++++++++++++
49 .. index:: single: Background
50 .. index:: single: Observation
51 .. index:: single: ObservationError
52 .. index:: single: ObservationOperator
53 .. index:: single: Minimizer
54 .. index:: single: Bounds
55 .. index:: single: MaximumNumberOfSteps
56 .. index:: single: CostDecrementTolerance
57 .. index:: single: ProjectedGradientTolerance
58 .. index:: single: GradientNormTolerance
59 .. index:: single: StoreSupplementaryCalculations
61 Les commandes requises générales, disponibles dans l'interface en édition, sont
65 *Commande obligatoire*. Elle définit le vecteur d'ébauche ou
66 d'initialisation, noté précédemment :math:`\mathbf{x}^b`. Sa valeur est
67 définie comme un objet de type "*Vector*" ou de type "*VectorSerie*".
70 *Commande obligatoire*. Elle définit le vecteur d'observation utilisé en
71 assimilation de données ou en optimisation, et noté précédemment
72 :math:`\mathbf{y}^o`. Sa valeur est définie comme un objet de type "*Vector*"
73 ou de type "*VectorSerie*".
76 *Commande obligatoire*. Elle définit la matrice de covariance des erreurs
77 d'ébauche, notée précédemment :math:`\mathbf{R}`. Sa valeur est définie
78 comme un objet de type "*Matrix*", de type "*ScalarSparseMatrix*", ou de
79 type "*DiagonalSparseMatrix*".
82 *Commande obligatoire*. Elle indique l'opérateur d'observation, noté
83 précédemment :math:`H`, qui transforme les paramètres d'entrée
84 :math:`\mathbf{x}` en résultats :math:`\mathbf{y}` qui sont à comparer aux
85 observations :math:`\mathbf{y}^o`. Sa valeur est définie comme un objet de
86 type "*Function*" ou de type "*Matrix*". Dans le cas du type "*Function*",
87 différentes formes fonctionnelles peuvent être utilisées, comme décrit dans
88 la section :ref:`section_ref_operator_requirements`. Si un contrôle
89 :math:`U` est inclus dans le modèle d'observation, l'opérateur doit être
90 appliqué à une paire :math:`(X,U)`.
92 Les commandes optionnelles générales, disponibles dans l'interface en édition,
93 sont indiquées dans la :ref:`section_ref_assimilation_keywords`. En particulier,
94 la commande optionnelle "*AlgorithmParameters*" permet d'indiquer les options
95 particulières, décrites ci-après, de l'algorithme. On se reportera à la
96 :ref:`section_ref_options_AlgorithmParameters` pour le bon usage de cette
99 Les options de l'algorithme sont les suivantes:
102 Cette clé permet de changer le minimiseur pour l'optimiseur. Le choix par
103 défaut est "LBFGSB", et les choix possibles sont "LBFGSB" (minimisation non
104 linéaire sous contraintes, voir [Byrd95]_, [Morales11]_ et [Zhu97]_), "TNC"
105 (minimisation non linéaire sous contraintes), "CG" (minimisation non
106 linéaire sans contraintes), "BFGS" (minimisation non linéaire sans
107 contraintes), "NCG" (minimisation de type gradient conjugué de Newton), "LM"
108 (minimisation non linéaire de type Levenberg-Marquard). Il est fortement
109 conseillé de conserver la valeur par défaut.
111 Exemple : ``{"Minimizer":"LBFGSB"}``
114 Cette clé permet de définir des bornes supérieure et inférieure pour
115 chaque variable d'état optimisée. Les bornes doivent être données par une
116 liste de liste de paires de bornes inférieure/supérieure pour chaque
117 variable, avec une valeur ``None`` chaque fois qu'il n'y a pas de borne. Les
118 bornes peuvent toujours être spécifiées, mais seuls les optimiseurs sous
119 contraintes les prennent en compte.
121 Exemple : ``{"Bounds":[[2.,5.],[1.e-2,10.],[-30.,None],[None,None]]}``
124 Cette clé indique le nombre maximum d'itérations possibles en optimisation
125 itérative. Le défaut est 15000, qui est très similaire à une absence de
126 limite sur les itérations. Il est ainsi recommandé d'adapter ce paramètre
127 aux besoins pour des problèmes réels. Pour certains optimiseurs, le nombre
128 de pas effectif d'arrêt peut être légèrement différent de la limite à cause
129 d'exigences de contrôle interne de l'algorithme.
131 Exemple : ``{"MaximumNumberOfSteps":100}``
133 CostDecrementTolerance
134 Cette clé indique une valeur limite, conduisant à arrêter le processus
135 itératif d'optimisation lorsque la fonction coût décroît moins que cette
136 tolérance au dernier pas. Le défaut est de 1.e-7, et il est recommandé
137 de l'adapter aux besoins pour des problèmes réels.
139 Exemple : ``{"CostDecrementTolerance":1.e-7}``
141 ProjectedGradientTolerance
142 Cette clé indique une valeur limite, conduisant à arrêter le processus
143 itératif d'optimisation lorsque toutes les composantes du gradient projeté
144 sont en-dessous de cette limite. C'est utilisé uniquement par les
145 optimiseurs sous contraintes. Le défaut est -1, qui désigne le défaut
146 interne de chaque optimiseur (usuellement 1.e-5), et il n'est pas recommandé
149 Exemple : ``{"ProjectedGradientTolerance":-1}``
151 GradientNormTolerance
152 Cette clé indique une valeur limite, conduisant à arrêter le processus
153 itératif d'optimisation lorsque la norme du gradient est en dessous de cette
154 limite. C'est utilisé uniquement par les optimiseurs sans contraintes. Le
155 défaut est 1.e-5 et il n'est pas recommandé de le changer.
157 Exemple : ``{"GradientNormTolerance":1.e-5}``
159 StoreSupplementaryCalculations
160 Cette liste indique les noms des variables supplémentaires qui peuvent être
161 disponibles à la fin de l'algorithme. Cela implique potentiellement des
162 calculs ou du stockage coûteux. La valeur par défaut est une liste vide,
163 aucune de ces variables n'étant calculée et stockée par défaut. Les noms
164 possibles sont dans la liste suivante : ["APosterioriCovariance", "BMA",
165 "CostFunctionJ", "CurrentState", "OMA", "OMB", "Innovation", "SigmaObs2",
166 "MahalanobisConsistency", "SimulatedObservationAtCurrentState",
167 "SimulatedObservationAtOptimum"].
169 Exemple : ``{"StoreSupplementaryCalculations":["BMA","Innovation"]}``
171 *Astuce pour cet algorithme :*
173 Comme la commande *"BackgroundError"* est requise pour TOUS les algorithmes
174 de calcul dans l'interface, vous devez fournir une valeur, malgré le fait
175 que cette commande n'est pas requise pour cet algorithme, et ne sera pas
176 utilisée. La manière la plus simple est de donner "1" comme un STRING.
178 Informations et variables disponibles à la fin de l'algorithme
179 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
181 En sortie, après exécution de l'algorithme, on dispose d'informations et de
182 variables issues du calcul. La description des
183 :ref:`section_ref_output_variables` indique la manière de les obtenir par la
184 méthode nommée ``get`` de la variable "*ADD*" du post-processing. Les variables
185 d'entrée, mises à disposition de l'utilisateur en sortie pour faciliter
186 l'écriture des procédures de post-processing, sont décrites dans
187 l':ref:`subsection_r_o_v_Inventaire`.
189 Les sorties non conditionnelles de l'algorithme sont les suivantes:
192 *Liste de vecteurs*. Chaque élément est un état optimal :math:`\mathbf{x}*`
193 en optimisation ou une analyse :math:`\mathbf{x}^a` en assimilation de
196 Exemple : ``Xa = ADD.get("Analysis")[-1]``
199 *Liste de valeurs*. Chaque élément est une valeur de fonctionnelle d'écart
202 Exemple : ``J = ADD.get("CostFunctionJ")[:]``
205 *Liste de valeurs*. Chaque élément est une valeur de fonctionnelle d'écart
206 :math:`J^b`, c'est-à-dire de la partie écart à l'ébauche.
208 Exemple : ``Jb = ADD.get("CostFunctionJb")[:]``
211 *Liste de valeurs*. Chaque élément est une valeur de fonctionnelle d'écart
212 :math:`J^o`, c'est-à-dire de la partie écart à l'observation.
214 Exemple : ``Jo = ADD.get("CostFunctionJo")[:]``
216 Les sorties conditionnelles de l'algorithme sont les suivantes:
219 *Liste de vecteurs*. Chaque élément est un vecteur d'écart entre
220 l'ébauche et l'état optimal.
222 Exemple : ``bma = ADD.get("BMA")[-1]``
225 *Liste de vecteurs*. Chaque élément est un vecteur d'état courant utilisé
226 au cours du déroulement de l'algorithme d'optimisation.
228 Exemple : ``Xs = ADD.get("CurrentState")[:]``
231 *Liste de vecteurs*. Chaque élément est un vecteur d'innovation, qui est
232 en statique l'écart de l'optimum à l'ébauche, et en dynamique l'incrément
235 Exemple : ``d = ADD.get("Innovation")[-1]``
238 *Liste de vecteurs*. Chaque élément est un vecteur d'écart entre
239 l'observation et l'état optimal dans l'espace des observations.
241 Exemple : ``oma = ADD.get("OMA")[-1]``
244 *Liste de vecteurs*. Chaque élément est un vecteur d'écart entre
245 l'observation et l'état d'ébauche dans l'espace des observations.
247 Exemple : ``omb = ADD.get("OMB")[-1]``
249 SimulatedObservationAtCurrentState
250 *Liste de vecteurs*. Chaque élément est un vecteur observé à l'état courant,
251 c'est-à-dire dans l'espace des observations.
253 Exemple : ``Ys = ADD.get("SimulatedObservationAtCurrentState")[-1]``
255 SimulatedObservationAtOptimum
256 *Liste de vecteurs*. Chaque élément est un vecteur d'observation simulé à
257 partir de l'analyse ou de l'état optimal :math:`\mathbf{x}^a`.
259 Exemple : ``hxa = ADD.get("SimulatedObservationAtOptimum")[-1]``
264 Références vers d'autres sections :
265 - :ref:`section_ref_algorithm_3DVAR`
267 Références bibliographiques :