@@ -4,101 +4,101 @@ using Test, LinearAlgebra
44
55# Change of variables: z = log(x)
66# (this implies that x = exp(z) is automatically non-negative)
7- @independent_variables t
8- @variables z (t)[1 : 2 , 1 : 2 ]
9- D = Differential (t)
10- eqs = [D (D (z)) ~ ones (2 , 2 )]
11- @mtkcompile sys = System (eqs, t)
12- @test_nowarn ODEProblem (sys, [z => zeros (2 , 2 ), D (z) => ones (2 , 2 )], (0.0 , 10.0 ))
7+ # @independent_variables t
8+ # @variables z(t)[1:2, 1:2]
9+ # D = Differential(t)
10+ # eqs = [D(D(z)) ~ ones(2, 2)]
11+ # @mtkcompile sys = System(eqs, t)
12+ # @test_nowarn ODEProblem(sys, [z => zeros(2, 2), D(z) => ones(2, 2)], (0.0, 10.0))
1313
14- @parameters α
15- @variables x (t)
16- D = Differential (t)
17- eqs = [D (x) ~ α* x]
14+ # @parameters α
15+ # @variables x(t)
16+ # D = Differential(t)
17+ # eqs = [D(x) ~ α*x]
1818
19- tspan = (0. , 1. )
20- def = [x => 1.0 , α => - 0.5 ]
19+ # tspan = (0., 1.)
20+ # def = [x => 1.0, α => -0.5]
2121
22- @mtkcompile sys = System (eqs, t;defaults= def)
23- prob = ODEProblem (sys, [], tspan)
24- sol = solve (prob, Tsit5 ())
22+ # @mtkcompile sys = System(eqs, t;defaults=def)
23+ # prob = ODEProblem(sys, [], tspan)
24+ # sol = solve(prob, Tsit5())
2525
26- @variables z (t)
27- forward_subs = [log (x) => z]
28- backward_subs = [x => exp (z)]
29- new_sys = changeofvariables (sys, t, forward_subs, backward_subs)
30- @test equations (new_sys)[1 ] == (D (z) ~ α)
26+ # @variables z(t)
27+ # forward_subs = [log(x) => z]
28+ # backward_subs = [x => exp(z)]
29+ # new_sys = changeofvariables(sys, t, forward_subs, backward_subs)
30+ # @test equations(new_sys)[1] == (D(z) ~ α)
3131
32- new_prob = ODEProblem (new_sys, [], tspan)
33- new_sol = solve (new_prob, Tsit5 ())
32+ # new_prob = ODEProblem(new_sys, [], tspan)
33+ # new_sol = solve(new_prob, Tsit5())
3434
35- @test isapprox (new_sol[x][end ], sol[x][end ], atol= 1e-4 )
35+ # @test isapprox(new_sol[x][end], sol[x][end], atol=1e-4)
3636
3737
3838
39- # Riccati equation
40- @parameters α
41- @variables x (t)
42- D = Differential (t)
43- eqs = [D (x) ~ t^ 2 + α - x^ 2 ]
44- def = [x=> 1. , α => 1. ]
45- @mtkcompile sys = System (eqs, t; defaults= def)
39+ # # Riccati equation
40+ # @parameters α
41+ # @variables x(t)
42+ # D = Differential(t)
43+ # eqs = [D(x) ~ t^2 + α - x^2]
44+ # def = [x=>1., α => 1.]
45+ # @mtkcompile sys = System(eqs, t; defaults=def)
4646
47- @variables z (t)
48- forward_subs = [t + α/ (x+ t) => z ]
49- backward_subs = [ x => α/ (z- t) - t]
47+ # @variables z(t)
48+ # forward_subs = [t + α/(x+t) => z ]
49+ # backward_subs = [ x => α/(z-t) - t]
5050
51- new_sys = changeofvariables (sys, t, forward_subs, backward_subs; simplify= true , t0= 0. )
52- # output should be equivalent to
53- # t^2 + α - z^2 + 2 (but this simplification is not found automatically)
51+ # new_sys = changeofvariables(sys, t, forward_subs, backward_subs; simplify=true, t0=0.)
52+ # # output should be equivalent to
53+ # # t^2 + α - z^2 + 2 (but this simplification is not found automatically)
5454
55- tspan = (0. , 1. )
56- prob = ODEProblem (sys,[],tspan)
57- new_prob = ODEProblem (new_sys,[],tspan)
55+ # tspan = (0., 1.)
56+ # prob = ODEProblem(sys,[],tspan)
57+ # new_prob = ODEProblem(new_sys,[],tspan)
5858
59- sol = solve (prob, Tsit5 ())
60- new_sol = solve (new_prob, Tsit5 ())
59+ # sol = solve(prob, Tsit5())
60+ # new_sol = solve(new_prob, Tsit5())
6161
62- @test isapprox (sol[x][end ], new_sol[x][end ], rtol= 1e-4 )
62+ # @test isapprox(sol[x][end], new_sol[x][end], rtol=1e-4)
6363
6464
65- # Linear transformation to diagonal system
66- @independent_variables t
67- @variables x (t)[1 : 3 ]
68- x = reshape (x, 3 , 1 )
69- D = Differential (t)
70- A = [0. - 1. 0. ; - 0.5 0.5 0. ; 0. 0. - 1. ]
71- right = A* x
72- eqs = vec (D .(x) .~ right)
65+ # # Linear transformation to diagonal system
66+ # @independent_variables t
67+ # @variables x(t)[1:3]
68+ # x = reshape(x, 3, 1)
69+ # D = Differential(t)
70+ # A = [0. -1. 0.; -0.5 0.5 0.; 0. 0. -1.]
71+ # right = A*x
72+ # eqs = vec(D.(x) .~ right)
7373
74- tspan = (0. , 10. )
75- u0 = [x[1 ] => 1.0 , x[2 ] => 2.0 , x[3 ] => - 1.0 ]
74+ # tspan = (0., 10.)
75+ # u0 = [x[1] => 1.0, x[2] => 2.0, x[3] => -1.0]
7676
77- @mtkcompile sys = System (eqs, t; defaults= u0)
78- prob = ODEProblem (sys,[],tspan)
79- sol = solve (prob, Tsit5 ())
77+ # @mtkcompile sys = System(eqs, t; defaults=u0)
78+ # prob = ODEProblem(sys,[],tspan)
79+ # sol = solve(prob, Tsit5())
8080
81- T = eigen (A). vectors
82- T_inv = inv (T)
81+ # T = eigen(A).vectors
82+ # T_inv = inv(T)
8383
84- @variables z (t)[1 : 3 ]
85- z = reshape (z, 3 , 1 )
86- forward_subs = vec (T_inv* x .=> z)
87- backward_subs = vec (x .=> T* z)
84+ # @variables z(t)[1:3]
85+ # z = reshape(z, 3, 1)
86+ # forward_subs = vec(T_inv*x .=> z)
87+ # backward_subs = vec(x .=> T*z)
8888
89- new_sys = changeofvariables (sys, t, forward_subs, backward_subs; simplify= true )
89+ # new_sys = changeofvariables(sys, t, forward_subs, backward_subs; simplify=true)
9090
91- new_prob = ODEProblem (new_sys, [], tspan)
92- new_sol = solve (new_prob, Tsit5 ())
91+ # new_prob = ODEProblem(new_sys, [], tspan)
92+ # new_sol = solve(new_prob, Tsit5())
9393
94- # test RHS
95- new_rhs = [eq. rhs for eq in equations (new_sys)]
96- new_A = Symbolics. value .(Symbolics. jacobian (new_rhs, z))
97- A = diagm (eigen (A). values)
98- A = sortslices (A, dims= 1 )
99- new_A = sortslices (new_A, dims= 1 )
100- @test isapprox (A, new_A, rtol = 1e-10 )
101- @test isapprox ( new_sol[x[1 ],end ], sol[x[1 ],end ], rtol= 1e-4 )
94+ # # test RHS
95+ # new_rhs = [eq.rhs for eq in equations(new_sys)]
96+ # new_A = Symbolics.value.(Symbolics.jacobian(new_rhs, z))
97+ # A = diagm(eigen(A).values)
98+ # A = sortslices(A, dims=1)
99+ # new_A = sortslices(new_A, dims=1)
100+ # @test isapprox(A, new_A, rtol = 1e-10)
101+ # @test isapprox( new_sol[x[1],end], sol[x[1],end], rtol=1e-4)
102102
103103# Change of variables for sde
104104@independent_variables t
@@ -116,4 +116,15 @@ new_sys = change_of_variable_SDE(sys, t, forward_subs, backward_subs)
116116@test equations (new_sys)[1 ] == (D (y) ~ μ - 1 / 2 * σ^ 2 )
117117@test ModelingToolkit. get_noise_eqs (new_sys)[1 ] === ModelingToolkit. value (σ)
118118
119-
119+ # Multiple Brownian and equations
120+ @independent_variables t
121+ @brownian Bx By
122+ @parameters μ σ α
123+ @variables x (t) y (t) z (t) w (t) u (t) v (t)
124+ D = Differential (t)
125+ eqs = [D (x) ~ μ* x + σ* x* Bx, D (y) ~ α* By, D (u) ~ μ* u + σ* u* Bx + α* u* By]
126+ def = [x=> 0. , y=> 0. , u=> 0. , μ => 2. , σ=> 1. , α=> 3. ]
127+ @mtkcompile sys = System (eqs, t; defaults= def)
128+ forward_subs = [log (x) => z, y^ 2 => w, log (u) => v]
129+ backward_subs = [x => exp (z), y => w^ .5 , u => exp (v)]
130+ new_sys = change_of_variable_SDE (sys, t, forward_subs, backward_subs)
0 commit comments