Skip to content

Commit 13ef19b

Browse files
committed
add support for symbolic parameters
1 parent 41d1789 commit 13ef19b

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

src/systems/abstractsystem.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,15 @@ function Base.getproperty(sys::AbstractSystem, name::Symbol)
181181
throw(error("Variable $name does not exist"))
182182
end
183183

184+
function Base.setproperty!(sys::AbstractSystem, prop::Symbol, val)
185+
param = Sym{Parameter{Real}}(prop)
186+
if param in parameters(sys)
187+
sys.default_p[param] = val
188+
else
189+
setfield!(sys, prop, val)
190+
end
191+
end
192+
184193
function renamespace(namespace, x)
185194
if x isa Num
186195
renamespace(namespace, value(x))
@@ -203,7 +212,7 @@ end
203212

204213
function namespace_default_p(sys)
205214
d_p = default_p(sys)
206-
Dict(parameters(sys, k) => d_p[k] for k in keys(d_p))
215+
Dict(parameters(sys, k) => namespace_expr(d_p[k], nameof(sys), []) for k in keys(d_p))
207216
end
208217

209218
function namespace_equations(sys::AbstractSystem)

src/variables.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,10 @@ applicable.
213213
function varmap_to_vars(varmap::Dict, varlist; defaults=Dict())
214214
varmap = merge(defaults, varmap) # prefers the `varmap`
215215
varmap = Dict(value(k)=>value(varmap[k]) for k in keys(varmap))
216+
# resolve symbolic parameter expressions
217+
for (p, v) in pairs(varmap)
218+
varmap[p] = fixpoint_sub(v, varmap)
219+
end
216220
T′ = eltype(values(varmap))
217221
T = Base.isconcretetype(T′) ? T′ : Base.promote_typeof(values(varmap)...)
218222
out = Vector{T}(undef, length(varlist))

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using SafeTestsets, Test
22

3+
@safetestset "Symbolic parameters test" begin include("symbolic_parameters.jl") end
34
@safetestset "Parsing Test" begin include("variable_parsing.jl") end
45
@safetestset "Differentiation Test" begin include("derivatives.jl") end
56
@safetestset "Simplify Test" begin include("simplify.jl") end

test/symbolic_parameters.jl

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using ModelingToolkit
2+
using NonlinearSolve
3+
using Test
4+
5+
@variables x y z
6+
@parameters σ ρ β
7+
8+
eqs = [0 ~ σ*(y-x),
9+
0 ~ x*-z)-y,
10+
0 ~ x*y - β*z]
11+
12+
par = [
13+
σ => 1,
14+
ρ => 0.1+σ,
15+
β => ρ*1.1
16+
]
17+
ns = NonlinearSystem(eqs, [x,y,z],[σ,ρ,β], name=:ns, default_p=par)
18+
ModelingToolkit.default_p(ns)
19+
resolved = ModelingToolkit.varmap_to_vars(Dict(), parameters(ns), defaults=ModelingToolkit.default_p(ns))
20+
@test resolved == [1, 0.1+1, (0.1+1)*1.1]
21+
22+
prob = NonlinearProblem(ns, ones(3), Pair[])
23+
@show sol = solve(prob,NewtonRaphson())
24+
25+
@variables a
26+
@parameters b
27+
top = NonlinearSystem([0 ~ -a + ns.x+1], [a], [b], systems=[ns], name=:top)
28+
flat = flatten(top)
29+
flat.b = ns.σ*0.5
30+
31+
flatres = ModelingToolkit.varmap_to_vars(Dict(), parameters(flat), defaults=ModelingToolkit.default_p(flat))
32+
@test flatres == [0.5, 1, 0.1+1, (0.1+1)*1.1]
33+
34+
prob = NonlinearProblem(flat, ones(4), Pair[])
35+
@show sol = solve(prob,NewtonRaphson())

0 commit comments

Comments
 (0)