Skip to content

Commit 645db65

Browse files
committed
type fixes
1 parent 1305e8a commit 645db65

5 files changed

Lines changed: 29 additions & 24 deletions

File tree

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "RobustAndOptimalControl"
22
uuid = "21fd56a4-db03-40ee-82ee-a87907bee541"
33
authors = ["Fredrik Bagge Carlson", "Marcus Greiff"]
4-
version = "0.2.2"
4+
version = "0.2.3"
55

66
[deps]
77
ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66"

src/ExtendedStateSpace.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ end
295295
#####################################################################
296296
Base.ndims(::ExtendedStateSpace) = 2 # NOTE: Also for SISO systems?
297297
Base.size(sys::ExtendedStateSpace) = (noutputs(sys), ninputs(sys)) # NOTE: or just size(sys.D)
298-
Base.size(sys::ExtendedStateSpace, d) = d <= 2 ? size(sys)[d] : 1
298+
Base.size(sys::ExtendedStateSpace, d::Integer) = d <= 2 ? size(sys)[d] : 1
299299
Base.eltype(::Type{S}) where {S<:ExtendedStateSpace} = S
300300
ControlSystems.numeric_type(sys::ExtendedStateSpace) = eltype(sys.A)
301301

@@ -354,7 +354,7 @@ function ControlSystems.lft(G::ExtendedStateSpace, Δ, type=:l)
354354
# end
355355

356356
if type === :l
357-
feedback(G, Δ)
357+
lft(ss(G), Δ, :l)
358358
else
359359
error("Invalid type of lft ($type), specify type=:l")
360360
end

src/named_systems2.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,18 +120,18 @@ fb = feedback(s1, s2, r = :r) #
120120
"""
121121
function named_ss(sys::AbstractStateSpace{T};
122122
x = [Symbol("x$i") for i in 1:sys.nx],
123-
u = [Symbol("u$i") for i in 1:sys.nu],
124-
y = [Symbol("y$i") for i in 1:sys.ny],
123+
u = [Symbol("u$i") for i in 1:size(sys,2)], # sinze is used instead of sys.nu for ExtendedStateSpace
124+
y = [Symbol("y$i") for i in 1:size(sys,1)],
125125
) where T
126126
x = expand_symbol(x, sys.nx)
127-
u = expand_symbol(u, sys.nu)
128-
y = expand_symbol(y, sys.ny)
127+
u = expand_symbol(u, size(sys,2))
128+
y = expand_symbol(y, size(sys,1))
129129
length(x) == sys.nx ||
130-
throw(ArgumentError("Length of state names must match sys.nx ($(sys.nx))"))
131-
length(u) == sys.nu ||
132-
throw(ArgumentError("Length of input names must match sys.nu ($(sys.nu))"))
133-
length(y) == sys.ny ||
134-
throw(ArgumentError("Length of output names must match sys.ny ($(sys.ny))"))
130+
throw(ArgumentError("Length of state names must match sys.nx ($(sys.nx)), got length $(length(x))"))
131+
length(u) == size(sys,2) ||
132+
throw(ArgumentError("Length of input names must match size(sys,2) ($(size(sys,2))), got length $(length(u))"))
133+
length(y) == size(sys,1) ||
134+
throw(ArgumentError("Length of output names must match size(sys,1) ($(size(sys,1))), got length $(length(y))"))
135135

136136
@check_unique x "x"
137137
@check_unique u "u"

src/uncertainty_interface.jl

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ function Base.promote_rule(::Type{N}, ::Type{δ{C, F}}) where {N <: Number, F, C
4949
δ{promote_type(N, C), promote_type(N, F)}
5050
end
5151

52-
Base.convert(::Type{δ{C, F}}, n::Number) where {C,F} = δ(n, 0.0)
52+
Base.convert(::Type{δ{C, F}}, n::Number) where {C,F} = δ(C(n), zero(F))
5353
Base.convert(::Type{δ{C, F}}, d:) where {C,F} = δ(C(d.val), F(d.radius), d.name)
5454

5555
# + and - we define here, all other ops generate ExtendedStateSpace. THis is to avoid creating a complicated tagging mechanism
@@ -140,16 +140,16 @@ for f in [:system_mapping, :performance_mapping, :ss]
140140
@eval $f(s::UncertainSS, args...; kwargs...) = $f(s.sys, args...; kwargs...)
141141
end
142142

143-
function Base.promote_rule(::Type{U}, ::Type{δ{C, F}}) where {U <: UncertainSS, F, C}
144-
UncertainSS
143+
function Base.promote_rule(::Type{UncertainSS{TE}}, ::Type{δ{C, F}}) where {TE, F, C}
144+
UncertainSS{TE}
145145
end
146146

147-
function Base.promote_rule(::Type{U}, ::Type{L}) where {U <: UncertainSS, L <: LTISystem}
148-
UncertainSS
147+
function Base.promote_rule(::Type{UncertainSS{TE}}, ::Type{L}) where {TE, L <: LTISystem}
148+
UncertainSS{TE}
149149
end
150150

151-
function Base.promote_rule(::Type{U}, ::Type{L}) where {U <: UncertainSS, L <: AbstractArray}
152-
UncertainSS
151+
function Base.promote_rule(::Type{UncertainSS{TE}}, ::Type{L}) where {TE, L <: AbstractArray}
152+
UncertainSS{TE}
153153
end
154154

155155
function Base.convert(::Type{U}, d:) where {U <: UncertainSS}
@@ -206,8 +206,12 @@ Create a diagonal uncertain statespace object with the uncertain elements `d` on
206206
function uss(d::AbstractVector{<:δ}, Ts = nothing)
207207
vals = getfield.(d, :val)
208208
rads = getfield.(d, :radius)
209+
nonzero = rads .> 0
210+
# vals = vals
211+
# rads = rads
212+
nd = count(nonzero)
209213
n = length(d)
210-
uss(0I(n), I(n), diagm(rads), diagm(vals), normalize.(d), Ts)
214+
uss(0I(nd), I(n)[nonzero, :], diagm(rads)[:, nonzero], diagm(vals), normalize.(d[nonzero]), Ts)
211215
end
212216

213217
uss(n::Number, Ts=nothing) = uss(zeros(0,0), zeros(0,1), zeros(1,0), 1, [], Ts)
@@ -336,11 +340,12 @@ function ControlSystems.lft(G::UncertainSS, Δ::AbstractArray=G.Δ, type=:u)
336340
end
337341

338342
function ControlSystems.lft(G::UncertainSS, K::LTISystem, type=:l)
339-
if type !== :l
340-
error("Invalid type of lft ($type), specify type=:l")
343+
if type === :u
344+
sys = lft(ss(G.sys), ss(K), :u)
341345
else
346+
nu1, ny1 = G.nw, G.nz
342347
sys = lft(ss(G.sys), ss(K), :l)
343-
sys = partition(sys, sys.nu, sys.nu)
348+
sys = partition(sys, nu1, ny1)
344349
UncertainSS(sys, G.Δ)
345350
end
346351
end

test/test_reduction.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ D = [10.0 0.0; 0.0 10.0]
6767
WT = ss(A, B, C, D)
6868
P = hinfpartition(G, WS, WU, WT)
6969

70-
flag, C, γ = hinfsynthesize(P)
70+
flag, C, γ = hinfsynthesize(P, γrel=1)
7171

7272
Pcl, S, CS, T = hinfsignals(P, G, C)
7373

0 commit comments

Comments
 (0)