Skip to content

Commit 4adfecf

Browse files
committed
factor out causal simplification
1 parent 60ae91e commit 4adfecf

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

src/ode_system.jl

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -199,29 +199,15 @@ function RobustAndOptimalControl.named_ss(
199199
out
200200
end
201201
end
202-
ny = length(outputs)
203202
matrices, ssys = ModelingToolkit.linearize(sys, inputs, outputs; kwargs...)
204203
symstr(x) = Symbol(x isa AnalysisPoint ? x.name : string(x))
205204
unames = symstr.(inputs)
206205
fm(x) = convert(Matrix{Float64}, x)
207206
if nu > 0 && size(matrices.B, 2) == 2nu
208-
nx = size(matrices.A, 1)
209-
# This indicates that input derivatives are present
210-
duinds = findall(any(!iszero, eachcol(matrices.B[:, nu+1:end])))
211-
= matrices.B[:, duinds .+ nu]
212-
ndu = length(duinds)
213-
B = matrices.B[:, 1:nu]
214-
Iu = duinds .== (1:nu)'
215-
E = [I(nx) -B̄; zeros(ndu, nx+ndu)]
216-
217-
Ae = cat(matrices.A, -I(ndu), dims=(1,2))
218-
Be = [B; Iu]
219-
Ce = [fm(matrices.C) zeros(ny, ndu)]
220-
De = fm(matrices.D[:, 1:nu])
221-
dsys = dss(Ae, E, Be, Ce, De)
222-
lsys = ss(RobustAndOptimalControl.DescriptorSystems.dss2ss(dsys)[1])
223-
# unames = [unames; Symbol.("der_" .* string.(unames))]
224-
# sys = ss(matrices...)
207+
# This indicates that input derivatives are present
208+
duinds = findall(any(!iszero, eachcol(sys.B[:, nu+1:end]))) .+ nu
209+
u2du = (1:nu) .=> duinds # This maps inputs to their derivatives
210+
lsys = causal_simplification(matrices, u2du)
225211
else
226212
lsys = ss(matrices...)
227213
end
@@ -234,6 +220,26 @@ function RobustAndOptimalControl.named_ss(
234220
)
235221
end
236222

223+
function causal_simplification(sys, u2duinds::Vector{Pair{Int, Int}})
224+
nx = size(sys.A, 1)
225+
ny = size(sys.C, 1)
226+
ndu = length(u2duinds)
227+
nu = size(sys.B, 2) - ndu
228+
u_with_du_inds = first.(u2duinds)
229+
duinds = last.(u2duinds)
230+
= sys.B[:, duinds]
231+
B = sys.B[:, 1:nu]
232+
Iu = u_with_du_inds .== (1:nu)'
233+
E = [I(nx) -B̄; zeros(ndu, nx+ndu)]
234+
235+
Ae = cat(sys.A, -I(ndu), dims=(1,2))
236+
Be = [B; Iu]
237+
Ce = [fm(sys.C) zeros(ny, ndu)]
238+
De = fm(sys.D[:, 1:nu])
239+
dsys = dss(Ae, E, Be, Ce, De)
240+
ss(RobustAndOptimalControl.DescriptorSystems.dss2ss(dsys)[1])
241+
end
242+
237243
for f in [:sensitivity, :comp_sensitivity, :looptransfer]
238244
fnn = Symbol("get_named_$f")
239245
fn = Symbol("get_$f")

0 commit comments

Comments
 (0)