diff --git a/lib/ModelingToolkitBase/src/systems/problem_utils.jl b/lib/ModelingToolkitBase/src/systems/problem_utils.jl index 291e8e2e44..d1073f0452 100644 --- a/lib/ModelingToolkitBase/src/systems/problem_utils.jl +++ b/lib/ModelingToolkitBase/src/systems/problem_utils.jl @@ -537,7 +537,13 @@ function evaluate_varmap!( ir::IRStructure{SymReal}, varmap::AtomicArrayDictSubstitutionWrapper, vars; limit = 100, allow_symbolic = false ) - subber = Symbolics.FixpointSubstituter(SU.IRSubstituter{true}(ir, varmap); maxiters = limit, warn_maxiters = !allow_symbolic) + # Use `FPSubFilterer{Nothing}` so substitution descends into operator calls such as + # `Initial`, matching the generic `fixpoint_sub` path. The default IR filterer treats + # operators as atomic, leaving `Initial`-dependent guesses unresolved. + subber = Symbolics.FixpointSubstituter( + SU.IRSubstituter{true}(ir, varmap; filterer = Symbolics.FPSubFilterer{Nothing}()); + maxiters = limit, warn_maxiters = !allow_symbolic + ) for k in vars v = get(varmap, k, COMMON_NOTHING) v === COMMON_NOTHING && continue diff --git a/lib/ModelingToolkitBase/test/initializationsystem.jl b/lib/ModelingToolkitBase/test/initializationsystem.jl index 103f3f58ae..67b3741c5c 100644 --- a/lib/ModelingToolkitBase/test/initializationsystem.jl +++ b/lib/ModelingToolkitBase/test/initializationsystem.jl @@ -1610,6 +1610,24 @@ end @test integ1[X1] ≈ 1.0 end +@testset "Initial-dependent array parameter guesses" begin + @variables X1(t) X2(t) + @parameters k1 k2 Γ[1:1] = missing [guess = [Initial(X1 + X2)]] + eqs = [D(X1) ~ k1 * (Γ[1] - X1) - k2 * X1] + @named osys = System( + eqs, t, [X1], [k1, k2, Γ]; observed = [X2 ~ Γ[1] - X1] + ) + osys = complete(osys) + prob = ODEProblem( + osys, + [X1 => 1.0, X2 => 2.0, k1 => 0.1, k2 => 0.2], + (0.0, 1.0) + ) + + @test prob[X2] == 2.0 + @test prob.ps[Γ[1]] == 3.0 +end + if @isdefined(ModelingToolkit) @testset "Trivial initialization is run on problem construction" begin @variables _x(..) y(t)