diff --git a/src/linearization.jl b/src/linearization.jl index 411620e8f3..f58f3b4253 100644 --- a/src/linearization.jl +++ b/src/linearization.jl @@ -42,8 +42,12 @@ function linearization_function(sys::AbstractSystem, inputs, eval_expression = false, eval_module = @__MODULE__, warn_initialize_determined = true, guesses = Dict(), + warn_empty_op = true, kwargs...) op = Dict(op) + if isempty(op) && warn_empty_op + @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`." + end inputs isa AbstractVector || (inputs = [inputs]) outputs isa AbstractVector || (outputs = [outputs]) inputs = mapreduce(vcat, inputs; init = []) do var @@ -590,9 +594,12 @@ function linearize(sys, lin_fun::LinearizationFunction; t = 0.0, p = DiffEqBase.NullParameters()) prob = LinearizationProblem(lin_fun, t) op = anydict(op) - evaluate_varmap!(op, unknowns(sys)) + evaluate_varmap!(op, keys(op)) for (k, v) in op v === nothing && continue + if symbolic_type(v) != NotSymbolic() || is_array_of_symbolics(v) + v = getu(prob, v)(prob) + end if is_parameter(prob, Initial(k)) setu(prob, Initial(k))(prob, v) else diff --git a/test/downstream/linearize.jl b/test/downstream/linearize.jl index 898040fb4f..0336709173 100644 --- a/test/downstream/linearize.jl +++ b/test/downstream/linearize.jl @@ -262,7 +262,7 @@ closed_loop = ODESystem(connections, t, systems = [model, pid, filt, sensor, r, filt.xd => 0.0 ]) -@test_nowarn linearize(closed_loop, :r, :y) +@test_nowarn linearize(closed_loop, :r, :y; warn_empty_op = false) # https://discourse.julialang.org/t/mtk-change-in-linearize/115760/3 @mtkmodel Tank_noi begin @@ -329,3 +329,19 @@ end sys, [x], []; op = Dict(x => 1.0), guesses = Dict(y => 1.0), allow_input_derivatives = true) end + +@testset "Symbolic values for parameters in `linearize`" begin + @named tank_noi = Tank_noi() + @unpack md_i, h, m, ρ, A, K = tank_noi + m_ss = 2.4000000003229878 + @test_nowarn linearize( + tank_noi, [md_i], [h]; op = Dict(m => m_ss, md_i => 2, ρ => A / K, A => 5)) +end + +@testset "Warn on empty operating point" begin + @named tank_noi = Tank_noi() + @unpack md_i, h, m = tank_noi + m_ss = 2.4000000003229878 + @test_warn ["empty operating point", "warn_empty_op"] linearize( + tank_noi, [md_i], [h]; p = [md_i => 1.0]) +end