22# Univariate Calculus
33#
44
5+ macro test_simplified_isequal (lhs, rhs)
6+ quote
7+ @test isequal (simplify ($ (esc (lhs))), $ (esc (rhs)))
8+ end
9+ end
10+
511@test isequal (differentiate (:(2 ), :x ), 0 )
612@test isequal (differentiate (:(x), :x ), 1 )
7- @test isequal ( differentiate (:(x + x), :x ), 2 )
8- @test isequal ( differentiate (:(x - x), :x ), 0 )
9- @test isequal ( differentiate (:(2 * x), :x ), 2 )
10- @test isequal ( differentiate (:(2 / x), :x ), :(- 2 / x^ 2 ) )
11- @test isequal ( differentiate (:(x / 2 ), :x ), 0.5 )
12- @test isequal ( differentiate (:(sin (x) / x), :x ), :((cos (x) * x - sin (x)) / x^ 2 ) )
13- @test isequal ( differentiate (:(x * 2 ), :x ), 2 )
14- @test isequal ( differentiate (:(a * x), :x ), :a )
15- @test isequal ( differentiate (:(x * a), :x ), :a )
16- @test isequal ( differentiate (:(x ^ 2 ), :x ), :(2 * x) )
17- @test isequal ( differentiate (:(a * x ^ 2 ), :x ), :(a * (2 * x) ))
18- @test isequal ( differentiate (:(2 ^ x), :x ), :(* (0.6931471805599453 , ^ (2 , x) )))
19- @test isequal ( differentiate (:(sin (x)), :x ), :(cos (x) ))
20- @test isequal ( differentiate (:(cos (x)), :x ), :(- sin (x) ))
21- @test isequal ( differentiate (:(tan (x)), :x ), :(1 + tan (x)^ 2 ) )
22- @test isequal ( differentiate (:(exp (x)), :x ), :(exp (x) ))
23- @test isequal ( differentiate (:(log (x)), :x ), :(1 / x) )
24- @test isequal ( differentiate (:(sin (x) + sin (x)), :x ), :(cos (x) + cos (x) ))
25- @test isequal ( differentiate (:(sin (x) - cos (x)), :x ), :(cos (x) + sin (x) ))
26- @test isequal ( differentiate (:(x * sin (x)), :x ), :(sin (x) + x * cos (x) ))
27- @test isequal ( differentiate (:(x / sin (x)), :x ), :((sin (x) - x * cos (x)) / (sin (x)^ 2 ) ))
28- @test isequal ( differentiate (:(sin (sin (x))), :x ), :(* (cos (x),cos (sin (x) ))))
29- @test isequal ( differentiate (:(sin (cos (x) + sin (x))), :x ), :(* (+ (- sin (x),cos (x)),cos (+ (cos (x),sin (x) )))))
30- @test isequal ( differentiate (:(exp (- x)), :x ), :(- exp (- x) ))
31- @test isequal ( differentiate (:(log (x^ 2 )), :x ), :((2 x) * (1 / x^ 2 ) ))
32- @test isequal ( differentiate (:(abs2 (x)), :x ), :(2 x) )
33- @test isequal ( differentiate (:(inv (x)), :x ), :(- abs2 (inv (x) )))
34- @test isequal ( differentiate (:(x^ n), :x ), :(* (n, ^ (x, - (n, 1 ) ))))
35- @test isequal ( differentiate (:(n^ x), :x ), :(* (^ (n, x), log (n) )))
36- @test isequal ( differentiate (:(n^ n), :x ), 0 )
13+ @test_simplified_isequal differentiate (:(x + x), :x ) 2
14+ @test_simplified_isequal differentiate (:(x - x), :x ) 0
15+ @test_simplified_isequal differentiate (:(2 * x), :x ) 2
16+ @test_simplified_isequal differentiate (:(2 / x), :x ) :(- 2 / x^ 2 )
17+ @test_simplified_isequal differentiate (:(x / 2 ), :x ) 0.5
18+ @test_simplified_isequal differentiate (:(sin (x) / x), :x ) :((cos (x) * x - sin (x)) / x^ 2 )
19+ @test_simplified_isequal differentiate (:(x * 2 ), :x ) 2
20+ @test_simplified_isequal differentiate (:(a * x), :x ) :a
21+ @test_simplified_isequal differentiate (:(x * a), :x ) :a
22+ @test_simplified_isequal differentiate (:(x ^ 2 ), :x ) :(2 * x)
23+ @test_simplified_isequal differentiate (:(a * x ^ 2 ), :x ) :(a * (2 * x))
24+ @test_simplified_isequal differentiate (:(2 ^ x), :x ) :(* (0.6931471805599453 , ^ (2 , x)))
25+ @test_simplified_isequal differentiate (:(sin (x)), :x ) :(cos (x))
26+ @test_simplified_isequal differentiate (:(cos (x)), :x ) :(- sin (x))
27+ @test_simplified_isequal differentiate (:(tan (x)), :x ) :(1 + tan (x)^ 2 )
28+ @test_simplified_isequal differentiate (:(exp (x)), :x ) :(exp (x))
29+ @test_simplified_isequal differentiate (:(log (x)), :x ) :(1 / x)
30+ @test_simplified_isequal differentiate (:(sin (x) + sin (x)), :x ) :(cos (x) + cos (x))
31+ @test_simplified_isequal differentiate (:(sin (x) - cos (x)), :x ) :(cos (x) + sin (x))
32+ @test_simplified_isequal differentiate (:(x * sin (x)), :x ) :(sin (x) + x * cos (x))
33+ @test_simplified_isequal differentiate (:(x / sin (x)), :x ) :((sin (x) - x * cos (x)) / (sin (x)^ 2 ))
34+ @test_simplified_isequal differentiate (:(sin (sin (x))), :x ) :(* (cos (x),cos (sin (x))))
35+ @test_simplified_isequal differentiate (:(sin (cos (x) + sin (x))), :x ) :(* (+ (- sin (x),cos (x)),cos (+ (cos (x),sin (x)))))
36+ @test_simplified_isequal differentiate (:(exp (- x)), :x ) :(- exp (- x))
37+ @test_simplified_isequal differentiate (:(log (x^ 2 )), :x ) :((2 x) * (1 / x^ 2 ))
38+ @test_simplified_isequal differentiate (:(abs2 (x)), :x ) :(2 x)
39+ @test_simplified_isequal differentiate (:(inv (x)), :x ) :(- abs2 (inv (x)))
40+ @test_simplified_isequal differentiate (:(x^ n), :x ) :(* (n, ^ (x, - (n, 1 ))))
41+ @test_simplified_isequal differentiate (:(n^ x), :x ) :(* (^ (n, x), log (n)))
42+ @test_simplified_isequal differentiate (:(n^ n), :x ) 0
3743
3844#
3945# Multivariate Calculus
4046#
4147
42- @test isequal (differentiate (:(sin (x) + sin (y)), [:x , :y ]), [:(cos (x)), :(cos (y))])
43- @test isequal (differentiate (:(x^ 2 ), [:x , :y ]), Any[:(2 * x), 0 ])
48+ @test isequal (simplify .( differentiate (:(sin (x) + sin (y)), [:x , :y ]) ), [:(cos (x)), :(cos (y))])
49+ @test isequal (simplify .( differentiate (:(x^ 2 ), [:x , :y ]) ), Any[:(2 * x), 0 ])
4450
4551# TODO : Get the generalized power rule right.
4652# @test isequal(differentiate(:(sin(x)^2), :x), :(2 * sin(x) * cos(x)))
5056#
5157
5258# @test isequal(differentiate("sin(x) + cos(x)^2"), :(+(cos(x),*(2,cos(x)))))
53- @test isequal ( differentiate (" x + exp(-x) + sin(exp(x))" , :x ), :(+ (1 ,- exp (- x),* (exp (x),cos (exp (x) )))))
59+ @test_simplified_isequal differentiate (" x + exp(-x) + sin(exp(x))" , :x ) :(+ (1 ,- exp (- x),* (exp (x),cos (exp (x)))))
5460
5561# TODO : Make these work
5662# differentiate(:(sin(x)), :x)(0.0)
@@ -65,13 +71,13 @@ x = BasicVariable(:x)
6571y = BasicVariable (:y )
6672
6773@test isequal (@sexpr (x + y), :($ x + $ y))
68- @test isequal ( differentiate (@sexpr (3 * x), x), 3 )
69- @test isequal ( differentiate (:(sin (sin (x))), :x ), :(* (cos (x),cos (sin (x) ))))
70- @test isequal ( differentiate (@sexpr (sin (sin (x))), x), :(* (cos ($ x),cos (sin ($ x) ))))
74+ @test_simplified_isequal differentiate (@sexpr (3 * x), x) 3
75+ @test_simplified_isequal differentiate (:(sin (sin (x))), :x ) :(* (cos (x),cos (sin (x))))
76+ @test_simplified_isequal differentiate (@sexpr (sin (sin (x))), x) :(* (cos ($ x),cos (sin ($ x))))
7177
7278function testfun (x)
7379 z = BasicVariable (:z )
74- differentiate (@sexpr (3 * x + x^ 2 * z), z)
80+ simplify ( differentiate (@sexpr (3 * x + x^ 2 * z), z) )
7581end
7682
7783@test isequal (testfun (x), :(^ ($ (x),2 )))
100106#
101107# Tests with ifelse
102108#
103- @test isequal (differentiate (:(ifelse (x < 1 , exp (x^ 2 ), 1 / x)), :x ), :(ifelse (x < 1 ,2 x * exp (x^ 2 ), - 1 / x^ 2 )))
104- @test isequal (differentiate (:(ifelse (x <= 0 , 0 , ifelse (x > 1 , 1 , x))), :x ),
105- :(ifelse (x <= 0 , 0 , ifelse (x > 1 , 0 , 1 ))))
109+ @test_simplified_isequal differentiate (:(ifelse (x < 1 , exp (x^ 2 ), 1 / x)), :x ) :(ifelse (x < 1 ,2 x * exp (x^ 2 ), - 1 / x^ 2 ))
110+ @test_simplified_isequal differentiate (:(ifelse (x <= 0 , 0 , ifelse (x > 1 , 1 , x))), :x ) :(ifelse (x <= 0 , 0 , ifelse (x > 1 , 0 , 1 )))
0 commit comments