Skip to content

Commit bc60e72

Browse files
authored
Merge branch 'master' into MTK10
2 parents b2b3f67 + 78f50ad commit bc60e72

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ uuid = "687d7614-c7e5-45fc-bfc3-9ee385575c88"
33
authors = ["Fredrik Bagge Carlson"]
44
version = "2.4.0"
55

6+
67
[deps]
78
ControlSystemsBase = "aaaaaaaa-a6ca-5380-bf3e-84a91bcd477e"
89
DataInterpolations = "82cc6244-b520-54b8-b5a6-8a565e85f1d0"

src/ode_system.jl

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ symstr(x) = Symbol(x isa AnalysisPoint ? x.name : string(x))
5858

5959

6060
"""
61-
RobustAndOptimalControl.named_ss(sys::ModelingToolkit.AbstractSystem, inputs, outputs; descriptor=true, kwargs...)
61+
RobustAndOptimalControl.named_ss(sys::ModelingToolkit.AbstractSystem, inputs, outputs; descriptor=true, simple_infeigs=true, kwargs...)
6262
6363
Convert an `System` to a `NamedStateSpace` using linearization. `inputs, outputs` are vectors of variables determining the inputs and outputs respectively. See docstring of `ModelingToolkit.linearize` for more info on `kwargs`.
6464
@@ -74,6 +74,7 @@ function RobustAndOptimalControl.named_ss(
7474
inputs,
7575
outputs;
7676
descriptor = true,
77+
simple_infeigs = true,
7778
kwargs...,
7879
)
7980

@@ -112,7 +113,7 @@ function RobustAndOptimalControl.named_ss(
112113
# This indicates that input derivatives are present
113114
duinds = findall(any(!iszero, eachcol(matrices.B[:, nu+1:end]))) .+ nu
114115
u2du = (1:nu) .=> duinds # This maps inputs to their derivatives
115-
lsys = causal_simplification(matrices, u2du; descriptor)
116+
lsys = causal_simplification(matrices, u2du; descriptor, simple_infeigs)
116117
else
117118
lsys = ss(matrices...)
118119
end
@@ -121,18 +122,22 @@ function RobustAndOptimalControl.named_ss(
121122
u0 = [xpt.p[pi] for pi in pind]
122123
xu = (; x = x0, u = u0)
123124
extra = Dict(:operating_point => xu)
124-
125+
# If simple_infeigs=false, the system might have been reduced and the state names might not match the original system.
126+
x_names = simple_infeigs ? symstr.(unknowns(ssys)) : [Symbol(string(nameof(sys))*"_x$i") for i in 1:lsys.nx]
125127
named_ss(
126128
lsys;
127-
x = symstr.(unknowns(ssys)),
129+
x = x_names,
128130
u = unames,
129131
y = symstr.(outputs),
130132
name = string(Base.nameof(sys)),
131133
extra,
132134
)
133135
end
134136

135-
function causal_simplification(sys, u2duinds::Vector{Pair{Int, Int}}; descriptor=true)
137+
"""
138+
causal_simplification(sys, u2duinds::Vector{Pair{Int, Int}}; descriptor=true, simple_infeigs = true)
139+
"""
140+
function causal_simplification(sys, u2duinds::Vector{Pair{Int, Int}}; descriptor=true, simple_infeigs = true)
136141
fm(x) = convert(Matrix{Float64}, x)
137142
nx = size(sys.A, 1)
138143
ny = size(sys.C, 1)
@@ -155,7 +160,7 @@ function causal_simplification(sys, u2duinds::Vector{Pair{Int, Int}}; descriptor
155160
Ce = [fm(sys.C) zeros(ny, ndu)]
156161
De = fm(D)
157162
dsys = dss(Ae, E, Be, Ce, De)
158-
return ss(RobustAndOptimalControl.DescriptorSystems.dss2ss(dsys)[1])
163+
return ss(RobustAndOptimalControl.DescriptorSystems.dss2ss(dsys; simple_infeigs)[1])
159164
else
160165
ss(sys.A, B, sys.C, D) + ss(sys.A, B̄, sys.C, D̄)*tf('s')
161166
end
@@ -199,6 +204,7 @@ function named_sensitivity_function(
199204
sys::ModelingToolkit.AbstractSystem,
200205
inputs, args...;
201206
descriptor = true,
207+
simple_infeigs = true,
202208
kwargs...,
203209
)
204210

@@ -224,13 +230,14 @@ function named_sensitivity_function(
224230
# This indicates that input derivatives are present
225231
duinds = findall(any(!iszero, eachcol(matrices.B[:, nu+1:end]))) .+ nu
226232
u2du = (1:nu) .=> duinds # This maps inputs to their derivatives
227-
lsys = causal_simplification(matrices, u2du; descriptor)
233+
lsys = causal_simplification(matrices, u2du; descriptor, simple_infeigs)
228234
else
229235
lsys = ss(matrices...)
230236
end
237+
x_names = simple_infeigs ? symstr.(unknowns(ssys)) : [Symbol(string(nameof(sys))*"_x$i") for i in 1:lsys.nx]
231238
named_ss(
232239
lsys;
233-
x = symstr.(unknowns(ssys)),
240+
x = x_names,
234241
u = unames,
235242
y = unames, #Symbol.("out_" .* string.(inputs)),
236243
name = string(Base.nameof(sys)),

0 commit comments

Comments
 (0)