forked from SciML/ModelingToolkit.jl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathguess_propagation.jl
110 lines (83 loc) · 2.54 KB
/
guess_propagation.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using ModelingToolkit, OrdinaryDiffEq
using ModelingToolkit: D, t_nounits as t
using Test
# Standard case
@variables x(t) [guess = 2]
@variables y(t)
eqs = [D(x) ~ 1
x ~ y]
initialization_eqs = [1 ~ exp(1 + x)]
@named sys = ODESystem(eqs, t; initialization_eqs)
sys = complete(structural_simplify(sys))
tspan = (0.0, 0.2)
prob = ODEProblem(sys, [], tspan, [])
@test prob.f.initializeprob[y] == 2.0
@test prob.f.initializeprob[x] == 2.0
sol = solve(prob.f.initializeprob; show_trace = Val(true))
# Guess via observed
@variables x(t)
@variables y(t) [guess = 2]
eqs = [D(x) ~ 1
x ~ y]
initialization_eqs = [1 ~ exp(1 + x)]
@named sys = ODESystem(eqs, t; initialization_eqs)
sys = complete(structural_simplify(sys))
tspan = (0.0, 0.2)
prob = ODEProblem(sys, [], tspan, [])
@test prob.f.initializeprob[x] == 2.0
@test prob.f.initializeprob[y] == 2.0
sol = solve(prob.f.initializeprob; show_trace = Val(true))
# Guess via parameter
@parameters a = -1.0
@variables x(t) [guess = a]
eqs = [D(x) ~ a]
initialization_eqs = [1 ~ exp(1 + x)]
@named sys = ODESystem(eqs, t; initialization_eqs)
sys = complete(structural_simplify(sys))
tspan = (0.0, 0.2)
prob = ODEProblem(sys, [], tspan, [])
@test prob.f.initializeprob[x] == -1.0
sol = solve(prob.f.initializeprob; show_trace = Val(true))
# Guess via observed parameter
@parameters a = -1.0
@variables x(t)
@variables y(t) [guess = a]
eqs = [D(x) ~ a,
y ~ x]
initialization_eqs = [1 ~ exp(1 + x)]
@named sys = ODESystem(eqs, t; initialization_eqs)
sys = complete(structural_simplify(sys))
tspan = (0.0, 0.2)
prob = ODEProblem(sys, [], tspan, [])
@test prob.f.initializeprob[x] == -1.0
sol = solve(prob.f.initializeprob; show_trace = Val(true))
# Test parameters + defaults
# https://github.com/SciML/ModelingToolkit.jl/issues/2774
@parameters x0
@variables x(t)
@variables y(t) = x
@mtkbuild sys = ODESystem([x ~ x0, D(y) ~ x], t)
prob = ODEProblem(sys, [], (0.0, 1.0), [x0 => 1.0])
@test prob[x] == 1.0
@test prob[y] == 1.0
@parameters x0
@variables x(t)
@variables y(t) = x0
@mtkbuild sys = ODESystem([x ~ x0, D(y) ~ x], t)
prob = ODEProblem(sys, [], (0.0, 1.0), [x0 => 1.0])
@test prob[x] == 1.0
@test prob[y] == 1.0
@parameters x0
@variables x(t)
@variables y(t) = x0
@mtkbuild sys = ODESystem([x ~ y, D(y) ~ x], t)
prob = ODEProblem(sys, [], (0.0, 1.0), [x0 => 1.0])
@test prob[x] == 1.0
@test prob[y] == 1.0
@parameters x0
@variables x(t) = x0
@variables y(t) = x
@mtkbuild sys = ODESystem([x ~ y, D(y) ~ x], t)
prob = ODEProblem(sys, [], (0.0, 1.0), [x0 => 1.0])
@test prob[x] == 1.0
@test prob[y] == 1.0