1 # -*- coding: utf-8 -*-
3 from numpy import array, random
8 Yobs.append([random.normal(Xtrue, 0.1, size=(1,)),])
10 print("Estimation par filtrage d'une variable constante")
11 print("------------------------------------------------")
12 print(" Observations bruitées acquises sur %i pas de temps"%(len(Yobs)-1,))
14 from adao import adaoBuilder
15 case = adaoBuilder.New()
17 case.setBackground (Vector = [0.])
18 case.setBackgroundError (ScalarSparseMatrix = 1.)
20 case.setObservationOperator(Matrix = [1.])
21 case.setObservationError (ScalarSparseMatrix = 0.1**2)
23 case.setEvolutionModel (Matrix = [1.])
24 case.setEvolutionError (ScalarSparseMatrix = 1e-5)
26 case.setAlgorithmParameters(
27 Algorithm="KalmanFilter",
29 "StoreSupplementaryCalculations":[
31 "APosterioriCovariance",
36 # Boucle pour obtenir une analyse à l'arrivée de chaque observation
38 for i in range(1,len(Yobs)):
39 case.setObservation(Vector = Yobs[i])
40 case.execute( nextStep = True )
42 Xa = case.get("Analysis")
43 Pa = case.get("APosterioriCovariance")
45 print(" État analysé à l'observation finale :", Xa[-1])
47 print(" Variance a posteriori finale :", Pa[-1])
50 #-------------------------------------------------------------------------------
52 Observations = array([yo[0] for yo in Yobs])
53 Estimates = array([xa[0] for xa in case.get("Analysis")])
54 Variances = array([pa[0,0] for pa in case.get("APosterioriCovariance")])
56 import matplotlib.pyplot as plt
57 plt.rcParams['figure.figsize'] = (10, 4)
60 plt.plot(Observations,'kx',label='Mesures bruitées')
61 plt.plot(Estimates,'r-',label='État estimé')
62 plt.axhline(Xtrue,color='b',label='Valeur vraie')
64 plt.title('Estimation de l\'état', fontweight='bold')
65 plt.xlabel('Pas d\'observation')
67 plt.savefig("simple_KalmanFilter2_state.png")
70 iobs = range(1,len(Observations))
71 plt.plot(iobs,Variances[iobs],label='Variance d\'erreur a posteriori')
72 plt.title('Estimation de la variance d\'erreur a posteriori', fontweight='bold')
73 plt.xlabel('Pas d\'observation')
74 plt.ylabel('$(Tension)^2$')
75 plt.setp(plt.gca(),'ylim',[0,.01])
76 plt.savefig("simple_KalmanFilter2_variance.png")