Skip to content

Constants Not Mapped to Defaults #3044

@timknab

Description

@timknab

If a constant is used in when defining the default value of a parameter or initial condition of an ODESystem an ODEProblem will not build from the ODESystem.

This works fine with parameters, not sure why constants are not mapped.

For parameter defaults

using ModelingToolkit
using DifferentialEquations
using ModelingToolkit: t_nounits as t, D_nounits as D

@constants h = 1
@parameters τ  = 0.5 * h
@variables x(t) =1.0
eqs = [D(x) ~ (h - x) / τ] 


@named model = ODESystem(eqs, t)#;defaults=[h=>ModelingToolkit.getdefault(h)])

fol_model = structural_simplify(model)

prob = ODEProblem(fol_model, [], (0.0, 10.0));

Error & Stacktrace ⚠️

ERROR: Could not evaluate value of parameter τ. Missing values for variables in expression 0.5h.
Stacktrace:
  [1] error(s::String)
    @ Base ./error.jl:35
  [2] MTKParameters(sys::ODESystem, p::SciMLBase.NullParameters, u0::Vector{Any}; tofloat::Bool, use_union::Bool, t0::Float64)
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/parameter_buffer.jl:153
  [3] process_DEProblem(constructor::Type, sys::ODESystem, u0map::Vector{…}, parammap::SciMLBase.NullParameters; implicit_dae::Bool, du0map::Nothing, version::Nothing, tgrad::Bool, jac::Bool, checkbounds::Bool, sparse::Bool, simplify::Bool, linenumbers::Bool, parallel::Symbolics.SerialForm, eval_expression::Bool, eval_module::Module, use_union::Bool, tofloat::Bool, symbolic_u0::Bool, u0_constructor::typeof(identity), guesses::Dict{…}, t::Float64, warn_initialize_determined::Bool, build_initializeprob::Bool, initialization_eqs::Vector{…}, fully_determined::Bool, check_units::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:845
  [4] process_DEProblem
    @ ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:766 [inlined]
  [5] (ODEProblem{})(sys::ODESystem, u0map::Vector{…}, tspan::Tuple{…}, parammap::SciMLBase.NullParameters; callback::Nothing, check_length::Bool, warn_initialize_determined::Bool, eval_expression::Bool, eval_module::Module, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:992
  [6] ODEProblem
    @ ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:980 [inlined]
  [7] (ODEProblem{true, SciMLBase.AutoSpecialize})(sys::ODESystem, u0map::Vector{Any}, tspan::Tuple{Float64, Float64})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:980
  [8] (ODEProblem{true})(::ODESystem, ::Vector{Any}, ::Vararg{Any}; kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:967
  [9] (ODEProblem{true})(::ODESystem, ::Vector{Any}, ::Vararg{Any})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:966
 [10] ODEProblem(::ODESystem, ::Vector{Any}, ::Vararg{Any}; kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:956
 [11] ODEProblem(::ODESystem, ::Vector{Any}, ::Vararg{Any})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:955

And for Initial Conditions

using ModelingToolkit
using DifferentialEquations
using ModelingToolkit: t_nounits as t, D_nounits as D

@constants h = 1
@parameters τ  = 0.5
@variables x(t) = h
eqs = [D(x) ~ (h - x) / τ] 


@named model = ODESystem(eqs, t)#;defaults=[h=>ModelingToolkit.getdefault(h)])

fol_model = structural_simplify(model)

prob = ODEProblem(fol_model, [], (0.0, 10.0));
ERROR: ArgumentError: SymbolicUtils.BasicSymbolic{Real}[h] are either missing from the variable map or missing from the system's unknowns/parameters list.
Stacktrace:
  [1] throw_missingvars_in_sys(vars::Vector{SymbolicUtils.BasicSymbolic{Real}})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/utils.jl:657
  [2] promote_to_concrete(vs::Vector{SymbolicUtils.BasicSymbolic{Real}}; tofloat::Bool, use_union::Bool)
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/utils.jl:676
  [3] varmap_to_vars(varmap::Vector{…}, varlist::Vector{…}; defaults::Dict{…}, check::Bool, toterm::Function, promotetoconcrete::Nothing, tofloat::Bool, use_union::Bool)
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/variables.jl:170
  [4] get_u0(sys::ODESystem, u0map::Vector{…}, parammap::SciMLBase.NullParameters; symbolic_u0::Bool, toterm::Function, t0::Float64, use_union::Bool)
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:760
  [5] process_DEProblem(constructor::Type, sys::ODESystem, u0map::Vector{…}, parammap::SciMLBase.NullParameters; implicit_dae::Bool, du0map::Nothing, version::Nothing, tgrad::Bool, jac::Bool, checkbounds::Bool, sparse::Bool, simplify::Bool, linenumbers::Bool, parallel::Symbolics.SerialForm, eval_expression::Bool, eval_module::Module, use_union::Bool, tofloat::Bool, symbolic_u0::Bool, u0_constructor::typeof(identity), guesses::Dict{…}, t::Float64, warn_initialize_determined::Bool, build_initializeprob::Bool, initialization_eqs::Vector{…}, fully_determined::Bool, check_units::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:838
  [6] process_DEProblem
    @ ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:766 [inlined]
  [7] (ODEProblem{})(sys::ODESystem, u0map::Vector{…}, tspan::Tuple{…}, parammap::SciMLBase.NullParameters; callback::Nothing, check_length::Bool, warn_initialize_determined::Bool, eval_expression::Bool, eval_module::Module, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:992
  [8] ODEProblem
    @ ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:980 [inlined]
  [9] (ODEProblem{true, SciMLBase.AutoSpecialize})(sys::ODESystem, u0map::Vector{Any}, tspan::Tuple{Float64, Float64})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:980
 [10] (ODEProblem{true})(::ODESystem, ::Vector{Any}, ::Vararg{Any}; kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:967
 [11] (ODEProblem{true})(::ODESystem, ::Vector{Any}, ::Vararg{Any})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:966
 [12] ODEProblem(::ODESystem, ::Vector{Any}, ::Vararg{Any}; kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:956
 [13] ODEProblem(::ODESystem, ::Vector{Any}, ::Vararg{Any})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/yfT8s/src/systems/diffeqs/abstractodesystem.jl:955

You can "fix" it by providing the value of h in the example above to defaults in the ODESystem call, but this is pretty redundant and it seems like this should get picked up automatically. The below appears to work fine.

using ModelingToolkit
using DifferentialEquations
using ModelingToolkit: t_nounits as t, D_nounits as D

@constants h = 1
@parameters τ  = 0.5
@variables x(t) = h
eqs = [D(x) ~ (h - x) / τ] 


@named model = ODESystem(eqs, t; defaults=[h=>ModelingToolkit.getdefault(h)])

fol_model = structural_simplify(model)

prob = ODEProblem(fol_model, [], (0.0, 10.0));

sol = solve(prob);

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions