Skip to content

Commit c37972e

Browse files
committed
revert src/linearization
1 parent 74f33ee commit c37972e

File tree

2 files changed

+29
-28
lines changed

2 files changed

+29
-28
lines changed

src/linearization.jl

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
lin_fun, simplified_sys = linearization_function(sys::AbstractSystem, inputs, outputs; initialize = true, initialization_solver_alg = TrustRegion(), kwargs...)
2+
lin_fun, simplified_sys = linearization_function(sys::AbstractSystem, inputs, outputs; simplify = false, initialize = true, initialization_solver_alg = TrustRegion(), kwargs...)
33
44
Return a function that linearizes the system `sys`. The function [`linearize`](@ref) provides a higher-level and easier to use interface.
55
@@ -22,15 +22,16 @@ The `simplified_sys` has undergone [`structural_simplify`](@ref) and had any occ
2222
- `sys`: An [`ODESystem`](@ref). This function will automatically apply simplification passes on `sys` and return the resulting `simplified_sys`.
2323
- `inputs`: A vector of variables that indicate the inputs of the linearized input-output model.
2424
- `outputs`: A vector of variables that indicate the outputs of the linearized input-output model.
25+
- `simplify`: Apply simplification in tearing.
2526
- `initialize`: If true, a check is performed to ensure that the operating point is consistent (satisfies algebraic equations). If the op is not consistent, initialization is performed.
2627
- `initialization_solver_alg`: A NonlinearSolve algorithm to use for solving for a feasible set of state and algebraic variables that satisfies the specified operating point.
2728
- `autodiff`: An `ADType` supported by DifferentiationInterface.jl to use for calculating the necessary jacobians. Defaults to using `AutoForwardDiff()`
2829
- `kwargs`: Are passed on to `find_solvables!`
2930
3031
See also [`linearize`](@ref) which provides a higher-level interface.
3132
"""
32-
function linearization_function(sys::AbstractSystem, inputs = inputs(sys),
33-
outputs = outputs(sys);
33+
function linearization_function(sys::AbstractSystem, inputs,
34+
outputs; simplify = false,
3435
initialize = true,
3536
initializealg = nothing,
3637
initialization_abstol = 1e-5,
@@ -45,9 +46,6 @@ function linearization_function(sys::AbstractSystem, inputs = inputs(sys),
4546
guesses = Dict(),
4647
warn_empty_op = true,
4748
kwargs...)
48-
if !iscomplete(sys)
49-
error("A simplified `ODESystem` is required. Call `structural_simplify` on the system with the inputs and outputs before creating the linearization function.")
50-
end
5149
op = Dict(op)
5250
if isempty(op) && warn_empty_op
5351
@warn "An empty operating point was passed to `linearization_function`. An operating point containing the variables that will be changed in `linearize` should be provided. Disable this warning by passing `warn_empty_op = false`."
@@ -60,7 +58,15 @@ function linearization_function(sys::AbstractSystem, inputs = inputs(sys),
6058
outputs = mapreduce(vcat, outputs; init = []) do var
6159
symbolic_type(var) == ArraySymbolic() ? collect(var) : [var]
6260
end
63-
diff_idxs, alge_idxs = eq_idxs(sys)
61+
ssys = structural_simplify(sys; inputs, outputs, simplify, kwargs...)
62+
diff_idxs, alge_idxs = eq_idxs(ssys)
63+
if zero_dummy_der
64+
dummyder = setdiff(unknowns(ssys), unknowns(sys))
65+
defs = Dict(x => 0.0 for x in dummyder)
66+
@set! ssys.defaults = merge(defs, defaults(ssys))
67+
op = merge(defs, op)
68+
end
69+
sys = ssys
6470

6571
if initializealg === nothing
6672
initializealg = initialize ? OverrideInit() : NoInit()
@@ -123,7 +129,7 @@ function linearization_function(sys::AbstractSystem, inputs = inputs(sys),
123129
diff_idxs, alge_idxs, inputs, length(unknowns(sys)),
124130
prob, h, u0 === nothing ? nothing : similar(u0), uf_jac, h_jac, pf_jac,
125131
hp_jac, initializealg, initialization_kwargs)
126-
return lin_fun
132+
return lin_fun, sys
127133
end
128134

129135
function eq_idxs(sys::AbstractSystem)
@@ -197,7 +203,7 @@ A callable struct which linearizes a system.
197203
$(TYPEDFIELDS)
198204
"""
199205
struct LinearizationFunction{
200-
DI <: AbstractVector{Int}, AI <: AbstractVector{Int}, II, P <: ODEProblem,
206+
DI <: AbstractVector{Int}, AI <: AbstractVector{Int}, I, P <: ODEProblem,
201207
H, C, J1, J2, J3, J4, IA <: SciMLBase.DAEInitializationAlgorithm, IK}
202208
"""
203209
The indexes of differential equations in the linearized system.
@@ -211,7 +217,7 @@ struct LinearizationFunction{
211217
The indexes of parameters in the linearized system which represent
212218
input variables.
213219
"""
214-
inputs::II
220+
inputs::I
215221
"""
216222
The number of unknowns in the linearized system.
217223
"""
@@ -396,8 +402,8 @@ Construct a `LinearizationProblem` for linearizing the system `sys` with the giv
396402
397403
All other keyword arguments are forwarded to `linearization_function`.
398404
"""
399-
function LinearizationProblem(sys::AbstractSystem, inputs = inputs(sys), outputs = outputs(sys); t = 0.0, kwargs...)
400-
linfun = linearization_function(sys, inputs, outputs; kwargs...)
405+
function LinearizationProblem(sys::AbstractSystem, inputs, outputs; t = 0.0, kwargs...)
406+
linfun, _ = linearization_function(sys, inputs, outputs; kwargs...)
401407
return LinearizationProblem(linfun, t)
402408
end
403409

@@ -467,7 +473,7 @@ function CommonSolve.solve(prob::LinearizationProblem; allow_input_derivatives =
467473
end
468474

469475
"""
470-
(; A, B, C, D), simplified_sys = linearize_symbolic(sys::AbstractSystem, inputs, outputs; allow_input_derivatives = false, kwargs...)
476+
(; A, B, C, D), simplified_sys = linearize_symbolic(sys::AbstractSystem, inputs, outputs; simplify = false, allow_input_derivatives = false, kwargs...)
471477
472478
Similar to [`linearize`](@ref), but returns symbolic matrices `A,B,C,D` rather than numeric. While `linearize` uses ForwardDiff to perform the linearization, this function uses `Symbolics.jacobian`.
473479
@@ -484,10 +490,11 @@ y &= h(x, z, u)
484490
```
485491
where `x` are differential unknown variables, `z` algebraic variables, `u` inputs and `y` outputs.
486492
"""
487-
function linearize_symbolic(sys::AbstractSystem, inputs = inputs(sys),
488-
outputs = outputs(sys); allow_input_derivatives = false,
493+
function linearize_symbolic(sys::AbstractSystem, inputs,
494+
outputs; simplify = false, allow_input_derivatives = false,
489495
eval_expression = false, eval_module = @__MODULE__,
490496
kwargs...)
497+
sys = structural_simplify(sys; inputs, outputs, simplify, kwargs...)
491498
diff_idxs, alge_idxs = eq_idxs(sys)
492499
sts = unknowns(sys)
493500
t = get_iv(sys)
@@ -546,7 +553,7 @@ function linearize_symbolic(sys::AbstractSystem, inputs = inputs(sys),
546553
end
547554
end
548555

549-
(; A, B, C, D, f_x, f_z, g_x, g_z, f_u, g_u, h_x, h_z, h_u)
556+
(; A, B, C, D, f_x, f_z, g_x, g_z, f_u, g_u, h_x, h_z, h_u), sys
550557
end
551558

552559
function markio!(state, orig_inputs, inputs, outputs; check = true)
@@ -713,17 +720,17 @@ function linearize(sys, lin_fun::LinearizationFunction; t = 0.0,
713720
return solve(prob; allow_input_derivatives)
714721
end
715722

716-
function linearize(sys, inputs = inputs(sys), outputs = outputs(sys); op = Dict(), t = 0.0,
723+
function linearize(sys, inputs, outputs; op = Dict(), t = 0.0,
717724
allow_input_derivatives = false,
718725
zero_dummy_der = false,
719726
kwargs...)
720-
lin_fun = linearization_function(sys,
727+
lin_fun, ssys = linearization_function(sys,
721728
inputs,
722729
outputs;
723730
zero_dummy_der,
724731
op,
725732
kwargs...)
726-
linearize(sys, lin_fun; op, t, allow_input_derivatives)
733+
linearize(ssys, lin_fun; op, t, allow_input_derivatives), ssys
727734
end
728735

729736
"""
@@ -761,7 +768,7 @@ Permute the state representation of `sys` obtained from [`linearize`](@ref) so t
761768
Example:
762769
763770
```
764-
lsys = linearize(pid, [reference.u, measurement.u], [ctr_output.u])
771+
lsys, ssys = linearize(pid, [reference.u, measurement.u], [ctr_output.u])
765772
desired_order = [int.x, der.x] # Unknowns that are present in unknowns(ssys)
766773
lsys = ModelingToolkit.reorder_unknowns(lsys, unknowns(ssys), desired_order)
767774
```

src/systems/analysis_points.jl

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,8 @@ function open_loop(sys, ap::Union{Symbol, AnalysisPoint}; system_modifier = iden
928928
return system_modifier(sys), vars
929929
end
930930

931-
function ap_preprocessing(sys::AbstractSystem, inputs::Union{Symbol, Vector{Symbol}, AnalysisPoint, Vector{AnalysisPoint}},
931+
function linearization_function(sys::AbstractSystem,
932+
inputs::Union{Symbol, Vector{Symbol}, AnalysisPoint, Vector{AnalysisPoint}},
932933
outputs; loop_openings = [], system_modifier = identity, kwargs...)
933934
loop_openings = Set(map(nameof, canonicalize_ap(sys, loop_openings)))
934935
inputs = canonicalize_ap(sys, inputs)
@@ -957,13 +958,6 @@ function ap_preprocessing(sys::AbstractSystem, inputs::Union{Symbol, Vector{Symb
957958
end
958959

959960
sys = handle_loop_openings(sys, map(AnalysisPoint, collect(loop_openings)))
960-
sys, input_vars, output_vars
961-
end
962-
963-
function linearization_function(sys::AbstractSystem,
964-
inputs::Union{Symbol, Vector{Symbol}, AnalysisPoint, Vector{AnalysisPoint}},
965-
outputs; loop_openings = [], system_modifier = identity, kwargs...)
966-
sys, inputs, outputs = ap_preprocessing(sys; inputs, outputs, loop_openings, system_modifier, kwargs...)
967961
return linearization_function(system_modifier(sys), input_vars, output_vars; kwargs...)
968962
end
969963

0 commit comments

Comments
 (0)