@@ -48,6 +48,40 @@ plot!(MXe[2,1:30:end],label="y",color=:red,errorbar=SXe[2,1:30:end])
4848
4949
5050using LinearAlgebra
51+ function solve_res (f,x0:: AbstractVector ,sqΣ0, θ,dt,N,Nr)
52+ n = length (x0)
53+ n2 = 2 * length (x0)
54+ Qp = sqrt (n)* [I (n) - I (n)]
55+
56+ X = hcat ([zero (x0) for i= 1 : N]. .. )
57+ S = hcat ([zero (x0) for i= 1 : N]. .. )
58+ X[:,1 ]= x0
59+ Xp = x0 .+ sqΣ0* Qp
60+ sqΣ = sqΣ0
61+ Σ = sqΣ* sqΣ'
62+ S[:,1 ]= diag (Σ)
63+ for t= 1 : N- 1
64+ if rem (t,Nr)== 0
65+ Xp .= X[:,t] .+ sqΣ * Qp
66+ end
67+ for i= 1 : n2 # all quadrature points
68+ Xp[:,i]. = Xp[:,i] + [dt* f (Xp[1 : 2 ,i],[Xp[3 ,i];θ[2 : end ]]);0 ]
69+ end
70+ mXp= mean (Xp,dims= 2 )
71+ X[:,t+ 1 ]= mXp
72+ Σ= Matrix ((Xp.- mXp)* (Xp.- mXp)' / n2)
73+ S2= cov (Xp,dims= 2 )
74+ @show Σ
75+ @show S2
76+ S[:,t+ 1 ]= sqrt .(diag (Σ))
77+ # @show Σ
78+
79+ sqΣ = cholesky (Σ). L
80+
81+ end
82+ X,S
83+ end
84+
5185function solve (f,x0:: AbstractVector ,Σ0, θ,dt,N)
5286 n = length (x0)
5387 n2 = 2 * length (x0)
@@ -69,7 +103,7 @@ function solve(f,x0::AbstractVector,Σ0, θ,dt,N)
69103 end
70104 mXp= mean (Xp,dims= 2 )
71105 X[:,t+ 1 ]= mXp
72- Σ= Matrix ((Xp .- mXp) * (Xp .- mXp) ' / n2 )
106+ Σ= cov (Xp,dims = 2 )
73107 S[:,t+ 1 ]= sqrt .(diag (Σ))
74108 # @show Σ
75109 end
@@ -84,23 +118,41 @@ plot!(QX[2,1:30:end],label="y",color=:red,errorbar=QS[2,1:30:end])
84118
85119savefig (" LV_Quadrics.svg" )
86120
121+ QXr,QSr= solve_res (f,[1.0 ,1.0 ,0.1 ],diagm ([0.1 ,0.1 ,0.01 ]),θ0,0.1 ,1000 ,100 )
122+ plot (QXr[1 ,1 : 30 : end ],label= " x" ,color= :blue ,errorbar= QSr[1 ,1 : 30 : end ])
123+ plot! (QXr[2 ,1 : 30 : end ],label= " y" ,color= :red ,errorbar= QSr[2 ,1 : 30 : end ])
124+
87125function filter (f,x0:: AbstractVector ,Σ0, θ,dt,Ne,Y,σy)
88126 XX= []
89127 SS= []
90128 Σ= Σ0
91129 x= x0
92130 for t= 1 : length (Y)
93131 @show x
94- @show eigen (Σ)
132+ @show diag (Σ)
95133 Xt,St,Xp= solve (f,x,Σ,θ,dt,Ne) # prediction
96- Yp = Xp[1 ,:] # measure only the first variable
97- mYp = mean (Yp)
98- mXp = mean (Xp,dims= 2 )
99- SYp = cov (Yp)+ σy
100- C = mean ([(Xp[:,i]. - mXp)* (Yp[i]. - mYp) for i= 1 : 6 ])
101- G = C* inv (SYp)
102- x = vec (Xt[:,end ] + G* (Y[t]- mYp))
103- Σ = cov (Xp,dims= 2 ) - G* SYp* G'
134+ if false
135+ @show Xp
136+ Yp = Xp[1 ,:] # measure only the first variable
137+ @show Yp
138+ mYp = mean (Yp)
139+ mXp = mean (Xp,dims= 2 )
140+ SYp = cov (Yp)+ σy
141+ @show SYp
142+ C = mean ([(Xp[:,i]. - mXp)* (Yp[i]. - mYp) for i= 1 : 6 ])
143+ @show C
144+ G = C* inv (SYp)
145+ @show G
146+ x = vec (Xt[:,end ] + G* (Y[t]- mYp))
147+ Σ = Matrix ((Xp.- mXp)* (Xp.- mXp)' / n2) - G* SYp* G'
148+
149+ # Σ = cov(Xp,dims=2) - G*SYp*G'
150+ else
151+ x = vec (mean (Xp,dims= 2 ))
152+ Σ = Matrix ((Xp.- x)* (Xp.- x)' / 6.0 )
153+
154+ end
155+
104156 push! (XX,Xt)
105157 push! (SS,St)
106158 end
@@ -110,11 +162,11 @@ end
110162
111163
112164Y = X[1 ,100 : 100 : end ]
113- Xh,Sh= filter (f,[1.0 ,1.0 ,0.1 ],diagm ([0.1 ,0.1 ,0.01 ]. ^ 2 ),θ0,0.1 ,100 ,Y, 0.01 )
165+ Xh,Sh= filter (f,[1.0 ,1.0 ,0.1 ],diagm ([0.1 ,0.1 ,0.01 ]. ^ 2 ),θ0,0.1 ,100 ,Y[ 1 : end ], 1e8 )
114166XF= hcat (Xh... )
115167SF= hcat (Sh... )
116168
117- step= 10
169+ step= 1
118170plot ([1 : step: size (XF,2 )],XF[1 ,1 : step: end ],label= " x" ,color= :blue ,errorbar= SF[1 ,1 : step: end ])
119171plot! ([1 : step: size (XF,2 )],XF[2 ,1 : step: end ],label= " y" ,color= :red ,errorbar= SF[2 ,1 : step: end ])
120172scatter! ([100 : 100 : size (XF,2 )],Y,label= " measured" ,marker= :xcross )
0 commit comments