From dfa26ad91f1c10556f5d97007f94342f2cb495a8 Mon Sep 17 00:00:00 2001 From: Yuriy Skalko Date: Thu, 24 Oct 2013 13:56:44 +0300 Subject: [PATCH 1/2] Combine terms in multiplication and addition. --- src/symbolic.jl | 6 ++++++ test/symbolic.jl | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/symbolic.jl b/src/symbolic.jl index 35fa41d..1425f8f 100644 --- a/src/symbolic.jl +++ b/src/symbolic.jl @@ -138,6 +138,9 @@ function simplify(::SymbolParameter{:+}, args) # Special Case: simplify(:(+x)) == x elseif length(args) == 1 return args[1] + # Special Case: simplify(:(x + x + x)) == 3*x + elseif all(args .== args[1]) + return Expr(:call, :*, args[1], length(args)) else (sum, sym_args) = sum_numeric_args(args) args = sum==0 ? sym_args : [sum, sym_args] @@ -171,6 +174,9 @@ function simplify(::SymbolParameter{:*}, args) # Special Case: simplify(:(x * y * z * 0)) == 0 elseif any(args .== 0) return 0 + # Special Case: simplify(:(x * x * x * x)) == x^4 + elseif all(args .== args[1]) + return Expr(:call, :^, args[1], length(args)) else (prod, sym_args) = mul_numeric_args(args) args = prod==1 ? sym_args : [prod, sym_args] diff --git a/test/symbolic.jl b/test/symbolic.jl index d6fae32..32874bd 100644 --- a/test/symbolic.jl +++ b/test/symbolic.jl @@ -21,7 +21,7 @@ @test isequal(differentiate(:(tan(x)), :x), :(1 + tan(x)^2)) @test isequal(differentiate(:(exp(x)), :x), :(exp(x))) @test isequal(differentiate(:(log(x)), :x), :(1 / x)) -@test isequal(differentiate(:(sin(x) + sin(x)), :x), :(cos(x) + cos(x))) +@test isequal(differentiate(:(sin(x) + sin(x)), :x), :(2*cos(x))) @test isequal(differentiate(:(sin(x) - cos(x)), :x), :(-(cos(x),*(-1,sin(x))))) # Simplify -(a, -(b)) => +(a, b) @test isequal(differentiate(:(x * sin(x)), :x), :(sin(x) + x * cos(x))) @test isequal(differentiate(:(x / sin(x)), :x), :((sin(x) - x * cos(x)) / (sin(x)^2))) @@ -88,3 +88,7 @@ end @test isequal(simplify(:(x*3)), :(*(3,x))) @test isequal(simplify(:(x*3*4)), :(*(12,x))) @test isequal(simplify(:(2*y*x*3)), :(*(6,y,x))) + +@test isequal(simplify(:(x*x*x)), :(x^3)) +@test isequal(simplify(:(x+x+x)), :(3*x)) +@test isequal(simplify(:(f(x,y)+f(x,y))), :(2*f(x,y))) From 357d5f2c9f54ab460ac54f24a4f4e41253b127fc Mon Sep 17 00:00:00 2001 From: Yuriy Skalko Date: Fri, 25 Oct 2013 15:22:12 +0300 Subject: [PATCH 2/2] Uncomment test that passes now --- test/symbolic.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/symbolic.jl b/test/symbolic.jl index 32874bd..ef8e65f 100644 --- a/test/symbolic.jl +++ b/test/symbolic.jl @@ -32,6 +32,7 @@ @test isequal(differentiate(:(x^n), :x), :(*(n, ^(x, -(n, 1))))) @test isequal(differentiate(:(n^x), :x), :(*(^(n, x), log(n)))) @test isequal(differentiate(:(n^n), :x), 0) +@test isequal(differentiate(:(sin(x)^2), :x), :(2 * cos(x) * sin(x))) # # Multivariate Calculus @@ -39,9 +40,6 @@ @test isequal(differentiate(:(sin(x) + sin(y)), [:x, :y]), [:(cos(x)), :(cos(y))]) -# TODO: Get the generalized power rule right. -# @test isequal(differentiate(:(sin(x)^2), :x), :(2 * sin(x) * cos(x))) - # # Strings instead of symbols #