Skip to content

Commit 207adaa

Browse files
committed
Add DDEs support in structural_simplify
1 parent 47d8f05 commit 207adaa

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/systems/systemstructure.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ end
253253
function TearingState(sys; quick_cancel = false, check = true)
254254
sys = flatten(sys)
255255
ivs = independent_variables(sys)
256+
iv = only(ivs)
256257
eqs = copy(equations(sys))
257258
neqs = length(eqs)
258259
dervaridxs = OrderedSet{Int}()
@@ -287,10 +288,15 @@ function TearingState(sys; quick_cancel = false, check = true)
287288
isalgeq = true
288289
statevars = []
289290
for var in vars
291+
if istree(var) && !ModelingToolkit.isoperator(var, Symbolics.Operator)
292+
args = arguments(var)
293+
length(args) == 1 || continue
294+
isequal(args[1], iv) || continue
295+
end
290296
set_incidence = true
291297
@label ANOTHER_VAR
292298
_var, _ = var_from_nested_derivative(var)
293-
any(isequal(_var), ivs) && continue
299+
isequal(_var, iv) && continue
294300
if isparameter(_var) ||
295301
(istree(_var) && isparameter(operation(_var)) || isconstant(_var))
296302
continue

test/dde.jl

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using ModelingToolkit, DelayDiffEq
2+
p0 = 0.2;
3+
q0 = 0.3;
4+
v0 = 1;
5+
d0 = 5;
6+
p1 = 0.2;
7+
q1 = 0.3;
8+
v1 = 1;
9+
d1 = 1;
10+
d2 = 1;
11+
beta0 = 1;
12+
beta1 = 1;
13+
tau = 1;
14+
function bc_model(du, u, h, p, t)
15+
du[1] = (v0 / (1 + beta0 * (h(p, t - tau)[3]^2))) * (p0 - q0) * u[1] - d0 * u[1]
16+
du[2] = (v0 / (1 + beta0 * (h(p, t - tau)[3]^2))) * (1 - p0 + q0) * u[1] +
17+
(v1 / (1 + beta1 * (h(p, t - tau)[3]^2))) * (p1 - q1) * u[2] - d1 * u[2]
18+
du[3] = (v1 / (1 + beta1 * (h(p, t - tau)[3]^2))) * (1 - p1 + q1) * u[2] - d2 * u[3]
19+
end
20+
lags = [tau]
21+
h(p, t) = ones(3)
22+
tspan = (0.0, 10.0)
23+
u0 = [1.0, 1.0, 1.0]
24+
prob = DDEProblem(bc_model, u0, h, tspan, constant_lags = lags)
25+
alg = MethodOfSteps(Tsit5())
26+
sol = solve(prob, alg)
27+
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
29+
@variables t x₀(t) x₁(t) x₂(..)
30+
D = Differential(t)
31+
eqs = [D(x₀) ~ (v0 / (1 + beta0 * (x₂(t - tau)^2))) * (p0 - q0) * x₀ - d0 * x₀
32+
D(x₁) ~ (v0 / (1 + beta0 * (x₂(t - tau)^2))) * (1 - p0 + q0) * x₀ +
33+
(v1 / (1 + beta1 * (x₂(t - tau)^2))) * (p1 - q1) * x₁ - d1 * x₁
34+
D(x₂(t)) ~ (v1 / (1 + beta1 * (x₂(t - tau)^2))) * (1 - p1 + q1) * x₁ - d2 * x₂(t)]
35+
@named sys = System(eqs)
36+
h(p, t) = ones(3)
37+
tspan = (0.0, 10.0)
38+
prob = DDEProblem(sys,
39+
[x₀ => 1.0, x₁ => 1.0, x₂(t) => 1.0],
40+
h,
41+
tspan,
42+
constant_lags = [tau])
43+
alg = MethodOfSteps(Tsit5())
44+
sol = solve(prob, alg)

0 commit comments

Comments
 (0)