@@ -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 ) == 2 nu
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- B̄ = 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 )
235221end
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+ B̄ = 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+
237243for f in [:sensitivity , :comp_sensitivity , :looptransfer ]
238244 fnn = Symbol (" get_named_$f " )
239245 fn = Symbol (" get_$f " )
0 commit comments