Skip to content

Commit 9984624

Browse files
committed
hunting bugs in prediction
1 parent b844c9a commit 9984624

File tree

1 file changed

+64
-12
lines changed

1 file changed

+64
-12
lines changed

docs/src/lecture_13/ode.jl

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,40 @@ plot!(MXe[2,1:30:end],label="y",color=:red,errorbar=SXe[2,1:30:end])
4848

4949

5050
using 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+
5185
function 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

85119
savefig("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+
87125
function 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

112164
Y = 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)
114166
XF=hcat(Xh...)
115167
SF=hcat(Sh...)
116168

117-
step=10
169+
step=1
118170
plot([1:step:size(XF,2)],XF[1,1:step:end],label="x",color=:blue,errorbar=SF[1,1:step:end])
119171
plot!([1:step:size(XF,2)],XF[2,1:step:end],label="y",color=:red,errorbar=SF[2,1:step:end])
120172
scatter!([100:100:size(XF,2)],Y,label="measured",marker=:xcross)

0 commit comments

Comments
 (0)