From 2fca26b3d5d998e0ad71ffc9ae1ec44edf7770f1 Mon Sep 17 00:00:00 2001 From: schillic Date: Mon, 27 Jan 2020 17:10:24 +0100 Subject: [PATCH 1/4] tmp --- Project.toml | 1 + src/IntervalMatrices.jl | 3 +++ src/power.jl | 17 +++++++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 src/power.jl diff --git a/Project.toml b/Project.toml index a7f2851..278b7c8 100644 --- a/Project.toml +++ b/Project.toml @@ -7,6 +7,7 @@ IntervalArithmetic = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" +SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" [compat] julia = "1" diff --git a/src/IntervalMatrices.jl b/src/IntervalMatrices.jl index 36da1eb..04ead67 100644 --- a/src/IntervalMatrices.jl +++ b/src/IntervalMatrices.jl @@ -6,6 +6,8 @@ using LinearAlgebra import Random using Random: AbstractRNG, GLOBAL_RNG, seed! +import SymEngine + using Reexport @reexport using IntervalArithmetic @@ -18,6 +20,7 @@ include("matrix.jl") # Arithmetic for interval matrices # ================================= include("arithmetic.jl") +include("power.jl") # ======================================================= # Methods to handle the exponential of an interval matrix diff --git a/src/power.jl b/src/power.jl new file mode 100644 index 0000000..d61b9b1 --- /dev/null +++ b/src/power.jl @@ -0,0 +1,17 @@ +import Base: ^ + +function ^(M::IntervalMatrix{T}, k::Integer) where {T} + n = checksquare(M) +# Ms = [SymEngine.symbols("M_$(i)_$(j)") for i in 1:n, j in 1:n] + Ms = Matrix{SymEngine.Basic}(undef, n, n) + dict = Dict{SymEngine.Basic, T}() + for i in 1:n, j in 1:n + var = SymEngine.symbols("M_$(i)_$(j)") + Ms[i, j] = var + dict[var] = M[i, j] + end + println(Ms) + Msᵏ = Ms^k + Mᵏ = subs(Msᵏ, dict) + return Mᵏ +end From ab19da215f8d104aa69af60d3ec35051e8283e7f Mon Sep 17 00:00:00 2001 From: schillic Date: Mon, 27 Jan 2020 17:28:30 +0100 Subject: [PATCH 2/4] tmp --- src/power.jl | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/power.jl b/src/power.jl index d61b9b1..6c2cc42 100644 --- a/src/power.jl +++ b/src/power.jl @@ -2,16 +2,25 @@ import Base: ^ function ^(M::IntervalMatrix{T}, k::Integer) where {T} n = checksquare(M) -# Ms = [SymEngine.symbols("M_$(i)_$(j)") for i in 1:n, j in 1:n] + + # create symbolic matrix Ms = Matrix{SymEngine.Basic}(undef, n, n) - dict = Dict{SymEngine.Basic, T}() + dict = Dict{SymEngine.Basic, Interval{T}}() for i in 1:n, j in 1:n var = SymEngine.symbols("M_$(i)_$(j)") Ms[i, j] = var dict[var] = M[i, j] end - println(Ms) + + # compute symbolic matrix power Msᵏ = Ms^k - Mᵏ = subs(Msᵏ, dict) + + # substitute intervals in symbolic result + Mᵏ = similar(M) + for i in 1:n, j in 1:n + println(Msᵏ[i, j]) + println(dict) + Mᵏ[i, j] = SymEngine.subs(Msᵏ[i, j], dict) + end return Mᵏ end From 0ac80aaf4c11cb53367f20b87dce9c3e9793f80b Mon Sep 17 00:00:00 2001 From: schillic Date: Mon, 27 Jan 2020 17:53:12 +0100 Subject: [PATCH 3/4] tmp --- src/power.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/power.jl b/src/power.jl index 6c2cc42..5e75871 100644 --- a/src/power.jl +++ b/src/power.jl @@ -20,7 +20,8 @@ function ^(M::IntervalMatrix{T}, k::Integer) where {T} for i in 1:n, j in 1:n println(Msᵏ[i, j]) println(dict) - Mᵏ[i, j] = SymEngine.subs(Msᵏ[i, j], dict) + substituted = SymEngine.subs(Msᵏ[i, j], dict) + Mᵏ[i, j] = SymEngine.lambdify(substituted) end return Mᵏ end From 47b88e9ba9f6cf420e8e2f529a2a0d29e8fb8b42 Mon Sep 17 00:00:00 2001 From: schillic Date: Mon, 27 Jan 2020 18:04:48 +0100 Subject: [PATCH 4/4] tmp --- src/power.jl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/power.jl b/src/power.jl index 5e75871..b87953e 100644 --- a/src/power.jl +++ b/src/power.jl @@ -6,10 +6,12 @@ function ^(M::IntervalMatrix{T}, k::Integer) where {T} # create symbolic matrix Ms = Matrix{SymEngine.Basic}(undef, n, n) dict = Dict{SymEngine.Basic, Interval{T}}() + dict2 = Dict{SymEngine.Basic, T}() for i in 1:n, j in 1:n var = SymEngine.symbols("M_$(i)_$(j)") Ms[i, j] = var dict[var] = M[i, j] + dict2[var] = mid(M[i, j]) end # compute symbolic matrix power @@ -18,10 +20,12 @@ function ^(M::IntervalMatrix{T}, k::Integer) where {T} # substitute intervals in symbolic result Mᵏ = similar(M) for i in 1:n, j in 1:n - println(Msᵏ[i, j]) - println(dict) - substituted = SymEngine.subs(Msᵏ[i, j], dict) - Mᵏ[i, j] = SymEngine.lambdify(substituted) + expr = Msᵏ[i, j] +# for (k, v) in dict +# expr = SymEngine.subs(expr, k, mid(v)) +# end + expr = SymEngine.subs(expr, dict2...) + Mᵏ[i, j] = SymEngine.lambdify(expr) end return Mᵏ end