1 #-*-coding:iso-8859-1-*-
3 # Copyright (C) 2008-2010 EDF R&D
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 Diagnotic de test sur la validité de l'hypothèse de linéarité de l'opérateur
25 Pour calculer Hlin on utilise un schéma différences finies centrées 2
26 points. On définit un dxparam tel que :
30 On calcule Hxp et Hxm pour obtenir Hlin. Hlin est utilise dans le Blue pour
31 caler un paramêtre. La question importante est de choisir un dxparam pas
34 On veut vérifier ici que l'hypothèse de linéarite du modèle par rapport au
35 paramêtre est valide sur l'intervalle du paramêtre [xm, xp]. Pour cela on
36 s'assure que l'on peut retrouver la valeur Hxb par les développemenents de
37 Taylor en xp et xm. Ainsi on calcule 2 estimations de Hxb, l'une à partir de
38 Hxp (notee Hx1) et l'autre à partir de Hxm (notee Hx2), que l'on compare à
39 la valeur calculée de Hxb. On s'intèresse ensuite a la distance entre Hxb et
40 ses estimés Hx1 et Hx2. Si la distance est inférieure a un seuil de
41 tolerance, l hypothese est valide.
43 __author__ = "Sophie RICCI - Septembre 2008"
46 from daCore import AssimilationStudy, BasicObjects, Persistence
48 # ==============================================================================
49 class ElementaryDiagnostic(BasicObjects.Diagnostic,Persistence.OneScalar):
50 def __init__(self, name="", unit="", basetype = None, parameters = {} ):
51 BasicObjects.Diagnostic.__init__(self, name, parameters)
52 Persistence.OneScalar.__init__( self, name, unit, basetype = bool)
53 if not self.parameters.has_key("tolerance"):
54 raise ValueError("A parameter named \"tolerance\" is required.")
56 def formula(self, H, dxparam, Hxp, Hxm, Hx):
58 Test sur la validite de l hypothese de linearite de H entre xp et xm
60 dimension = numpy.size(Hx)
62 # Reconstruit les valeurs Hx1 et Hx2 de Hx a partir de Hxm et Hxp
63 # ---------------------------------------------------------------
64 Hx1 = Hxm + H.T * dxparam
65 Hx2 = Hxp - H.T * dxparam
67 # Calcul de l'ecart entre Hx1 et Hx et entre Hx2 et Hx
68 # ----------------------------------------------------
69 ADD = AssimilationStudy.AssimilationStudy()
70 ADD.setDiagnostic("RMS",
71 name = "Calcul de la RMS entre Hx1 et Hx et entre Hx2 et Hx")
72 RMS = ADD.get("Calcul de la RMS entre Hx1 et Hx et entre Hx2 et Hx")
74 std1 = RMS.valueserie(0)
76 std2 = RMS.valueserie(1)
78 # Normalisation des écarts par Hx pour comparer a un pourcentage
79 # --------------------------------------------------------------
80 RMS.calculate(Hx,Hx-Hx)
81 std = RMS.valueserie(2)
87 if ( (err1 < self.parameters["tolerance"]) and (err2 < self.parameters["tolerance"]) ):
93 def calculate(self, Hlin = None, deltaparam = None, Hxp = None, Hxm = None, Hx = None, step = None):
96 - Hlin : Operateur d obsevation lineaire
97 - deltaparam : pas sur le parametre param
98 - Hxp : calcul en xp = xb + deltaparam
99 - Hxm : calcul en xm = xb - deltaparam
100 - Hx : calcul en x (generalement xb)
102 value = self.formula( Hlin, deltaparam, Hxp, Hxm, Hx )
104 self.store( value = value, step = step)
106 #===============================================================================
107 if __name__ == "__main__":
108 print '\n AUTODIAGNOSTIC \n'
110 print " Diagnotic de test sur la validité de l'hypothèse de linéarité de"
111 print " l'opérateur H entre xp et xm."
116 # Définition des données
117 # ----------------------
118 Hx = numpy.array(([ 2., 4., 6.]))
119 Hxp = numpy.array(([ 3., 5., 7.]))
120 Hxm = numpy.array(([ 1., 3., 5.]))
124 # Instanciation de l'objet diagnostic
125 # -----------------------------------
126 D = ElementaryDiagnostic("Mon TestHlin", parameters = {"tolerance": 0.1})
130 D.calculate( Hlin = H, deltaparam = dxparam, Hxp = Hxp, Hxm = Hxm, Hx = Hx)
132 # Validation du calcul
133 # --------------------
134 if not D.valueserie(0) :
135 raise ValueError("La linearisation de H autour de x entre xm et xp est fausse pour ce cas test lineaire")
137 print " La linéarisation de H autour de x entre xm et xp est valide pour ce cas-test linéaire."