1 #-*-coding:iso-8859-1-*-
3 Cas-test vérifiant que l'application des coefficients de correction so et sb
4 conduit à des matrices R et B pour lesquelles ces coefficients sont unitaires.
6 __author__ = "Jean-Philippe ARGAUD - Mars 2008"
9 from daCore.AssimilationStudy import AssimilationStudy
11 #===============================================================================
12 def test(precision = 1.e-13, dimension = 3):
14 Cas-test vérifiant que l'application des coefficients de correction so et sb
15 conduit à des matrices R et B pour lesquelles ces coefficients sont unitaires.
18 # Définition des données "théoriques" vraies
19 # ------------------------------------------
20 xt = numpy.matrix(numpy.arange(dimension)).T
21 Eo = numpy.matrix(numpy.random.normal(0.,1.,size=(dimension,))).T
22 Eb = numpy.matrix(numpy.random.normal(0.,1.,size=(dimension,))).T
24 H = numpy.matrix(numpy.core.identity(dimension))
32 # Définition des matrices d'erreurs
33 # ---------------------------------
34 R = numpy.matrix(numpy.core.identity(dimension)).T
35 B = numpy.matrix(numpy.core.identity(dimension)).T
39 ADD = AssimilationStudy()
40 ADD.setBackground (asVector = xb )
41 ADD.setBackgroundError (asCovariance = B )
42 ADD.setObservation (asVector = yo )
43 ADD.setObservationError (asCovariance = R )
44 ADD.setObservationOperator(asMatrix = H )
47 ADD.setAlgorithm(choice="Blue")
51 xa = numpy.array(ADD.get("Analysis").valueserie(0))
52 d = numpy.array(ADD.get("Innovation").valueserie(0))
53 SigmaObs2 = float( numpy.dot(d,(yo-numpy.dot(H,xa)).A1) / R.trace() )
54 SigmaBck2 = float( numpy.dot(d,numpy.dot(H,(xa - xb)).A1) /(H * B * H.T).trace() )
56 # Analyse BLUE avec correction des matrices R et B
57 # Attention : ce second calcul de BLUE avec le meme objet ADD
58 # conduit à stocker les résultats dans le second step,
59 # donc il faut appeller "valueserie(1)"
60 # ------------------------------------------------
61 ADD.setBackgroundError (asCovariance = SigmaBck2*B )
62 ADD.setObservationError(asCovariance = SigmaObs2*R )
64 new_xa = numpy.array(ADD.get("Analysis").valueserie(1))
65 new_d = numpy.array(ADD.get("Innovation").valueserie(1))
66 new_SigmaObs2 = float( numpy.dot(new_d,(yo-numpy.dot(H,new_xa)).A1) / (SigmaObs2*R.trace()) )
67 new_SigmaBck2 = float( numpy.dot(new_d,numpy.dot(H,(new_xa - xb)).A1) /(H * (SigmaBck2*B) * H.T).trace() )
69 # Vérification du résultat
70 # ------------------------
71 if max(abs(xa - new_xa)) > precision:
72 raise ValueError("Résultat du test erroné (1)")
73 elif max(abs(d - new_d)) > precision:
74 raise ValueError("Résultat du test erroné (2)")
75 elif abs(new_SigmaObs2-1.) > precision:
76 print "new_SigmaObs2 =",new_SigmaObs2
77 raise ValueError("Résultat du test erroné (3)")
78 elif abs(new_SigmaBck2-1.) > precision :
79 print "new_SigmaBck2 =",new_SigmaBck2
80 raise ValueError("Résultat du test erroné (4)")
83 print " Test correct, erreur maximale inférieure à %s"%precision
86 #===============================================================================
87 if __name__ == "__main__":
90 print "AUTODIAGNOSTIC"
91 print "=============="
92 # numpy.random.seed(1000)