Skip to content

Commit c0453f4

Browse files
author
fchen121
committed
Change of variable for non-simplified SDE
1 parent 8140b62 commit c0453f4

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

src/systems/diffeqs/basic_transformations.jl

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,6 @@ function changeofvariables(
9898
sys::System, iv, forward_subs, backward_subs;
9999
simplify=true, t0=missing, isSDE=false
100100
)
101-
if !iscomplete(sys)
102-
sys = mtkcompile(sys)
103-
end
104101
t = iv
105102

106103
old_vars = first.(backward_subs)
@@ -110,15 +107,32 @@ function changeofvariables(
110107
# use: dY = (∂f/∂t + μ∂f/∂x + (1/2)*σ^2*∂2f/∂x2)dt + σ∂f/∂xdW
111108
old_eqs = equations(sys)
112109
neqs = get_noise_eqs(sys)
113-
if neqs !== nothing
110+
brownvars = brownians(sys)
111+
112+
113+
if neqs === nothing && length(brownvars) === 0
114+
neqs = ones(1, length(old_eqs))
115+
elseif neqs !== nothing
114116
isSDE = true
115117
neqs = [neqs[i,:] for i in 1:size(neqs,1)]
116118

117119
brownvars = map([Symbol(:B, :_, i) for i in 1:length(neqs[1])]) do name
118120
unwrap(only(@brownian $name))
119121
end
120122
else
121-
neqs = ones(1, length(old_eqs))
123+
isSDE = true
124+
neqs = Vector{Any}[]
125+
for (i, eq) in enumerate(old_eqs)
126+
neq = Any[]
127+
right = eq.rhs
128+
for Bv in brownvars
129+
lin_exp = linear_expansion(right, Bv)
130+
right = lin_exp[2]
131+
push!(neq, lin_exp[1])
132+
end
133+
push!(neqs, neq)
134+
old_eqs[i] = eq.lhs ~ right
135+
end
122136
end
123137

124138
# df/dt = ∂f/∂x dx/dt + ∂f/∂t

test/changeofvariables.jl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,10 @@ new_sys = changeofvariables(sys, t, forward_subs, backward_subs)
127127
D = Differential(t)
128128
eqs = [D(x) ~ μ*x + σ*x*Bx, D(y) ~ α*By, D(u) ~ μ*u + σ*u*Bx + α*u*By]
129129
def = [x=>0., y=> 0., u=>0., μ => 2., σ=>1., α=>3.]
130-
@mtkcompile sys = System(eqs, t; defaults=def)
131130
forward_subs = [log(x) => z, y^2 => w, log(u) => v]
132131
backward_subs = [x => exp(z), y => w^.5, u => exp(v)]
132+
133+
@mtkcompile sys = System(eqs, t; defaults=def)
133134
new_sys = changeofvariables(sys, t, forward_subs, backward_subs)
134135
@test equations(new_sys)[1] == (D(z) ~ μ - 1/2*σ^2)
135136
@test equations(new_sys)[2] == (D(w) ~ α^2)
@@ -139,4 +140,11 @@ new_sys = changeofvariables(sys, t, forward_subs, backward_subs)
139140
@test noise_eqs(new_sys)[2,1] === value(0)
140141
@test noise_eqs(new_sys)[2,2] === value(substitute(2*α*y, backward_subs[2]))
141142
@test noise_eqs(new_sys)[3,1] === value(σ)
142-
@test noise_eqs(new_sys)[3,2] === value(α)
143+
@test noise_eqs(new_sys)[3,2] === value(α)
144+
145+
# Test for Brownian instead of noise
146+
@named sys = System(eqs, t; defaults=def)
147+
new_sys = changeofvariables(sys, t, forward_subs, backward_subs; simplify=false)
148+
@test simplify(equations(new_sys)[1]) == simplify((D(z) ~ μ - 1/2*σ^2 + σ*Bx))
149+
@test simplify(equations(new_sys)[2]) == simplify((D(w) ~ α^2 + 2*α*w^.5*By))
150+
@test simplify(equations(new_sys)[3]) == simplify((D(v) ~ μ - 1/2*^2 + σ^2) + σ*Bx + α*By))

0 commit comments

Comments
 (0)