Skip to content

Commit b5dc2ea

Browse files
fix: create specialized isdiag for symbolics in noise matrix
1 parent 9b7e139 commit b5dc2ea

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

src/systems/diffeqs/sdesystem.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,13 +244,20 @@ function Base.:(==)(sys1::SDESystem, sys2::SDESystem)
244244
all(s1 == s2 for (s1, s2) in zip(get_systems(sys1), get_systems(sys2)))
245245
end
246246

247+
function __num_isdiag(mat)
248+
for i in axes(mat, 1), j in axes(mat, 2)
249+
i == j || isequal(mat[i, j], 0) || return false
250+
end
251+
return true
252+
end
253+
247254
function generate_diffusion_function(sys::SDESystem, dvs = unknowns(sys),
248255
ps = full_parameters(sys); isdde = false, kwargs...)
249256
eqs = get_noiseeqs(sys)
250257
if isdde
251258
eqs = delay_to_function(sys, eqs)
252259
end
253-
if eqs isa AbstractMatrix && isdiag(eqs)
260+
if eqs isa AbstractMatrix && __num_isdiag(eqs)
254261
eqs = diag(eqs)
255262
end
256263
u = map(x -> time_varying_as_func(value(x), sys), dvs)

test/sdesystem.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,3 +722,29 @@ let # test that diagonal noise is correctly handled
722722
# SOSRI only works for diagonal and scalar noise
723723
@test solve(prob, SOSRI()).retcode == ReturnCode.Success
724724
end
725+
726+
@testset "Non-diagonal noise check" begin
727+
@parameters σ ρ β
728+
@variables x(t) y(t) z(t)
729+
@brownian a b c
730+
eqs = [D(x) ~ σ * (y - x) + 0.1a * x + 0.1b * y,
731+
D(y) ~ x *- z) - y + 0.1b * y,
732+
D(z) ~ x * y - β * z + 0.1c * z]
733+
@mtkbuild de = System(eqs, t)
734+
735+
u0map = [
736+
x => 1.0,
737+
y => 0.0,
738+
z => 0.0
739+
]
740+
741+
parammap = [
742+
σ => 10.0,
743+
β => 26.0,
744+
ρ => 2.33
745+
]
746+
747+
prob = SDEProblem(de, u0map, (0.0, 100.0), parammap)
748+
# SOSRI only works for diagonal and scalar noise
749+
@test solve(prob, ImplicitEM()).retcode == ReturnCode.Success
750+
end

0 commit comments

Comments
 (0)