@@ -146,19 +146,34 @@ function generate_initializesystem(sys::ODESystem;
146146 end
147147 end
148148 end
149+
150+ # parameter dependencies become equations, their LHS become unknowns
151+ for eq in parameter_dependencies (sys)
152+ varp = tovar (eq. lhs)
153+ paramsubs[eq. lhs] = varp
154+ push! (eqs_ics, eq)
155+ guessval = get (guesses, eq. lhs, eq. rhs)
156+ push! (u0, varp => guessval)
157+ end
158+
159+ # handle values provided for dependent parameters
160+ for (k, v) in merge (defaults (sys), pmap)
161+ if has_parameter_dependency_with_lhs (sys, k)
162+ push! (eqs_ics, paramsubs[k] ~ v)
163+ end
164+ end
149165 pars = vcat (
150166 [get_iv (sys)],
151167 [p for p in parameters (sys) if ! haskey (paramsubs, p)]
152168 )
153169 nleqs = [eqs_ics; observed (sys)]
154170 nleqs = Symbolics. substitute .(nleqs, (paramsubs,))
155171 unks = [full_states; collect (values (paramsubs))]
156-
172+ u0 = Dict (k => substitute (v, paramsubs) for (k, v) in u0)
157173 sys_nl = NonlinearSystem (nleqs,
158174 unks,
159175 pars;
160176 defaults = merge (ModelingToolkit. defaults (sys), todict (u0), dd_guess, pmap),
161- parameter_dependencies = parameter_dependencies (sys),
162177 checks = check_units,
163178 name,
164179 kwargs... )
@@ -205,8 +220,12 @@ function SciMLBase.remake_initializeprob(sys::ODESystem, odefn, u0, t0, p)
205220 solvablepars = [par
206221 for par in parameters (sys)
207222 if is_parameter_solvable (par, p, defs, guesses)]
223+ pvarmap = merge (defs, p)
224+ setparobserved = filter (keys (pvarmap)) do var
225+ has_parameter_dependency_with_lhs (sys, var)
226+ end
208227 if (((! isempty (missingvars) || ! isempty (solvablepars) ||
209- ! isempty (setobserved)) &&
228+ ! isempty (setobserved) || ! isempty (setparobserved) ) &&
210229 ModelingToolkit. get_tearing_state (sys) != = nothing ) ||
211230 ! isempty (initialization_equations (sys)))
212231 initprob = InitializationProblem (sys, t0, u0, p)
0 commit comments