Skip to content

Commit 3e81ea4

Browse files
fix: check for non-parameter values in operating point
1 parent 4780f41 commit 3e81ea4

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

src/systems/abstractsystem.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2000,7 +2000,9 @@ function linearization_function(sys::AbstractSystem, inputs,
20002000
p = todict(p)
20012001
newps = deepcopy(sys_ps)
20022002
for (k, v) in p
2003-
setp(sys, k)(newps, v)
2003+
if is_parameter(sys, k)
2004+
setp(sys, k)(newps, v)
2005+
end
20042006
end
20052007
p = newps
20062008
end

test/downstream/linearize.jl

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,3 +258,50 @@ closed_loop = ODESystem(connections, t, systems = [model, pid, filt, sensor, r,
258258
])
259259

260260
@test_nowarn linearize(closed_loop, :r, :y)
261+
262+
# https://discourse.julialang.org/t/mtk-change-in-linearize/115760/3
263+
@mtkmodel Tank_noi begin
264+
# Model parameters
265+
@parameters begin
266+
ρ = 1, [description = "Liquid density"]
267+
A = 5, [description = "Cross sectional tank area"]
268+
K = 5, [description = "Effluent valve constant"]
269+
h_ς = 3, [description = "Scaling level in valve model"]
270+
end
271+
# Model variables, with initial values needed
272+
@variables begin
273+
m(t) = 1.5 * ρ * A, [description = "Liquid mass"]
274+
md_i(t), [description = "Influent mass flow rate"]
275+
md_e(t), [description = "Effluent mass flow rate"]
276+
V(t), [description = "Liquid volume"]
277+
h(t), [description = "level"]
278+
end
279+
# Providing model equations
280+
@equations begin
281+
D(m) ~ md_i - md_e
282+
m ~ ρ * V
283+
V ~ A * h
284+
md_e ~ K * sqrt(h / h_ς)
285+
end
286+
end
287+
288+
@named tank_noi = Tank_noi()
289+
@unpack md_i, h, m = tank_noi
290+
m_ss = 2.4000000003229878
291+
@test_nowarn linearize(tank_noi, [md_i], [h]; op = Dict(m => m_ss, md_i => 2))
292+
293+
# Test initialization
294+
@variables x(t) y(t) u(t)=1.0
295+
@parameters p = 1.0
296+
eqs = [D(x) ~ p * u, x ~ y]
297+
@named sys = ODESystem(eqs, t)
298+
299+
matrices1, _ = linearize(sys, [u], []; op = Dict(x => 2.0))
300+
matrices2, _ = linearize(sys, [u], []; op = Dict(y => 2.0))
301+
@test matrices1 == matrices2
302+
303+
# Ensure parameter values passed as `Dict` are respected
304+
linfun, _ = linearization_function(sys, [u], []; op = Dict(x => 2.0))
305+
matrices = linfun([1.0], Dict(p => 3.0), 1.0)
306+
# this would be 1 if the parameter value isn't respected
307+
@test matrices.f_u[] == 3.0

0 commit comments

Comments
 (0)