-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdde_mtk.jl
67 lines (66 loc) · 2.02 KB
/
dde_mtk.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# code from https://gist.github.com/YingboMa/667c4420cfec9e050188eee3a5285e6f
using ModelingToolkit
@variables t x(..)[1:3]
pars = @parameters p0, q0, v0, d0, p1, q1, v1, d1, d2, beta0, beta1, tau
D = Differential(t)
hist3 = x(t - tau)[3]
x = collect(x(t))
eqs = [D(x[1]) ~ (v0 / (1 + beta0 * (hist3^2))) * (p0 - q0) * x[1] - d0 * x[1]
D(x[2]) ~ (v0 / (1 + beta0 * (hist3^2))) * (1 - p0 + q0) * x[1] +
(v1 / (1 + beta1 * (hist3^2))) * (p1 - q1) * x[2] - d1 * x[2]
D(x[3]) ~ (v1 / (1 + beta1 * (hist3^2))) * (1 - p1 + q1) * x[2] - d2 * x[3]]
@named sys = ODESystem(eqs, t, x, pars)
using Symbolics: unwrap
using SymbolicUtils
using SymbolicUtils.Code
using ModelingToolkit: isvariable
iv = unwrap(only(independent_variables(sys)))
eqs = equations(sys)
p = parameters(sys)
varss = Set()
for eq in eqs
ModelingToolkit.vars!(varss, eq)
end
delay_terms = filter(varss) do v
isvariable(v) || return false
istree(v) || return false
if operation(v) === getindex
v = arguments(v)[1]
end
istree(v) || return false
args = arguments(v)
length(args) == 1 && !isequal(iv, args[1]) && occursin(iv, args[1])
end |> collect
hh = Sym{Any}(:h)
# HACK
eqs2 = substitute.(eqs,
(Dict(delay_terms[1] => term(getindex,
term(hh, p, unwrap(iv - tau), type = Real),
3, type = Real)),))
out = Sym{Any}(:out)
body = SetArray(false, out, getfield.(eqs2, :rhs))
func = Func([out, DestructuredArgs(states(sys)), hh, DestructuredArgs(parameters(sys)), iv],
[], body)
my_func_expr = toexpr(func)
my_func = eval(my_func_expr)
h(p, t) = ones(3)
tau1 = 1
lags = [tau1]
p0 = 0.2;
q0 = 0.3;
v0 = 1;
d0 = 5;
p1 = 0.2;
q1 = 0.3;
v1 = 1;
d1 = 1;
d2 = 1;
beta0 = 1;
beta1 = 1;
tspan = (0.0, 10.0)
u0 = [1.0, 1.0, 1.0]
p2 = (p0, q0, v0, d0, p1, q1, v1, d1, d2, beta0, beta1, tau1)
using DelayDiffEq
prob = DDEProblem(my_func, u0, h, tspan, p2; constant_lags = lags)
alg = MethodOfSteps(Rodas4())
sol = solve(prob, alg)