Skip to content

Commit 0d72940

Browse files
Merge pull request #3137 from AayushSabharwal/as/observed-guesses
feat: use observed equations for guesses of observed variables
2 parents 946322a + cd2518e commit 0d72940

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

src/systems/nonlinear/initializesystem.jl

+10-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,16 @@ function generate_initializesystem(sys::ODESystem;
165165
[p for p in parameters(sys) if !haskey(paramsubs, p)]
166166
)
167167

168-
eqs_ics = Symbolics.substitute.([eqs_ics; observed(sys)], (paramsubs,))
168+
# 7) use observed equations for guesses of observed variables if not provided
169+
obseqs = observed(sys)
170+
for eq in obseqs
171+
haskey(defs, eq.lhs) && continue
172+
any(x -> isequal(default_toterm(x), eq.lhs), keys(defs)) && continue
173+
174+
defs[eq.lhs] = eq.rhs
175+
end
176+
177+
eqs_ics = Symbolics.substitute.([eqs_ics; obseqs], (paramsubs,))
169178
vars = [vars; collect(values(paramsubs))]
170179
for k in keys(defs)
171180
defs[k] = substitute(defs[k], paramsubs)

test/initializationsystem.jl

+8
Original file line numberDiff line numberDiff line change
@@ -836,3 +836,11 @@ end
836836
integ = init(prob, Rosenbrock23())
837837
@test integ[y] -0.5
838838
end
839+
840+
@testset "Use observed equations for guesses of observed variables" begin
841+
@variables x(t) y(t) [state_priority = 100]
842+
@mtkbuild sys = ODESystem(
843+
[D(x) ~ x + t, y ~ 2x + 1], t; initialization_eqs = [x^3 + y^3 ~ 1])
844+
isys = ModelingToolkit.generate_initializesystem(sys)
845+
@test isequal(defaults(isys)[y], 2x + 1)
846+
end

0 commit comments

Comments
 (0)