From d90aa897931d1b8f048dafe91448223f49c46b85 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Fri, 21 Mar 2025 09:05:18 +0100 Subject: [PATCH 1/2] added complex sum to the function _linear_expansion --- src/linear_algebra.jl | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/linear_algebra.jl b/src/linear_algebra.jl index f2e1783ef..af24341cd 100644 --- a/src/linear_algebra.jl +++ b/src/linear_algebra.jl @@ -262,6 +262,13 @@ function _linear_expansion(t::Equation, x) # t.rhs - t.lhs = 0 return (a₂ - a₁, b₂ - b₁, islinear) end + +""" +works with t of two types: +x (variable, type Num) +or +b (constant) +""" trivial_linear_expansion(t, x) = isequal(t, x) ? (1, 0, true) : (0, t, true) is_expansion_leaf(t) = !iscall(t) || (operation(t) isa Operator) @@ -294,6 +301,12 @@ function _linear_expansion(t, x) b₁ += b₂ end return (a₁, b₁, true) + elseif op === Complex{Real} + # x+2im is interpreted as Complex{Real}(x, 2) + real_part, im_part = arguments(t) + a_real, b_real, islinear_real = linear_expansion(real_part, x) + a_im, b_im, islinear_im = linear_expansion(im_part, x) + return (a_real + a_im * im, b_real + b_im * im, islinear_real && islinear_im) elseif op === (-) @assert length(args) == 1 a, b, islinear = linear_expansion(args[1], x) From 1da658767f013d75ccef498fb9d4cb613a104f85 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Sat, 22 Mar 2025 15:57:15 +0100 Subject: [PATCH 2/2] added tests for linear_expansion for input with complex numbers --- test/linear_solver.jl | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/linear_solver.jl b/test/linear_solver.jl index 684934d20..ec0d5810b 100644 --- a/test/linear_solver.jl +++ b/test/linear_solver.jl @@ -85,3 +85,22 @@ a, b, islinear = Symbolics.linear_expansion(D(x) - x, x) @variables x y @test !Symbolics.linear_expansion(x + z([x, y]), y)[3] end + +@testset "linear_expansion with imaginary numbers" begin + @variables x y + + a, b, islin = Symbolics.linear_expansion(1im*x^2 + 1im*x, x) + @test !islin + a, b, islin = Symbolics.linear_expansion(2im*x + 1im, x) + @test islin && isequal(a, 2im) && isequal(b, 1im) + a, b, islin = Symbolics.linear_expansion(1im*x + 1im*y, x) + @test islin && isequal(a, 1im) #&& isequal(b, 1im*y) + a, b, islin = Symbolics.linear_expansion(1im*x - y,x) + @test islin && isequal(a, 1im) && isequal(b, -y) + + @variables xx[1:2] yy[1:2] zz(..) + a, b, islin = Symbolics.linear_expansion(zz(1im * xx[2]) + 1im*xx[1], xx[1]) + @test islin && isequal(a, im) && isequal(b, zz(1im * xx[2])) + a, b, islin = Symbolics.linear_expansion(1im * yy[1], xx[1]) + @test islin && isequal(a, 0) # && isequal(b, yy[1]) +end \ No newline at end of file