From 187f699a8192305aed8c488046482f8f407dec3d Mon Sep 17 00:00:00 2001 From: Ivar Nesje Date: Sat, 29 Jun 2013 08:20:13 +0200 Subject: [PATCH 1/3] Fixed error in "The Quotient Rule" Differentiation of a fraction is wrong if the numerator or denominator independent of the variable differentiated with respect to. It looks like somebody forgot to divide by (denominator)^2 for the special cases where one of the derivatives is 0 --- src/differentiate.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/differentiate.jl b/src/differentiate.jl index 11aa16a..af770e2 100644 --- a/src/differentiate.jl +++ b/src/differentiate.jl @@ -105,9 +105,9 @@ function differentiate(::SymbolParameter{:/}, args, wrt) if xp == 0 && yp == 0 return 0 elseif xp == 0 - return :( -$yp * $x ) + return :( -$yp * $x / $y^2 ) elseif yp == 0 - return :( $xp * $y ) + return :( $xp / $y ) else return :( ($xp * $y - $x * $yp) / $y^2 ) end From 0d2104275f545dc450a465fee44419692ce7d4b5 Mon Sep 17 00:00:00 2001 From: ivarne Date: Sat, 29 Jun 2013 15:43:40 +0200 Subject: [PATCH 2/3] Added test of The Quotient Rule --- test/symbolic.jl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/symbolic.jl b/test/symbolic.jl index 6e4b584..1332a08 100644 --- a/test/symbolic.jl +++ b/test/symbolic.jl @@ -7,6 +7,9 @@ @assert isequal(differentiate(:(x + x), :x), 2) @assert isequal(differentiate(:(x - x), :x), 0) @assert isequal(differentiate(:(2 * x), :x), 2) +@assert isequal(differentiate(:(2 / x), :x), :(-2 / x^2)) +@assert isequal(differentiate(:(x / 2), :x), 0.5) +@assert isequal(differentiate(:(sin(x) / x), :x), :((cos(x) * x - sin(x)) / x^2)) @assert isequal(differentiate(:(x * 2), :x), 2) @assert isequal(differentiate(:(a * x), :x), :a) @assert isequal(differentiate(:(x * a), :x), :a) From 45c1d1be37d407f32bff0bd7b65b5291a57badd9 Mon Sep 17 00:00:00 2001 From: ivarne Date: Mon, 1 Jul 2013 21:17:14 +0200 Subject: [PATCH 3/3] Removed unnecessary check in differentiate{:^} --- src/differentiate.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/differentiate.jl b/src/differentiate.jl index af770e2..16aba4c 100644 --- a/src/differentiate.jl +++ b/src/differentiate.jl @@ -30,7 +30,7 @@ function differentiate(::SymbolParameter{:^}, args, wrt) yp = differentiate(y, wrt) if xp == 0 && yp == 0 return 0 - elseif xp != 0 && yp == 0 + elseif yp == 0 return :( $y * $xp * ($x ^ ($y - 1)) ) else return :( $x ^ $y * ($xp * $y / $x + $yp * log($x)) )