Skip to content

Commit a4a9a06

Browse files
committed
debug : MHE initstate! for linear model now works
1 parent b215e99 commit a4a9a06

File tree

1 file changed

+39
-33
lines changed

1 file changed

+39
-33
lines changed

src/estimator/mhe.jl

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,7 @@ end
874874

875875
"Reset `estim.P̂arr_old`, `estim.invP̄` and the windows for the moving horizon estimator."
876876
function init_estimate_cov!(estim::MovingHorizonEstimator, _ , _ , _ )
877-
estim.invP̄.data[:] = Hermitian(inv(estim.P̂0), :L)
877+
estim.invP̄.data[:] = inv(estim.P̂0)
878878
estim.P̂arr_old.data[:] = estim.P̂0
879879
estim.x̂arr_old .= 0
880880
estim.Z̃ .= 0
@@ -884,6 +884,9 @@ function init_estimate_cov!(estim::MovingHorizonEstimator, _ , _ , _ )
884884
estim.D .= 0
885885
estim.Ŵ .= 0
886886
estim.Nk .= 0
887+
estim..data .= 0
888+
estim.q̃ .= 0
889+
estim.p .= 0
887890
return nothing
888891
end
889892

@@ -902,41 +905,18 @@ for `LinModel`.
902905
"""
903906
function update_estimate!(estim::MovingHorizonEstimator{NT}, u, ym, d) where NT<:Real
904907
model, optim, x̂ = estim.model, estim.optim, estim.
905-
nx̂, nym, nu, nd, nŵ, He = estim.nx̂, estim.nym, model.nu, model.nd, estim.nx̂, estim.He
906-
# ------ add new data to the windows -------------
907-
= zeros(nŵ) # ŵ(k) = 0 for warm-starting
908-
estim.Nk .+= 1
909-
Nk = estim.Nk[]
910-
if Nk > He
911-
estim.X̂[:] = [estim.X̂[nx̂+1:end] ; x̂]
912-
estim.Ym[:] = [estim.Ym[nym+1:end]; ym]
913-
estim.U[:] = [estim.U[nu+1:end] ; u]
914-
estim.D[:] = [estim.D[nd+1:end] ; d]
915-
estim.Ŵ[:] = [estim.Ŵ[nŵ+1:end] ; ŵ]
916-
estim.Nk[:] = [He]
917-
else
918-
estim.X̂[(1 + nx̂*(Nk-1)):(nx̂*Nk)] =
919-
estim.Ym[(1 + nym*(Nk-1)):(nym*Nk)] = ym
920-
estim.U[(1 + nu*(Nk-1)):(nu*Nk)] = u
921-
estim.D[(1 + nd*(Nk-1)):(nd*Nk)] = d
922-
estim.Ŵ[(1 + nŵ*(Nk-1)):(nŵ*Nk)] =
923-
end
924-
estim.x̂arr_old[:] = estim.X̂[1:nx̂]
925-
# ---------- initialize estimation vectors ------------
908+
add_data_windows!(estim::MovingHorizonEstimator, u, d, ym)
926909
initpred!(estim, model)
927-
# ---------- initialize linear constraints ------------
928910
linconstraint!(estim, model)
929-
# ----------- initial guess -----------------------
930-
Nk = estim.Nk[]
931-
nŴ, nYm, nX̂ = nx̂*Nk, nym*Nk, nx̂*Nk
911+
nx̂, nym, nŵ, Nk = estim.nx̂, estim.nym, estim.nx̂, estim.Nk[]
932912
Z̃var::Vector{VariableRef} = optim[:Z̃var]
933-
= Vector{NT}(undef, nYm)
934-
= Vector{NT}(undef, nX̂)
913+
= Vector{NT}(undef, nym*Nk)
914+
= Vector{NT}(undef, nx̂*Nk)
935915
Z̃0 = [estim.x̂arr_old; estim.Ŵ]
936916
V̂, X̂ = predict!(V̂, X̂, estim, model, Z̃0)
937917
J0 = obj_nonlinprog(estim, model, V̂, Z̃0)
938918
# initial Z̃0 with Ŵ=0 if objective or constraint function not finite :
939-
isfinite(J0) || (Z̃0 = [estim.x̂arr_old; zeros(NT, nŴ)])
919+
isfinite(J0) || (Z̃0 = [estim.x̂arr_old; zeros(NT, nŵ*estim.He)])
940920
set_start_value.(Z̃var, Z̃0)
941921
# ------- solve optimization problem --------------
942922
try
@@ -965,17 +945,42 @@ function update_estimate!(estim::MovingHorizonEstimator{NT}, u, ym, d) where NT<
965945
end
966946
estim.Z̃[:] = !isfatal(status) ? Z̃curr : Z̃last
967947
# --------- update estimate -----------------------
968-
estim.Ŵ[1:nŴ] = estim.Z̃[nx̂+1:nx̂+nŴ] # update Ŵ with optimum for next time step
948+
estim.Ŵ[1:nŵ*Nk] = estim.Z̃[nx̂+1:nx̂+nŵ*Nk] # update Ŵ with optimum for next time step
969949
V̂, X̂ = predict!(V̂, X̂, estim, model, estim.Z̃)
970-
x̂[:] = X̂[(1 + nx̂*(Nk-1)):(nx̂*Nk)]
971-
if Nk == He
972-
uarr, ymarr, darr = estim.U[1:nu], estim.Ym[1:nym], estim.D[1:nd]
950+
x̂[:] = X̂[end-nx̂+1:end]
951+
if Nk == estim.He
952+
uarr, ymarr, darr = estim.U[1:model.nu], estim.Ym[1:nym], estim.D[1:model.nd]
973953
update_cov!(estim.P̂arr_old, estim, model, uarr, ymarr, darr)
974954
estim.invP̄.data[:] = Hermitian(inv(estim.P̂arr_old), :L)
975955
end
976956
return nothing
977957
end
978958

959+
"Add data to the observation windows of the moving horizon estimator."
960+
function add_data_windows!(estim::MovingHorizonEstimator, u, d, ym)
961+
model = estim.model
962+
nx̂, nym, nu, nd, nŵ = estim.nx̂, estim.nym, model.nu, model.nd, estim.nx̂
963+
x̂, ŵ = estim.x̂, zeros(nŵ) # ŵ(k) = 0 for warm-starting
964+
estim.Nk .+= 1
965+
Nk = estim.Nk[]
966+
if Nk > estim.He
967+
estim.X̂[:] = [estim.X̂[nx̂+1:end] ; x̂]
968+
estim.Ym[:] = [estim.Ym[nym+1:end]; ym]
969+
estim.U[:] = [estim.U[nu+1:end] ; u]
970+
estim.D[:] = [estim.D[nd+1:end] ; d]
971+
estim.Ŵ[:] = [estim.Ŵ[nŵ+1:end] ; ŵ]
972+
estim.Nk[:] = [estim.He]
973+
else
974+
estim.X̂[(1 + nx̂*(Nk-1)):(nx̂*Nk)] =
975+
estim.Ym[(1 + nym*(Nk-1)):(nym*Nk)] = ym
976+
estim.U[(1 + nu*(Nk-1)):(nu*Nk)] = u
977+
estim.D[(1 + nd*(Nk-1)):(nd*Nk)] = d
978+
estim.Ŵ[(1 + nŵ*(Nk-1)):(nŵ*Nk)] =
979+
end
980+
estim.x̂arr_old[:] = estim.X̂[1:nx̂]
981+
return nothing
982+
end
983+
979984
@doc raw"""
980985
initpred!(estim::MovingHorizonEstimator, model::LinModel)
981986
@@ -1007,6 +1012,7 @@ function initpred!(estim::MovingHorizonEstimator, model::LinModel)
10071012
return nothing
10081013
end
10091014

1015+
"Does nothing if `model` is not a [`LinModel`](@ref)."
10101016
initpred!(estim::MovingHorizonEstimator, model::SimModel) = nothing
10111017

10121018
function linconstraint!(estim::MovingHorizonEstimator, model::LinModel)

0 commit comments

Comments
 (0)