Skip to content

Commit 2e277bc

Browse files
committed
Add substitute for ODEProblem
1 parent c14af36 commit 2e277bc

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

src/systems/abstractsystem.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ end
550550

551551
flatten(sys::AbstractSystem, args...) = sys
552552

553-
function equations(sys::ModelingToolkit.AbstractSystem)
553+
function equations(sys::AbstractSystem)
554554
eqs = get_eqs(sys)
555555
systems = get_systems(sys)
556556
if isempty(systems)
@@ -564,7 +564,7 @@ function equations(sys::ModelingToolkit.AbstractSystem)
564564
end
565565
end
566566

567-
function preface(sys::ModelingToolkit.AbstractSystem)
567+
function preface(sys::AbstractSystem)
568568
has_preface(sys) || return nothing
569569
pre = get_preface(sys)
570570
systems = get_systems(sys)

src/systems/diffeqs/odesystem.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,3 +436,9 @@ function convert_system(::Type{<:ODESystem}, sys, t; name = nameof(sys))
436436
return ODESystem(neweqs, t, newsts, parameters(sys); defaults = defs, name = name,
437437
checks = false)
438438
end
439+
440+
function Symbolics.substitute(sys::ODESystem, rules::Union{Vector{<:Pair}, Dict})
441+
rules = todict(map(r->Symbolics.unwrap(r[1])=>Symbolics.unwrap(r[2]), collect(rules)))
442+
eqs = fast_substitute(equations(sys), rules)
443+
ODESystem(eqs, get_iv(sys); name = nameof(sys))
444+
end

test/odesystem.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ using ModelingToolkit: value
1212
@constants κ = 1
1313
@variables x(t) y(t) z(t)
1414
D = Differential(t)
15+
@parameters k
1516

1617
# Define a differential equation
1718
eqs = [D(x) ~ σ * (y - x),
@@ -20,6 +21,11 @@ eqs = [D(x) ~ σ * (y - x),
2021

2122
ModelingToolkit.toexpr.(eqs)[1]
2223
@named de = ODESystem(eqs; defaults = Dict(x => 1))
24+
subed = substitute(de, [σ => k])
25+
@test isequal(sort(parameters(subed), by=string), [k, β, ρ])
26+
@test isequal(equations(subed), [D(x) ~ k*(y - x)
27+
D(y) ~- z)*x - y
28+
D(z) ~ x*y - β*κ*z])
2329
@named des[1:3] = ODESystem(eqs)
2430
@test length(unique(x -> ModelingToolkit.get_tag(x), des)) == 1
2531
@test eval(toexpr(de)) == de

0 commit comments

Comments
 (0)