Skip to content

Commit 7d594a1

Browse files
committed
Symbolic support for DDE histories
1 parent 8e422ee commit 7d594a1

File tree

2 files changed

+36
-10
lines changed

2 files changed

+36
-10
lines changed

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,12 @@ end
651651
652652
Take dictionaries with initial conditions and parameters and convert them to numeric arrays `u0` and `p`. Also return the merged dictionary `defs` containing the entire operating point.
653653
"""
654-
function get_u0_p(sys, u0map, parammap; use_union = false, tofloat = !use_union)
654+
function get_u0_p(sys,
655+
u0map,
656+
parammap;
657+
use_union = false,
658+
tofloat = !use_union,
659+
symbolic_u0 = false)
655660
eqs = equations(sys)
656661
dvs = states(sys)
657662
ps = parameters(sys)
@@ -660,7 +665,11 @@ function get_u0_p(sys, u0map, parammap; use_union = false, tofloat = !use_union)
660665
defs = mergedefaults(defs, parammap, ps)
661666
defs = mergedefaults(defs, u0map, dvs)
662667

663-
u0 = varmap_to_vars(u0map, dvs; defaults = defs, tofloat = true)
668+
if symbolic_u0
669+
u0 = varmap_to_vars(u0map, dvs; defaults = defs, tofloat = false, use_union = false)
670+
else
671+
u0 = varmap_to_vars(u0map, dvs; defaults = defs, tofloat = true)
672+
end
664673
p = varmap_to_vars(parammap, ps; defaults = defs, tofloat, use_union)
665674
p = p === nothing ? SciMLBase.NullParameters() : p
666675
u0, p, defs
@@ -676,13 +685,14 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
676685
eval_expression = true,
677686
use_union = false,
678687
tofloat = !use_union,
688+
symbolic_u0 = false,
679689
kwargs...)
680690
eqs = equations(sys)
681691
dvs = states(sys)
682692
ps = parameters(sys)
683693
iv = get_iv(sys)
684694

685-
u0, p, defs = get_u0_p(sys, u0map, parammap; tofloat, use_union)
695+
u0, p, defs = get_u0_p(sys, u0map, parammap; tofloat, use_union, symbolic_u0)
686696

687697
if implicit_dae && du0map !== nothing
688698
ddvs = map(Differential(iv), dvs)
@@ -874,11 +884,14 @@ function DiffEqBase.DAEProblem{iip}(sys::AbstractODESystem, du0map, u0map, tspan
874884
end
875885
end
876886

887+
function generate_history(sys::AbstractODESystem, u0; kwargs...)
888+
build_function(u0, parameters(sys), get_iv(sys); expression = Val{false}, kwargs...)
889+
end
890+
877891
function DiffEqBase.DDEProblem(sys::AbstractODESystem, args...; kwargs...)
878892
DDEProblem{true}(sys, args...; kwargs...)
879893
end
880894
function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
881-
h = (u, p) -> zeros(length(states(sts))),
882895
tspan = get_tspan(sys),
883896
parammap = DiffEqBase.NullParameters();
884897
callback = nothing,
@@ -888,7 +901,11 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
888901
f, u0, p = process_DEProblem(DDEFunction{iip}, sys, u0map, parammap;
889902
t = tspan !== nothing ? tspan[1] : tspan,
890903
has_difference = has_difference,
904+
symbolic_u0 = true,
891905
check_length, kwargs...)
906+
h_oop, h_iip = generate_history(sys, u0)
907+
h = h_oop
908+
u0 = h(p, tspan[1])
892909
cbs = process_events(sys; callback, has_difference, kwargs...)
893910
if has_discrete_subsystems(sys) && (dss = get_discrete_subsystems(sys)) !== nothing
894911
affects, clocks, svs = ModelingToolkit.generate_discrete_affect(dss...)

test/dde.jl

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,18 @@ function bc_model(du, u, h, p, t)
1919
end
2020
lags = [tau]
2121
h(p, t) = ones(3)
22+
h2(p, t) = ones(3) .- t * q1
2223
tspan = (0.0, 10.0)
2324
u0 = [1.0, 1.0, 1.0]
2425
prob = DDEProblem(bc_model, u0, h, tspan, constant_lags = lags)
25-
alg = MethodOfSteps(Tsit5())
26-
sol = solve(prob, alg)
26+
alg = MethodOfSteps(Vern9())
27+
sol = solve(prob, alg, reltol = 1e-7, abstol = 1e-10)
28+
prob2 = DDEProblem(bc_model, u0, h2, tspan, constant_lags = lags)
29+
sol2 = solve(prob, alg, reltol = 1e-7, abstol = 1e-10)
2730

28-
@parameters p0=0.2 p1=0.2 q0=0.3 q1=0.3 v0=1 v1=1 d0=5 d1=1 d2=1 beta0=1 beta1=1 tau=1
31+
@parameters p0=0.2 p1=0.2 q0=0.3 q1=0.3 v0=1 v1=1 d0=5 d1=1 d2=1 beta0=1 beta1=1
2932
@variables t x₀(t) x₁(t) x₂(..)
33+
tau = 1
3034
D = Differential(t)
3135
eqs = [D(x₀) ~ (v0 / (1 + beta0 * (x₂(t - tau)^2))) * (p0 - q0) * x₀ - d0 * x₀
3236
D(x₁) ~ (v0 / (1 + beta0 * (x₂(t - tau)^2))) * (1 - p0 + q0) * x₀ +
@@ -35,8 +39,13 @@ eqs = [D(x₀) ~ (v0 / (1 + beta0 * (x₂(t - tau)^2))) * (p0 - q0) * x₀ - d0
3539
@named sys = System(eqs)
3640
prob = DDEProblem(sys,
3741
[x₀ => 1.0, x₁ => 1.0, x₂(t) => 1.0],
38-
h,
3942
tspan,
4043
constant_lags = [tau])
41-
sol_mtk = solve(prob, alg)
42-
@test Array(sol_mtk) Array(sol)
44+
sol_mtk = solve(prob, alg, reltol = 1e-7, abstol = 1e-10)
45+
@test sol_mtk.u[end] sol.u[end]
46+
prob2 = DDEProblem(sys,
47+
[x₀ => 1.0 - t * q1, x₁ => 1.0 - t * q1, x₂(t) => 1.0 - t * q1],
48+
tspan,
49+
constant_lags = [tau])
50+
sol2_mtk = solve(prob2, alg, reltol = 1e-7, abstol = 1e-10)
51+
@test sol2_mtk.u[end]sol2.u[end] atol=1e-5

0 commit comments

Comments
 (0)