Skip to content

Commit 36a9909

Browse files
feat: allow parameters in ODESystem to be unknowns in initialization system
1 parent 6d84b8f commit 36a9909

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

src/systems/nonlinear/initializesystem.jl

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Generate `NonlinearSystem` which initializes an ODE problem from specified initi
55
"""
66
function generate_initializesystem(sys::ODESystem;
77
u0map = Dict(),
8+
pmap = Dict(),
89
name = nameof(sys),
910
guesses = Dict(), check_defguess = false,
1011
default_dd_value = 0.0,
@@ -69,6 +70,32 @@ function generate_initializesystem(sys::ODESystem;
6970
defs = merge(defaults(sys), filtered_u0)
7071
guesses = merge(get_guesses(sys), todict(guesses), dd_guess)
7172

73+
all_params = parameters(sys)
74+
pars = [parameters(sys); get_iv(sys)]
75+
paramsubs = Dict()
76+
for p in all_params
77+
haskey(pmap, p) && continue
78+
paramsubs[p] = tovar(p)
79+
push!(full_states, tovar(p))
80+
deleteat!(pars, findfirst(isequal(p), pars))
81+
if haskey(defs, p)
82+
def = defs[p]
83+
if def isa Equation
84+
p keys(guesses) && check_defguess &&
85+
error("Invalid setup: parameter $(p) has an initial condition equation with no guess.")
86+
push!(eqs_ics, def)
87+
push!(u0, p => guesses[p])
88+
else
89+
push!(eqs_ics, p ~ def)
90+
push!(u0, p => def)
91+
end
92+
elseif haskey(guesses, p)
93+
push!(u0, p => guesses[p])
94+
elseif check_defguess
95+
error("Invalid setup: parameter $(p) has no default value or initial guess")
96+
end
97+
end
98+
7299
if !algebraic_only
73100
for st in full_states
74101
if st keys(defs)
@@ -91,12 +118,12 @@ function generate_initializesystem(sys::ODESystem;
91118
end
92119
end
93120

94-
pars = [parameters(sys); get_iv(sys)]
95121
nleqs = if algebraic_only
96122
[eqs_ics; observed(sys)]
97123
else
98124
[eqs_ics; get_initialization_eqs(sys); observed(sys)]
99125
end
126+
nleqs = fast_substitute(nleqs, paramsubs)
100127

101128
sys_nl = NonlinearSystem(nleqs,
102129
full_states,

0 commit comments

Comments
 (0)