Skip to content

Commit 00f7d76

Browse files
Merge pull request #3432 from AayushSabharwal/as/linearize-dependent-op
fix: fix symbolic maps given to `linearize`, warn in `linearization_function`
2 parents 303af7b + c354feb commit 00f7d76

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

src/linearization.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,12 @@ function linearization_function(sys::AbstractSystem, inputs,
4242
eval_expression = false, eval_module = @__MODULE__,
4343
warn_initialize_determined = true,
4444
guesses = Dict(),
45+
warn_empty_op = true,
4546
kwargs...)
4647
op = Dict(op)
48+
if isempty(op) && warn_empty_op
49+
@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`."
50+
end
4751
inputs isa AbstractVector || (inputs = [inputs])
4852
outputs isa AbstractVector || (outputs = [outputs])
4953
inputs = mapreduce(vcat, inputs; init = []) do var
@@ -590,9 +594,12 @@ function linearize(sys, lin_fun::LinearizationFunction; t = 0.0,
590594
p = DiffEqBase.NullParameters())
591595
prob = LinearizationProblem(lin_fun, t)
592596
op = anydict(op)
593-
evaluate_varmap!(op, unknowns(sys))
597+
evaluate_varmap!(op, keys(op))
594598
for (k, v) in op
595599
v === nothing && continue
600+
if symbolic_type(v) != NotSymbolic() || is_array_of_symbolics(v)
601+
v = getu(prob, v)(prob)
602+
end
596603
if is_parameter(prob, Initial(k))
597604
setu(prob, Initial(k))(prob, v)
598605
else

test/downstream/linearize.jl

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ closed_loop = ODESystem(connections, t, systems = [model, pid, filt, sensor, r,
262262
filt.xd => 0.0
263263
])
264264

265-
@test_nowarn linearize(closed_loop, :r, :y)
265+
@test_nowarn linearize(closed_loop, :r, :y; warn_empty_op = false)
266266

267267
# https://discourse.julialang.org/t/mtk-change-in-linearize/115760/3
268268
@mtkmodel Tank_noi begin
@@ -329,3 +329,19 @@ end
329329
sys, [x], []; op = Dict(x => 1.0), guesses = Dict(y => 1.0),
330330
allow_input_derivatives = true)
331331
end
332+
333+
@testset "Symbolic values for parameters in `linearize`" begin
334+
@named tank_noi = Tank_noi()
335+
@unpack md_i, h, m, ρ, A, K = tank_noi
336+
m_ss = 2.4000000003229878
337+
@test_nowarn linearize(
338+
tank_noi, [md_i], [h]; op = Dict(m => m_ss, md_i => 2, ρ => A / K, A => 5))
339+
end
340+
341+
@testset "Warn on empty operating point" begin
342+
@named tank_noi = Tank_noi()
343+
@unpack md_i, h, m = tank_noi
344+
m_ss = 2.4000000003229878
345+
@test_warn ["empty operating point", "warn_empty_op"] linearize(
346+
tank_noi, [md_i], [h]; p = [md_i => 1.0])
347+
end

0 commit comments

Comments
 (0)