Skip to content

Commit b5ff7da

Browse files
Merge pull request #3525 from AayushSabharwal/as/fix-warn
fix: don't substitute inside `Initial` in `build_operating_point!`
2 parents 60e202e + 1bc3e04 commit b5ff7da

File tree

6 files changed

+53
-23
lines changed

6 files changed

+53
-23
lines changed

src/systems/abstractsystem.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,12 @@ function add_initialization_parameters(sys::AbstractSystem)
717717
push!(all_initialvars, x)
718718
end
719719
end
720+
721+
# add derivatives of all variables for steady-state initial conditions
722+
if is_time_dependent(sys) && !(sys isa AbstractDiscreteSystem)
723+
D = Differential(get_iv(sys))
724+
union!(all_initialvars, [D(v) for v in all_initialvars if iscall(v)])
725+
end
720726
for eq in parameter_dependencies(sys)
721727
is_variable_floatingpoint(eq.lhs) || continue
722728
push!(all_initialvars, eq.lhs)
@@ -1924,7 +1930,9 @@ function toexpr(sys::AbstractSystem)
19241930
end
19251931

19261932
eqs_name = push_eqs!(stmt, full_equations(sys), var2name)
1927-
defs_name = push_defaults!(stmt, defaults(sys), var2name)
1933+
filtered_defs = filter(
1934+
kvp -> !(iscall(kvp[1]) && operation(kvp[1]) isa Initial), defaults(sys))
1935+
defs_name = push_defaults!(stmt, filtered_defs, var2name)
19281936
obs_name = push_eqs!(stmt, obs, var2name)
19291937

19301938
if sys isa ODESystem

src/systems/problem_utils.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -623,12 +623,12 @@ function build_operating_point!(sys::AbstractSystem,
623623
end
624624

625625
for k in keys(u0map)
626-
v = fixpoint_sub(u0map[k], neithermap)
626+
v = fixpoint_sub(u0map[k], neithermap; operator = Symbolics.Operator)
627627
isequal(k, v) && continue
628628
u0map[k] = v
629629
end
630630
for k in keys(pmap)
631-
v = fixpoint_sub(pmap[k], neithermap)
631+
v = fixpoint_sub(pmap[k], neithermap; operator = Symbolics.Operator)
632632
isequal(k, v) && continue
633633
pmap[k] = v
634634
end

test/initial_values.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,3 +236,19 @@ end
236236
prob2 = remake(prob; p = p_new)
237237
@test prob2.ps[interp] == spline2
238238
end
239+
240+
@testset "Issue#3523: don't substitute inside initial in `build_operating_point!`" begin
241+
@variables (X(t))[1:2]
242+
@parameters p[1:2]
243+
eqs = [
244+
0 ~ p[1] - X[1],
245+
0 ~ p[2] - X[2]
246+
]
247+
@named nlsys = NonlinearSystem(eqs)
248+
nlsys = complete(nlsys)
249+
250+
# Creates the `NonlinearProblem`.
251+
u0 = [X => [1.0, 2.0]]
252+
ps = [p => [4.0, 5.0]]
253+
@test_nowarn NonlinearProblem(nlsys, u0, ps)
254+
end

test/initializationsystem.jl

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -406,30 +406,35 @@ sol = solve(prob, Tsit5())
406406
@test sol.u[1] == [1.0]
407407

408408
# Steady state initialization
409+
@testset "Steady state initialization" begin
410+
@parameters σ ρ β
411+
@variables x(t) y(t) z(t)
409412

410-
@parameters σ ρ β
411-
@variables x(t) y(t) z(t)
413+
eqs = [D(D(x)) ~ σ * (y - x),
414+
D(y) ~ x *- z) - y,
415+
D(z) ~ x * y - β * z]
412416

413-
eqs = [D(D(x)) ~ σ * (y - x),
414-
D(y) ~ x *- z) - y,
415-
D(z) ~ x * y - β * z]
417+
@named sys = ODESystem(eqs, t)
418+
sys = structural_simplify(sys)
416419

417-
@named sys = ODESystem(eqs, t)
418-
sys = structural_simplify(sys)
420+
u0 = [D(x) => 2.0,
421+
x => 1.0,
422+
D(y) => 0.0,
423+
z => 0.0]
419424

420-
u0 = [D(x) => 2.0,
421-
x => 1.0,
422-
D(y) => 0.0,
423-
z => 0.0]
425+
p ==> 28.0,
426+
ρ => 10.0,
427+
β => 8 / 3]
424428

425-
p ==> 28.0,
426-
ρ => 10.0,
427-
β => 8 / 3]
429+
tspan = (0.0, 0.2)
430+
prob_mtk = ODEProblem(sys, u0, tspan, p)
431+
sol = solve(prob_mtk, Tsit5())
432+
@test sol[x *- z) - y][1] == 0.0
428433

429-
tspan = (0.0, 0.2)
430-
prob_mtk = ODEProblem(sys, u0, tspan, p)
431-
sol = solve(prob_mtk, Tsit5())
432-
@test sol[x *- z) - y][1] == 0.0
434+
prob_mtk.ps[Initial(D(y))] = 1.0
435+
sol = solve(prob_mtk, Tsit5())
436+
@test sol[x *- z) - y][1] == 1.0
437+
end
433438

434439
@variables x(t) y(t) z(t)
435440
@parameters α=1.5 β=1.0 γ=3.0 δ=1.0

test/modelingtoolkitize.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ sys = modelingtoolkitize(prob)
460460
p = [10.0, 28.0, 2.66]
461461
sprob = SDEProblem(sdef!, sdeg!, u0, tspan, p)
462462
sys = complete(modelingtoolkitize(sprob))
463-
@test length(ModelingToolkit.defaults(sys)) == 2length(u0) + length(p)
463+
@test length(ModelingToolkit.defaults(sys)) == 3length(u0) + length(p)
464464
sprob2 = SDEProblem(sys, [], tspan)
465465

466466
truevals = similar(u0)

test/symbolic_indexing_interface.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ using SciMLStructures: Tunable
2424
(odesys,), [x, y, t, ParameterIndex(Tunable(), 1), :x, :y]) ==
2525
[nothing, nothing, nothing, ParameterIndex(Tunable(), 1), nothing, nothing]
2626
@test isequal(
27-
Set(parameter_symbols(odesys)), Set([a, b, Initial(x), Initial(y), Initial(xy)]))
27+
Set(parameter_symbols(odesys)), Set([a, b, Initial(x), Initial(y), Initial(xy),
28+
Initial(D(x)), Initial(D(y)), Initial(D(xy))]))
2829
@test all(is_independent_variable.((odesys,), [t, :t]))
2930
@test all(.!is_independent_variable.((odesys,), [x, y, a, :x, :y, :a]))
3031
@test isequal(independent_variable_symbols(odesys), [t])

0 commit comments

Comments
 (0)