874874
875875" Reset `estim.P̂arr_old`, `estim.invP̄` and the windows for the moving horizon estimator."
876876function 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. H̃. data .= 0
888+ estim. q̃ .= 0
889+ estim. p .= 0
887890 return nothing
888891end
889892
@@ -902,41 +905,18 @@ for `LinModel`.
902905"""
903906function update_estimate! (estim:: MovingHorizonEstimator{NT} , u, ym, d) where NT<: Real
904907 model, optim, x̂ = estim. model, estim. optim, estim. x̂
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)] = x̂
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- V̂ = Vector {NT} (undef, nYm )
934- X̂ = Vector {NT} (undef, nX̂ )
913+ V̂ = Vector {NT} (undef, nym * Nk )
914+ X̂ = 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
977957end
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)] = x̂
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
10081013end
10091014
1015+ " Does nothing if `model` is not a [`LinModel`](@ref)."
10101016initpred! (estim:: MovingHorizonEstimator , model:: SimModel ) = nothing
10111017
10121018function linconstraint! (estim:: MovingHorizonEstimator , model:: LinModel )
0 commit comments