Skip to content

Commit 8b31505

Browse files
committed
Add toodesystem
1 parent c5ea6d7 commit 8b31505

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

src/systems/abstractsystem.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,3 +737,30 @@ end
737737
function connect(syss...)
738738
connect(promote_connect_type(map(get_connection_type, syss)...), syss...)
739739
end
740+
741+
###
742+
### system promotion
743+
###
744+
function toodesystem(sys, t)
745+
varmap = Dict()
746+
sts = states(sys)
747+
for (i, s) in enumerate(sts)
748+
if istree(s)
749+
args = arguments(s)
750+
length(args) == 1 || throw(InvalidSystemException("Illegal state: $s. The state can have at most one argument like `x(t)`."))
751+
arg = args[1]
752+
isequal(arg, t) && continue
753+
ns = operation(s)(t)
754+
sts[i] = ns
755+
varmap[s] = ns
756+
else
757+
ns = indepvar2depvar(s)
758+
sts[i] = ns
759+
varmap[s] = ns
760+
end
761+
end
762+
sub = Base.Fix2(substitute, varmap)
763+
neweqs = map(sub, equations(sys))
764+
defs = Dict(sub(k) => sub(v) for (k, v) in defaults(sys))
765+
return ODESystem(neweqs, t, sts, parameters(sys); defaults=defs)
766+
end

src/utils.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,9 @@ function todict(d)
7878
end
7979

8080
_merge(d1, d2) = merge(todict(d1), todict(d2))
81+
82+
function indepvar2depvar(s::Sym, args...)
83+
T = FnType{NTuple{length(args)}, symtype(s)}
84+
ns = Sym{T}(s)(args...)
85+
@set! ns.metadata = s.metadata
86+
end

0 commit comments

Comments
 (0)