Hi,
I am trying to simulate this simple example of a step input signal to a First Order Plus Delay process with ModelingToolkit and DelayDiffEq but it runs into an error. I wonder if it is possible to make this approach work. The main purpose here is to create a Delay component which is convenient to reuse and to build complex systems with. Thank you.
using ModelingToolkit, ModelingToolkitStandardLibrary.Blocks, DelayDiffEq
using ModelingToolkit: t_nounits as t, D_nounits as D
@component function Delay(; name, tau = 1.0)
# Define parameters
pars = @parameters begin
tau = tau, [description = "Time delay duration"]
end
# Define ports (variables)
vars = @variables begin
input(..), [description = "Input signal to be delayed"]
output(t), [description = "Delayed output signal"]
end
# The core delay equation: y(t) = u(t - tau)
eqs = [
output ~ input(t - tau)
]
return System(eqs, t, [input(t), output], pars; name = name)
end
@component function Step(; name, start_time = 1.0, amplitude = 1.0)
pars = @parameters start_time=start_time amplitude=amplitude
vars = @variables out(t)=0.0
eqs = [
out ~ ifelse(t < start_time, 0.0, amplitude)
]
return System(eqs, t, vars, pars; name=name)
end
@component function FirstOrder(; name, k = 1.0, T = 1.0)
pars = @parameters k=k T=T
vars = @variables input(t)=0.0 output(t)=0.0
eqs = [
T * D(output) ~ -output + k * input
]
return System(eqs, t, vars, pars; name=name)
end
@named S = Step(start_time = 1.0, amplitude = 1.0)
@named TD = Delay()
@named P = FirstOrder(k = 1.0, T = 1.0)
eqs = [TD.input ~ S.out,
P.input ~ TD.output]
sys = System(eqs, t, systems = [S, TD, P], name = :feedback_system)
sys = structural_simplify(sys)
tspan = (0.0, 10.0)
prob = DDEProblem(sys, [], tspan, constant_lags = [1.0])
sol = solve(prob)
The error:
ERROR: ArgumentError: TD₊input(-TD₊tau + t) is present in the system but TD₊input(-TD₊tau + t) is not an unknown.
Stacktrace:
[1] TearingState(sys::System, source_info::ModelingToolkitBase.EquationSourceInformation; check::Bool, sort_eqs::Bool)
@ ModelingToolkitTearing ~/.julia/packages/ModelingToolkitTearing/SCdmO/src/tearingstate.jl:213
[2] TearingState
@ ~/.julia/packages/ModelingToolkitTearing/SCdmO/src/tearingstate.jl:104 [inlined]
[3] __mtkcompile(sys::System; inputs::OrderedCollections.OrderedSet{…}, outputs::OrderedCollections.OrderedSet{…}, disturbance_inputs::OrderedCollections.OrderedSet{…}, sort_eqs::Bool, kwargs::@Kwargs{…})
@ ModelingToolkit ~/.julia/packages/ModelingToolkit/ROEoO/src/systems/systems.jl:33
[4] __mtkcompile
@ ~/.julia/packages/ModelingToolkit/ROEoO/src/systems/systems.jl:23 [inlined]
[5] _mtkcompile(sys::System; kwargs::@Kwargs{…})
@ ModelingToolkitBase ~/.julia/packages/ModelingToolkitBase/uIKoY/src/systems/systems.jl:149
[6] mtkcompile(sys::System; additional_passes::Tuple{}, inputs::Vector{…}, outputs::Vector{…}, disturbance_inputs::Vector{…}, split::Bool, kwargs::@Kwargs{…})
@ ModelingToolkitBase ~/.julia/packages/ModelingToolkitBase/uIKoY/src/systems/systems.jl:84
[7] mtkcompile
@ ~/.julia/packages/ModelingToolkitBase/uIKoY/src/systems/systems.jl:84 [inlined]
[8] InitializationProblem{…}(sys::System, t::Float64, op::ModelingToolkitBase.AtomicArrayDict{…}; fast_path::Bool, guesses::Dict{…}, check_length::Bool, warn_initialize_determined::Bool, initialization_eqs::Vector{…}, fully_determined::Nothing, check_units::Bool, allow_incomplete::Bool, algebraic_only::Bool, time_dependent_init::Bool, initsys_mtkcompile_kwargs::@NamedTuple{}, is_steadystateprob::Bool, kwargs::@Kwargs{…})
@ ModelingToolkitBase ~/.julia/packages/ModelingToolkitBase/uIKoY/src/problems/initializationproblem.jl:85
[9] InitializationProblem
@ ~/.julia/packages/ModelingToolkitBase/uIKoY/src/problems/initializationproblem.jl:22 [inlined]
[10] #_#927
@ ./none:-1 [inlined]
[11] maybe_build_initialization_problem(sys::System, iip::Bool, op::ModelingToolkitBase.AtomicArrayDict{…}, t::Float64, guesses::Dict{…}; time_dependent_init::Bool, u0_constructor::Function, p_constructor::Function, floatT::Type, initialization_eqs::Vector{…}, use_scc::Bool, eval_expression::Bool, eval_module::Module, missing_guess_value::ModelingToolkitBase.MissingGuessValue.var"typeof(MissingGuessValue)", implicit_dae::Bool, is_steadystateprob::Bool, expression::Type, kwargs::@Kwargs{…})
@ ModelingToolkitBase ~/.julia/packages/ModelingToolkitBase/uIKoY/src/systems/problem_utils.jl:1186
[12] process_SciMLProblem(constructor::Type, sys::System, op::Vector{…}; build_initializeprob::Bool, implicit_dae::Bool, t::Float64, guesses::Dict{…}, warn_initialize_determined::Bool, initialization_eqs::Vector{…}, eval_expression::Bool, eval_module::Module, fully_determined::Nothing, check_initialization_units::Bool, u0_eltype::Nothing, tofloat::Bool, u0_constructor::typeof(identity), p_constructor::typeof(identity), check_length::Bool, symbolic_u0::Bool, warn_cyclic_dependency::Bool, circular_dependency_max_cycle_length::Int64, circular_dependency_max_cycles::Int64, initsys_mtkcompile_kwargs::@NamedTuple{}, substitution_limit::Int64, use_scc::Bool, time_dependent_init::Bool, algebraic_only::Bool, missing_guess_value::ModelingToolkitBase.MissingGuessValue.var"typeof(MissingGuessValue)", allow_incomplete::Bool, is_initializeprob::Bool, is_steadystateprob::Bool, return_operating_point::Bool, kwargs::@Kwargs{…})
@ ModelingToolkitBase ~/.julia/packages/ModelingToolkitBase/uIKoY/src/systems/problem_utils.jl:1555
[13] (DDEProblem{…})(sys::System, op::Vector{…}, tspan::Tuple{…}; callback::Nothing, check_length::Bool, cse::Bool, checkbounds::Bool, eval_expression::Bool, eval_module::Module, check_compatibility::Bool, u0_constructor::typeof(identity), expression::Type, kwargs::@Kwargs{…})
@ ModelingToolkitBase ~/.julia/packages/ModelingToolkitBase/uIKoY/src/problems/ddeproblem.jl:55
[14] top-level scope
@ ~/Scripts_Julia/delayDDE.jl:55
Some type information was truncated. Use `show(err)` to see complete types.```