Skip to content

Commit 2ea9ad1

Browse files
authored
Merge pull request #49 from JuliaControl/print_slack_var
added: print info on controller and estimator constraints softening
2 parents 4e6b0c2 + 1360ed5 commit 2ea9ad1

File tree

8 files changed

+13
-18
lines changed

8 files changed

+13
-18
lines changed

docs/src/manual/nonlinmpc.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,7 @@ nmpc = NonLinMPC(estim, Hp=20, Hc=2, Mwt=[0.5], Nwt=[2.5], Cwt=Inf)
112112
nmpc = setconstraint!(nmpc, umin=[-1.5], umax=[+1.5])
113113
```
114114

115-
The option `Cwt=Inf` disables constraint softening. We test `mpc` performance on `plant` by
116-
imposing an angular setpoint of 180° (inverted position):
115+
The option `Cwt=Inf` disables the slack variable `ϵ` for constraint softening. We test `mpc` performance on `plant` by imposing an angular setpoint of 180° (inverted position):
117116

118117
```@example 1
119118
using Logging; disable_logging(Warn) # hide

src/controller/construct.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ julia> mpc = setconstraint!(mpc, umin=[0], umax=[100], Δumin=[-10], Δumax=[+10
7272
LinMPC controller with a sample time Ts = 4.0 s, OSQP optimizer, SteadyKalmanFilter estimator and:
7373
10 prediction steps Hp
7474
2 control steps Hc
75+
1 slack variable ϵ (control constraints)
7576
1 manipulated inputs u (0 integrating states)
7677
2 estimated states x̂
7778
1 measured outputs ym (1 integrating states)

src/controller/explicitmpc.jl

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -133,22 +133,7 @@ end
133133
134134
Use custom state estimator `estim` to construct `ExplicitMPC`.
135135
136-
`estim.model` must be a [`LinModel`](@ref). Else, a [`NonLinMPC`](@ref) is required.
137-
138-
# Examples
139-
```jldoctest
140-
julia> estim = KalmanFilter(LinModel([tf(3, [30, 1]); tf(-2, [5, 1])], 4), i_ym=[2]);
141-
142-
julia> mpc = ExplicitMPC(estim, Mwt=[0, 1], Nwt=[0.5], Hp=30, Hc=1)
143-
ExplicitMPC controller with a sample time Ts = 4.0 s, KalmanFilter estimator and:
144-
30 prediction steps Hp
145-
1 control steps Hc
146-
1 manipulated inputs u (0 integrating states)
147-
3 estimated states x̂
148-
1 measured outputs ym (1 integrating states)
149-
1 unmeasured outputs yu
150-
0 measured disturbances d
151-
```
136+
`estim.model` must be a [`LinModel`](@ref). Else, a [`NonLinMPC`](@ref) is required.
152137
"""
153138
function ExplicitMPC(
154139
estim::SE;

src/controller/linmpc.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ julia> mpc = LinMPC(model, Mwt=[0, 1], Nwt=[0.5], Hp=30, Hc=1)
139139
LinMPC controller with a sample time Ts = 4.0 s, OSQP optimizer, SteadyKalmanFilter estimator and:
140140
30 prediction steps Hp
141141
1 control steps Hc
142+
1 slack variable ϵ (control constraints)
142143
1 manipulated inputs u (0 integrating states)
143144
4 estimated states x̂
144145
2 measured outputs ym (2 integrating states)
@@ -203,6 +204,7 @@ julia> mpc = LinMPC(estim, Mwt=[0, 1], Nwt=[0.5], Hp=30, Hc=1)
203204
LinMPC controller with a sample time Ts = 4.0 s, OSQP optimizer, KalmanFilter estimator and:
204205
30 prediction steps Hp
205206
1 control steps Hc
207+
1 slack variable ϵ (control constraints)
206208
1 manipulated inputs u (0 integrating states)
207209
3 estimated states x̂
208210
1 measured outputs ym (1 integrating states)

src/controller/nonlinmpc.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ julia> mpc = NonLinMPC(model, Hp=20, Hc=1, Cwt=1e6)
151151
NonLinMPC controller with a sample time Ts = 10.0 s, Ipopt optimizer, UnscentedKalmanFilter estimator and:
152152
20 prediction steps Hp
153153
1 control steps Hc
154+
1 slack variable ϵ (control constraints)
154155
1 manipulated inputs u (0 integrating states)
155156
2 estimated states x̂
156157
1 measured outputs ym (1 integrating states)
@@ -229,6 +230,7 @@ julia> mpc = NonLinMPC(estim, Hp=20, Hc=1, Cwt=1e6)
229230
NonLinMPC controller with a sample time Ts = 10.0 s, Ipopt optimizer, UnscentedKalmanFilter estimator and:
230231
20 prediction steps Hp
231232
1 control steps Hc
233+
1 slack variable ϵ (control constraints)
232234
1 manipulated inputs u (0 integrating states)
233235
2 estimated states x̂
234236
1 measured outputs ym (1 integrating states)

src/estimator/mhe.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ function print_estim_dim(io::IO, estim::MovingHorizonEstimator, n)
1616
nu, nd = estim.model.nu, estim.model.nd
1717
nx̂, nym, nyu = estim.nx̂, estim.nym, estim.nyu
1818
He = estim.He
19+
= isinf(estim.C) ? 0 : 1
1920
println(io, "$(lpad(He, n)) estimation steps He")
21+
println(io, "$(lpad(nϵ, n)) slack variable ϵ (estimation constraints)")
2022
println(io, "$(lpad(nu, n)) manipulated inputs u ($(sum(estim.nint_u)) integrating states)")
2123
println(io, "$(lpad(nx̂, n)) estimated states x̂")
2224
println(io, "$(lpad(nym, n)) measured outputs ym ($(sum(estim.nint_ym)) integrating states)")

src/estimator/mhe/construct.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ julia> model = NonLinModel((x,u,_)->0.1x+u, (x,_)->2x, 10.0, 1, 1, 1, solver=not
212212
julia> estim = MovingHorizonEstimator(model, He=5, σR=[1], σP0=[0.01])
213213
MovingHorizonEstimator estimator with a sample time Ts = 10.0 s, Ipopt optimizer, NonLinModel and:
214214
5 estimation steps He
215+
0 slack variable ϵ (estimation constraints)
215216
1 manipulated inputs u (0 integrating states)
216217
2 estimated states x̂
217218
1 measured outputs ym (1 integrating states)
@@ -366,6 +367,7 @@ julia> estim = MovingHorizonEstimator(LinModel(ss(0.5,1,1,0,1)), He=3);
366367
julia> estim = setconstraint!(estim, x̂min=[-50, -50], x̂max=[50, 50])
367368
MovingHorizonEstimator estimator with a sample time Ts = 1.0 s, OSQP optimizer, LinModel and:
368369
3 estimation steps He
370+
0 slack variable ϵ (estimation constraints)
369371
1 manipulated inputs u (0 integrating states)
370372
2 estimated states x̂
371373
1 measured outputs ym (1 integrating states)

src/predictive_control.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ setstate!(mpc::PredictiveController, x̂) = (setstate!(mpc.estim, x̂); return m
3434

3535
function Base.show(io::IO, mpc::PredictiveController)
3636
Hp, Hc = mpc.Hp, mpc.Hc
37+
= isinf(mpc.C) ? 0 : 1
3738
nu, nd = mpc.estim.model.nu, mpc.estim.model.nd
3839
nx̂, nym, nyu = mpc.estim.nx̂, mpc.estim.nym, mpc.estim.nyu
3940
n = maximum(ndigits.((Hp, Hc, nu, nx̂, nym, nyu, nd))) + 1
@@ -42,6 +43,7 @@ function Base.show(io::IO, mpc::PredictiveController)
4243
"$(typeof(mpc.estim).name.name) estimator and:")
4344
println(io, "$(lpad(Hp, n)) prediction steps Hp")
4445
println(io, "$(lpad(Hc, n)) control steps Hc")
46+
println(io, "$(lpad(nϵ, n)) slack variable ϵ (control constraints)")
4547
print_estim_dim(io, mpc.estim, n)
4648
end
4749

0 commit comments

Comments
 (0)