Skip to content

Commit be151e3

Browse files
Merge pull request #3032 from AayushSabharwal/initial_ode_2
Run initialization on ODEs with superset initial conditions
2 parents 38392d1 + a2becdf commit be151e3

File tree

6 files changed

+46
-13
lines changed

6 files changed

+46
-13
lines changed

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,9 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
797797
varmap = canonicalize_varmap(varmap)
798798
varlist = collect(map(unwrap, dvs))
799799
missingvars = setdiff(varlist, collect(keys(varmap)))
800+
setobserved = filter(keys(varmap)) do var
801+
has_observed_with_lhs(sys, var) || has_observed_with_lhs(sys, default_toterm(var))
802+
end
800803

801804
if eltype(parammap) <: Pair
802805
parammap = Dict(unwrap(k) => v for (k, v) in todict(parammap))
@@ -810,7 +813,7 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
810813

811814
# ModelingToolkit.get_tearing_state(sys) !== nothing => Requires structural_simplify first
812815
if sys isa ODESystem && build_initializeprob &&
813-
(((implicit_dae || !isempty(missingvars)) &&
816+
(((implicit_dae || !isempty(missingvars) || !isempty(setobserved)) &&
814817
ModelingToolkit.get_tearing_state(sys) !== nothing) ||
815818
!isempty(initialization_equations(sys))) && t !== nothing
816819
if eltype(u0map) <: Number

test/components.jl

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,7 @@ sys = structural_simplify(rc_model)
4747
@test length(equations(sys)) == 1
4848
check_contract(sys)
4949
@test !isempty(ModelingToolkit.defaults(sys))
50-
u0 = [capacitor.v => 0.0
51-
capacitor.p.i => 0.0
52-
resistor.v => 0.0]
53-
prob = ODEProblem(sys, u0, (0, 10.0))
54-
sol = solve(prob, Rodas4())
55-
check_rc_sol(sol)
50+
u0 = [capacitor.v => 0.0]
5651
prob = ODEProblem(sys, u0, (0, 10.0))
5752
sol = solve(prob, Rodas4())
5853
check_rc_sol(sol)
@@ -133,9 +128,7 @@ eqs = [connect(source.p, rc_comp.p)
133128
expand_connections(sys_inner_outer, debug = true)
134129
sys_inner_outer = structural_simplify(sys_inner_outer)
135130
@test !isempty(ModelingToolkit.defaults(sys_inner_outer))
136-
u0 = [rc_comp.capacitor.v => 0.0
137-
rc_comp.capacitor.p.i => 0.0
138-
rc_comp.resistor.v => 0.0]
131+
u0 = [rc_comp.capacitor.v => 0.0]
139132
prob = ODEProblem(sys_inner_outer, u0, (0, 10.0), sparse = true)
140133
sol_inner_outer = solve(prob, Rodas4())
141134
@test sol[capacitor.v] sol_inner_outer[rc_comp.capacitor.v]

test/downstream/inversemodel.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ cm = complete(model)
135135
op = Dict(D(cm.inverse_tank.xT) => 1,
136136
cm.tank.xc => 0.65)
137137
tspan = (0.0, 1000.0)
138-
prob = ODEProblem(ssys, op, tspan)
138+
# https://github.com/SciML/ModelingToolkit.jl/issues/2786
139+
prob = ODEProblem(ssys, op, tspan; build_initializeprob = false)
139140
sol = solve(prob, Rodas5P())
140141

141142
@test SciMLBase.successful_retcode(sol)

test/initial_values.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ obs = X2 ~ Γ[1] - X1
5959
u0 = [X1 => 1.0, X2 => 2.0]
6060
tspan = (0.0, 1.0)
6161
ps = [k1 => 1.0, k2 => 5.0]
62-
@test_nowarn oprob = ODEProblem(osys_m, u0, tspan, ps)
62+
# Broken since we need both X1 and X2 to initialize Γ but this makes the initialization system
63+
# overdetermined because parameter initialization isn't in yet
64+
@test_warn "overdetermined" oprob=ODEProblem(osys_m, u0, tspan, ps)
6365

6466
# Make sure it doesn't error on array variables with unspecified size
6567
@parameters p::Vector{Real} q[1:3]

test/initializationsystem.jl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,3 +522,34 @@ end
522522
structural_simplify
523523
@test_nowarn ODEProblem(sys, [D(x) => 1.0], (0.0, 1.0), [])
524524
end
525+
526+
# https://github.com/SciML/ModelingToolkit.jl/issues/2619
527+
@parameters k1 k2 ω
528+
@variables X(t) Y(t)
529+
eqs_1st_order = [D(Y) + Y - ω ~ 0,
530+
X + k1 ~ Y + k2]
531+
eqs_2nd_order = [D(D(Y)) + 2ω * D(Y) +^2) * Y ~ 0,
532+
X + k1 ~ Y + k2]
533+
@mtkbuild sys_1st_order = ODESystem(eqs_1st_order, t)
534+
@mtkbuild sys_2nd_order = ODESystem(eqs_2nd_order, t)
535+
536+
u0_1st_order_1 = [X => 1.0, Y => 2.0]
537+
u0_1st_order_2 = [Y => 2.0]
538+
u0_2nd_order_1 = [X => 1.0, Y => 2.0, D(Y) => 0.5]
539+
u0_2nd_order_2 = [Y => 2.0, D(Y) => 0.5]
540+
tspan = (0.0, 10.0)
541+
ps ==> 0.5, k1 => 2.0, k2 => 3.0]
542+
543+
oprob_1st_order_1 = ODEProblem(sys_1st_order, u0_1st_order_1, tspan, ps)
544+
oprob_1st_order_2 = ODEProblem(sys_1st_order, u0_1st_order_2, tspan, ps)
545+
oprob_2nd_order_1 = ODEProblem(sys_2nd_order, u0_2nd_order_1, tspan, ps) # gives sys_2nd_order
546+
oprob_2nd_order_2 = ODEProblem(sys_2nd_order, u0_2nd_order_2, tspan, ps)
547+
548+
@test solve(oprob_1st_order_1, Rosenbrock23()).retcode ==
549+
SciMLBase.ReturnCode.InitialFailure
550+
@test solve(oprob_1st_order_2, Rosenbrock23())[Y][1] == 2.0
551+
@test solve(oprob_2nd_order_1, Rosenbrock23()).retcode ==
552+
SciMLBase.ReturnCode.InitialFailure
553+
sol = solve(oprob_2nd_order_2, Rosenbrock23()) # retcode: Success
554+
@test sol[Y][1] == 2.0
555+
@test sol[D(Y)][1] == 0.5

test/split_parameters.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,11 @@ eqs = [y ~ src.output.u
8282
@named sys = ODESystem(eqs, t, vars, []; systems = [int, src])
8383
s = complete(sys)
8484
sys = structural_simplify(sys)
85-
prob = ODEProblem(
85+
@test_broken ODEProblem(
8686
sys, [], (0.0, t_end), [s.src.interpolator => Interpolator(x, dt)]; tofloat = false)
87+
prob = ODEProblem(
88+
sys, [], (0.0, t_end), [s.src.interpolator => Interpolator(x, dt)];
89+
tofloat = false, build_initializeprob = false)
8790
sol = solve(prob, ImplicitEuler());
8891
@test sol.retcode == ReturnCode.Success
8992
@test sol[y][end] == x[end]

0 commit comments

Comments
 (0)