Skip to content

Commit 2006fa4

Browse files
authored
Merge pull request #2054 from SciML/myb/sub
Add substitute for ODEProblem
2 parents 166606a + ead1d37 commit 2006fa4

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-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: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,13 @@ function convert_system(::Type{<:ODESystem}, sys, t; name = nameof(sys))
437437
checks = false)
438438
end
439439

440+
function Symbolics.substitute(sys::ODESystem, rules::Union{Vector{<:Pair}, Dict})
441+
rules = todict(map(r -> Symbolics.unwrap(r[1]) => Symbolics.unwrap(r[2]),
442+
collect(rules)))
443+
eqs = fast_substitute(equations(sys), rules)
444+
ODESystem(eqs, get_iv(sys); name = nameof(sys))
445+
end
446+
440447
"""
441448
$(SIGNATURES)
442449

test/odesystem.jl

Lines changed: 7 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,12 @@ 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),
27+
[D(x) ~ k * (y - x)
28+
D(y) ~- z) * x - y
29+
D(z) ~ x * y - β * κ * z])
2330
@named des[1:3] = ODESystem(eqs)
2431
@test length(unique(x -> ModelingToolkit.get_tag(x), des)) == 1
2532
@test eval(toexpr(de)) == de

0 commit comments

Comments
 (0)