Skip to content

Commit 5ec0109

Browse files
authored
Merge pull request #1707 from SciML/myb/alias
Fix alias elimination update
2 parents 39fe5a8 + 73def1b commit 5ec0109

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

src/systems/alias_elimination.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,9 @@ function reduce!(mm::SparseMatrixCLIL, ag::AliasGraph)
246246
# if we add a variable to what we already visited, make sure
247247
# to bump the cursor.
248248
j += i <= j
249+
for (i, e) in enumerate(dels)
250+
e >= i && (dels[i] += 1)
251+
end
249252
insert!(rs, i, alias)
250253
insert!(rvals, i, inc)
251254
else

test/odesystem.jl

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,3 +795,57 @@ let
795795
defs = Dict(s1.dx => 0.0, D(s1.x) => s1.x, s1.x => 0.0)
796796
@test isequal(ModelingToolkit.defaults(s2), defs)
797797
end
798+
799+
# https://github.com/SciML/ModelingToolkit.jl/issues/1705
800+
let
801+
x0 = 0.0
802+
v0 = 1.0
803+
804+
kx = -1.0
805+
kv = -1.0
806+
807+
tf = 10.0
808+
809+
## controller
810+
811+
function pd_ctrl(; name)
812+
@parameters kx kv
813+
@variables t u(t) x(t) v(t)
814+
815+
eqs = [u ~ kx * x + kv * v]
816+
ODESystem(eqs; name)
817+
end
818+
819+
@named ctrl = pd_ctrl()
820+
821+
## double integrator
822+
823+
function double_int(; name)
824+
@variables t u(t) x(t) v(t)
825+
D = Differential(t)
826+
827+
eqs = [D(x) ~ v, D(v) ~ u]
828+
ODESystem(eqs; name)
829+
end
830+
831+
@named sys = double_int()
832+
833+
## connections
834+
835+
connections = [sys.u ~ ctrl.u, ctrl.x ~ sys.x, ctrl.v ~ sys.v]
836+
837+
@named connected = ODESystem(connections)
838+
@named sys_con = compose(connected, sys, ctrl)
839+
840+
sys_alias = alias_elimination(sys_con)
841+
D = Differential(t)
842+
true_eqs = [0 ~ sys.v - D(sys.x)
843+
0 ~ ctrl.kv * D(sys.x) + ctrl.kx * sys.x - D(sys.v)]
844+
@test isequal(full_equations(sys_alias), true_eqs)
845+
846+
sys_simp = structural_simplify(sys_con)
847+
D = Differential(t)
848+
true_eqs = [D(sys.v) ~ ctrl.kv * sys.v + ctrl.kx * sys.x
849+
D(sys.x) ~ sys.v]
850+
@test isequal(full_equations(sys_simp), true_eqs)
851+
end

0 commit comments

Comments
 (0)