@@ -753,9 +753,10 @@ are calculated by:
753753```
754754"""
755755function init_ΔUtoU (nu, Hp, Hc)
756- S_Hc = LowerTriangular (repeat (I (nu), Hc, Hc))
757- S = [S_Hc; repeat (I (nu), Hp - Hc, Hc)]
758- T = repeat (I (nu), Hp)
756+ I_nu = BitMatrix (I (nu))
757+ S_Hc = LowerTriangular (repeat (I_nu, Hc, Hc))
758+ S = [S_Hc; repeat (I_nu, Hp - Hc, Hc)]
759+ T = repeat (I_nu, Hp)
759760 return S, T
760761end
761762
@@ -834,7 +835,7 @@ For the terminal constraints, the matrices are computed with the function
834835\e nd{aligned}
835836```
836837"""
837- function init_predmat (estim:: StateEstimator , model:: LinModel{NT} , Hp, Hc) where {NT<: Real }
838+ function init_predmat (estim:: StateEstimator{NT} , model:: LinModel , Hp, Hc) where {NT<: Real }
838839 Â, B̂u, Ĉ, B̂d, D̂d = estim. Â, estim. B̂u, estim. Ĉ, estim. B̂d, estim. D̂d
839840 nu, nx̂, ny, nd = model. nu, estim. nx̂, model. ny, model. nd
840841 # --- pre-compute matrix powers ---
@@ -893,7 +894,7 @@ function init_predmat(estim::StateEstimator, model::LinModel{NT}, Hp, Hc) where
893894end
894895
895896" Return empty matrices if `model` is not a [`LinModel`](@ref)"
896- function init_predmat (estim:: StateEstimator , model:: SimModel{NT} , Hp, Hc) where {NT<: Real }
897+ function init_predmat (estim:: StateEstimator{NT} , model:: SimModel , Hp, Hc) where {NT<: Real }
897898 nu, nx̂, nd = model. nu, estim. nx̂, model. nd
898899 E = zeros (NT, 0 , nu* Hc)
899900 G = zeros (NT, 0 , nd)
@@ -1025,8 +1026,8 @@ function init_defaultcon(
10251026 repeat_constraints (Hp, Hc, umin, umax, Δumin, Δumax, ymin, ymax)
10261027 C_umin, C_umax, C_Δumin, C_Δumax, C_ymin, C_ymax =
10271028 repeat_constraints (Hp, Hc, c_umin, c_umax, c_Δumin, c_Δumax, c_ymin, c_ymax)
1028- A_Umin, A_Umax, S̃ = relaxU (C, C_umin, C_umax, S)
1029- A_ΔŨmin, A_ΔŨmax, ΔŨmin, ΔŨmax, Ñ_Hc = relaxΔU (C, C_Δumin, C_Δumax, ΔUmin, ΔUmax, N_Hc)
1029+ A_Umin, A_Umax, S̃ = relaxU (model, C, C_umin, C_umax, S)
1030+ A_ΔŨmin, A_ΔŨmax, ΔŨmin, ΔŨmax, Ñ_Hc = relaxΔU (model, C, C_Δumin, C_Δumax, ΔUmin, ΔUmax, N_Hc)
10301031 A_Ymin, A_Ymax, Ẽ = relaxŶ (model, C, C_ymin, C_ymax, E)
10311032 A_x̂min, A_x̂max, ẽx̂ = relaxterminal (model, C, c_x̂min, c_x̂max, ex̂)
10321033 i_Umin, i_Umax = .! isinf .(Umin), .! isinf .(Umax)
@@ -1060,7 +1061,7 @@ function repeat_constraints(Hp, Hc, umin, umax, Δumin, Δumax, ymin, ymax)
10601061end
10611062
10621063@doc raw """
1063- relaxU(C, C_umin, C_umax, S) -> A_Umin, A_Umax, S̃
1064+ relaxU(model, C, C_umin, C_umax, S) -> A_Umin, A_Umax, S̃
10641065
10651066Augment manipulated inputs constraints with slack variable ϵ for softening.
10661067
@@ -1080,21 +1081,24 @@ constraints:
10801081\e nd{bmatrix}
10811082```
10821083"""
1083- function relaxU (C, C_umin, C_umax, S)
1084+ function relaxU (:: SimModel{NT} , C, C_umin, C_umax, S) where {NT<: Real }
1085+ S_NT = convert (Matrix{NT}, S)
10841086 if ! isinf (C) # ΔŨ = [ΔU; ϵ]
10851087 # ϵ impacts ΔU → U conversion for constraint calculations:
1086- A_Umin, A_Umax = - [S C_umin], [S - C_umax]
1088+ A_Umin, A_Umax = - [S_NT C_umin], [S_NT - C_umax]
10871089 # ϵ has no impact on ΔU → U conversion for prediction calculations:
10881090 S̃ = [S falses (size (S, 1 ))]
10891091 else # ΔŨ = ΔU (only hard constraints)
1090- A_Umin, A_Umax = - S , S
1092+ A_Umin, A_Umax = - S_NT , S_NT
10911093 S̃ = S
10921094 end
10931095 return A_Umin, A_Umax, S̃
10941096end
10951097
10961098@doc raw """
1097- relaxΔU(C, C_Δumin, C_Δumax, ΔUmin, ΔUmax, N_Hc) -> A_ΔŨmin, A_ΔŨmax, ΔŨmin, ΔŨmax, Ñ_Hc
1099+ relaxΔU(
1100+ model, C, C_Δumin, C_Δumax, ΔUmin, ΔUmax, N_Hc
1101+ ) -> A_ΔŨmin, A_ΔŨmax, ΔŨmin, ΔŨmax, Ñ_Hc
10981102
10991103Augment input increments constraints with slack variable ϵ for softening.
11001104
@@ -1114,18 +1118,19 @@ returns the augmented constraints ``\mathbf{ΔŨ_{min}}`` and ``\mathbf{ΔŨ_{
11141118\e nd{bmatrix}
11151119```
11161120"""
1117- function relaxΔU (C:: NT , C_Δumin, C_Δumax, ΔUmin, ΔUmax, N_Hc) where {NT<: Real }
1121+ function relaxΔU (:: SimModel{NT} , C, C_Δumin, C_Δumax, ΔUmin, ΔUmax, N_Hc) where {NT<: Real }
1122+ diag_N_Hc = diag (N_Hc)
11181123 if ! isinf (C) # ΔŨ = [ΔU; ϵ]
11191124 # 0 ≤ ϵ ≤ ∞
1120- ΔŨmin, ΔŨmax = [ΔUmin; 0.0 ], [ΔUmax; Inf ]
1121- A_ϵ = [zeros (NT, 1 , length (ΔUmin)) [1.0 ]]
1125+ ΔŨmin, ΔŨmax = [ΔUmin; NT[ 0.0 ]] , [ΔUmax; NT[ Inf ] ]
1126+ A_ϵ = [zeros (NT, 1 , length (ΔUmin)) NT [1.0 ]]
11221127 A_ΔŨmin, A_ΔŨmax = - [I C_Δumin; A_ϵ], [I - C_Δumax; A_ϵ]
1123- Ñ_Hc = Diagonal ([ diag (N_Hc) ; C])
1128+ Ñ_Hc = Diagonal {NT} ([diag_N_Hc ; C])
11241129 else # ΔŨ = ΔU (only hard constraints)
11251130 ΔŨmin, ΔŨmax = ΔUmin, ΔUmax
11261131 I_Hc = Matrix {NT} (I, size (N_Hc))
11271132 A_ΔŨmin, A_ΔŨmax = - I_Hc, I_Hc
1128- Ñ_Hc = N_Hc
1133+ Ñ_Hc = Diagonal {NT} (diag_N_Hc)
11291134 end
11301135 return A_ΔŨmin, A_ΔŨmax, ΔŨmin, ΔŨmax, Ñ_Hc
11311136end
0 commit comments