Salome HOME
- Nouvelle version de Jean-Philippe ARGAUD
[modules/adao.git] / src / tests / daComposant / Plateforme / test005_Blue.py
1 #-*-coding:iso-8859-1-*-
2 __doc__ = """
3     Cas-test vérifiant que si H est l'identité et que les matrices de covariance
4     d'erreurs sont liées par R = alpha * B, alors l'ecart type de OMA est
5     proportionnel a l'ecart type de l'innovation d selon la relation :
6     rms(OMA)  = alpha/(1. + alpha) rms(d)
7 """
8 __author__ = "Sophie RICCI - Septembre 2008"
9
10 import numpy
11 from daCore.AssimilationStudy import AssimilationStudy
12
13 #===============================================================================
14 def test(precision = 1.e-13, dimension = 3, alpha = 2.):
15     """
16     Cas-test vérifiant que si H est l'identité et que les matrices de covariance
17     d'erreurs sont liées par R = alpha * B, alors l'ecart type de OMA est
18     proportionnel a l'ecart type de l'innovation d selon la relation :
19     rms(OMA)  = alpha/(1. + alpha) rms(d)
20     """
21     #
22     # Définition des données "théoriques" vraies
23     # ------------------------------------------
24     xt = numpy.matrix(numpy.arange(dimension)).T
25     Eo = numpy.matrix(numpy.random.normal(0.,1.,size=(dimension,))).T
26     Eb = numpy.matrix(numpy.zeros((dimension,))).T
27     #
28     H  = numpy.matrix(numpy.core.identity(dimension))
29     #
30     xb = xt + Eb
31     yo = H * xt + Eo
32     #
33     xb = xb.A1
34     yo = yo.A1
35     #
36     # Définition des matrices de covariances d'erreurs
37     # ------------------------------------------------
38     B  = numpy.matrix(numpy.core.identity(dimension)).T
39     R  = alpha * B
40     #
41     # Analyse BLUE
42     # ------------
43     ADD = AssimilationStudy()
44     ADD.setBackground         (asVector     = xb )
45     ADD.setBackgroundError    (asCovariance = B )
46     ADD.setObservation        (asVector     = yo )
47     ADD.setObservationError   (asCovariance = R )
48     ADD.setObservationOperator(asMatrix     = H )
49     #
50     ADD.setControls()
51     ADD.setAlgorithm(choice="Blue")
52     #
53     ADD.analyze()
54     #
55     xa = ADD.get("Analysis").valueserie(0)
56     d  = ADD.get("Innovation").valueserie(0)
57     #
58     # Calcul RMS pour d et OMA
59     # ------------------------
60     ADD.setDiagnostic("RMS",
61         name = "Calcul de la RMS sur l'innovation et OMA",
62         )
63     RMS = ADD.get("Calcul de la RMS sur l'innovation et OMA")
64     #
65     # La RMS de l'innovation d
66     # ------------------------
67     RMS.calculate(d,numpy.zeros(len(d)))
68     # Le calcul ci-dessus doit être identique à : RMS.calculate(xb,yo)
69     #
70     # La RMS de l'écart OMA
71     # ---------------------
72     RMS.calculate(xa,yo)
73     #
74     # Vérification du résultat
75     # ------------------------
76     if (RMS.valueserie(1) - (alpha/(1. + alpha)) * RMS.valueserie(0)) > precision:
77         raise ValueError("Résultat du test erroné")
78     else:
79         print test.__doc__
80         print "    Test correct, erreur maximale inférieure à %s"%precision
81         print
82
83 #===============================================================================
84 if __name__ == "__main__":
85
86     print
87     print "AUTODIAGNOSTIC"
88     print "=============="
89     
90     test()