Skip to content

Commit e572166

Browse files
feat: use observed equations for guesses of observed variables
1 parent 74412cd commit e572166

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

src/systems/nonlinear/initializesystem.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,16 @@ function generate_initializesystem(sys::ODESystem;
160160
[p for p in parameters(sys) if !haskey(paramsubs, p)]
161161
)
162162

163-
eqs_ics = Symbolics.substitute.([eqs_ics; observed(sys)], (paramsubs,))
163+
# 7) use observed equations for guesses of observed variables if not provided
164+
obseqs = observed(sys)
165+
for eq in obseqs
166+
haskey(defs, eq.lhs) && continue
167+
any(x -> isequal(default_toterm(x), eq.lhs), keys(defs)) && continue
168+
169+
defs[eq.lhs] = eq.rhs
170+
end
171+
172+
eqs_ics = Symbolics.substitute.([eqs_ics; obseqs], (paramsubs,))
164173
vars = [vars; collect(values(paramsubs))]
165174
for k in keys(defs)
166175
defs[k] = substitute(defs[k], paramsubs)

test/initializationsystem.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,3 +815,11 @@ end
815815
prob2 = @test_nowarn remake(prob; u0 = [y => 0.5])
816816
@test is_variable(prob.f.initializeprob, p)
817817
end
818+
819+
@testset "Use observed equations for guesses of observed variables" begin
820+
@variables x(t) y(t) [state_priority = 100]
821+
@mtkbuild sys = ODESystem(
822+
[D(x) ~ x + t, y ~ 2x + 1], t; initialization_eqs = [x^3 + y^3 ~ 1])
823+
isys = ModelingToolkit.generate_initializesystem(sys)
824+
@test isequal(defaults(isys)[y], 2x + 1)
825+
end

0 commit comments

Comments
 (0)