Skip to content

Commit d0cccbb

Browse files
Fix bug that Miles caught and fix tests.
1 parent 2274b91 commit d0cccbb

File tree

2 files changed

+37
-36
lines changed

2 files changed

+37
-36
lines changed

src/differentiate.jl

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ for (funsym, exp) in derivative_rules
185185
@eval function differentiate(::SymbolParameter{$(Meta.quot(funsym))}, args, wrt)
186186
x = args[1]
187187
xp = differentiate(x, wrt)
188-
if x != 0
188+
if xp != 0
189189
return @sexpr($exp)
190190
else
191191
return 0
@@ -208,7 +208,7 @@ for (funsym, exp) in derivative_rules_bessel
208208
nu = args[1]
209209
x = args[2]
210210
xp = differentiate(x, wrt)
211-
if x != 0
211+
if xp != 0
212212
return @sexpr($exp)
213213
else
214214
return 0
@@ -222,3 +222,32 @@ end
222222
## atan2
223223
## hypot
224224
## beta, lbeta, eta, zeta, digamma
225+
226+
function differentiate(ex::Expr, targets::Vector{Symbol})
227+
n = length(targets)
228+
exprs = Array(Expr, n)
229+
for i in 1:n
230+
exprs[i] = differentiate(ex, targets[i])
231+
end
232+
return exprs
233+
end
234+
235+
236+
differentiate(ex::Expr) = differentiate(ex, :x)
237+
238+
function differentiate(s::String, target::Symbol)
239+
differentiate(parse(s), target)
240+
end
241+
function differentiate(s::String, targets::Vector{Symbol})
242+
differentiate(parse(s), targets)
243+
end
244+
function differentiate(s::String, target::String)
245+
differentiate(parse(s), symbol(target))
246+
end
247+
function differentiate{T <: String}(s::String, targets::Vector{T})
248+
differentiate(parse(s), map(target -> symbol(target), targets))
249+
end
250+
function differentiate(s::String)
251+
differentiate(parse(s), :x)
252+
end
253+

test/symbolic.jl

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
#
4545

4646
# @assert isequal(differentiate("sin(x) + cos(x)^2"), :(+(cos(x),*(2,cos(x)))))
47-
@assert isequal(differentiate("x + exp(-x) + sin(exp(x))", :x), :(+(1, *(exp(-(x)), -1), *(cos(exp(x)), exp(x)))))
47+
@assert isequal(differentiate("x + exp(-x) + sin(exp(x))", :x), :(+(1,*(-1,exp(-(x))),*(exp(x),cos(exp(x))))))
4848

4949
# TODO: Make these work
5050
# differentiate(:(sin(x)), :x)(0.0)
@@ -60,42 +60,14 @@ y = BasicVariable(:y)
6060

6161
@assert isequal(@sexpr(x + y), :($x + $y))
6262
@assert isequal(differentiate(@sexpr(3 * x), x), 3)
63-
@assert isequal(differentiate(:(sin(sin(x))), :x), :(*(cos(sin(x)),cos(x))))
64-
@assert isequal(differentiate(@sexpr(sin(sin(x))), x), :(*(cos(sin($x)),cos($x))))
63+
@assert isequal(differentiate(:(sin(sin(x))), :x), :(*(cos(x),cos(sin(x)))))
64+
@assert isequal(differentiate(@sexpr(sin(sin(x))), x), :(*(cos($x),cos(sin($x)))))
6565

6666
function testfun(x)
6767
z = BasicVariable(:z)
6868
differentiate(@sexpr(3*x + x^2*z), z)
6969
end
7070

71-
@assert isequal(testfun(x), :(*(1,^($(x),2))))
72-
@assert isequal(testfun(3), :(*(1,^(3,2))))
73-
@assert isequal(testfun(@sexpr(x+y)), :(*(1,^(+($(x),$(y)),2))))
74-
75-
differentiate(:(2), :x)
76-
differentiate(:(x), :x)
77-
differentiate(:(x + x), :x)
78-
differentiate(:(x - x), :x)
79-
differentiate(:(2 * x), :x)
80-
differentiate(:(x * 2), :x)
81-
differentiate(:(a * x), :x)
82-
differentiate(:(x * a), :x)
83-
differentiate(:(x ^ 2), :x)
84-
differentiate(:(a * x ^ 2), :x)
85-
differentiate(:(2 ^ x), :x)
86-
differentiate(:(sin(x)), :x)
87-
differentiate(:(cos(x)), :x)
88-
differentiate(:(tan(x)), :x)
89-
differentiate(:(exp(x)), :x)
90-
differentiate(:(log(x)), :x)
91-
differentiate(:(sin(x) + sin(x)), :x)
92-
differentiate(:(sin(x) - cos(x)), :x)
93-
differentiate(:(x * sin(x)), :x)
94-
differentiate(:(x / sin(x)), :x)
95-
differentiate(:(sin(sin(x))), :x)
96-
differentiate(:(sin(cos(x) + sin(x))), :x)
97-
differentiate(:(exp(-x)), :x)
98-
differentiate(:(log(x^2)), :x)
99-
differentiate(:(x^n), :x)
100-
differentiate(:(n^x), :x)
101-
differentiate(:(n^n), :x)
71+
@assert isequal(testfun(x), :(^($(x),2)))
72+
@assert isequal(testfun(3), 9)
73+
@assert isequal(testfun(@sexpr(x+y)), :(^(+($x,$y),2)))

0 commit comments

Comments
 (0)