@@ -2375,6 +2375,44 @@ def derivative(self, ex, operator):
2375
2375
else :
2376
2376
return operator (* [self (_ ) for _ in ex .operands ()])
2377
2377
2378
+ # Half_angle transformation. Sometimes useful in integration
2379
+
2380
+ class HalfAngle (ExpressionTreeWalker ):
2381
+ # Code executed once at first class reference : create canned formulae.
2382
+ from sage .functions .hyperbolic import sinh , cosh , sech , csch , tanh , coth
2383
+ from sage .functions .trig import sin , cos , sec , csc , tan , cot
2384
+ from sage .rings .integer import Integer
2385
+ from sage .calculus .var import function
2386
+ from sage .symbolic .ring import SR
2387
+ x = SR .var ("x" )
2388
+ HalvesDict = {
2389
+ sin : Integer (2 )* tan (Integer (1 )/ Integer (2 )* x )/ (tan (Integer (1 )/ Integer (2 )* x )** Integer (2 ) + Integer (1 )).function (x ),
2390
+ cos : - (tan (Integer (1 )/ Integer (2 )* x )** Integer (2 ) - Integer (1 ))/ (tan (Integer (1 )/ Integer (2 )* x )** Integer (2 ) + Integer (1 )).function (x ),
2391
+ tan : - Integer (2 )* tan (Integer (1 )/ Integer (2 )* x )/ (tan (Integer (1 )/ Integer (2 )* x )** Integer (2 ) - Integer (1 )).function (x ),
2392
+ csc : Integer (1 )/ Integer (2 )* (tan (Integer (1 )/ Integer (2 )* x )** Integer (2 ) + Integer (1 ))/ tan (Integer (1 )/ Integer (2 )* x ).function (x ),
2393
+ sec : - (tan (Integer (1 )/ Integer (2 )* x )** Integer (2 ) + Integer (1 ))/ (tan (Integer (1 )/ Integer (2 )* x )** Integer (2 ) - Integer (1 )).function (x ),
2394
+ cot : - Integer (1 )/ Integer (2 )* (tan (Integer (1 )/ Integer (2 )* x )** Integer (2 ) - Integer (1 ))/ tan (Integer (1 )/ Integer (2 )* x ).function (x ),
2395
+ sinh : - Integer (2 )* tanh (Integer (1 )/ Integer (2 )* x )/ (tanh (Integer (1 )/ Integer (2 )* x )** Integer (2 ) - Integer (1 )).function (x ),
2396
+ cosh : - (tanh (Integer (1 )/ Integer (2 )* x )** Integer (2 ) + Integer (1 ))/ (tanh (Integer (1 )/ Integer (2 )* x )** Integer (2 ) - Integer (1 )).function (x ),
2397
+ tanh : Integer (2 )* tanh (Integer (1 )/ Integer (2 )* x )/ (tanh (Integer (1 )/ Integer (2 )* x )** Integer (2 ) + Integer (1 )).function (x ),
2398
+ csch : - Integer (1 )/ Integer (2 )* (tanh (Integer (1 )/ Integer (2 )* x )** Integer (2 ) - Integer (1 ))/ tanh (Integer (1 )/ Integer (2 )* x ).function (x ),
2399
+ sech : - (tanh (Integer (1 )/ Integer (2 )* x )** Integer (2 ) - Integer (1 ))/ (tanh (Integer (1 )/ Integer (2 )* x )** Integer (2 ) + Integer (1 )).function (x ),
2400
+ coth : Integer (1 )/ Integer (2 )* (tanh (Integer (1 )/ Integer (2 )* x )** Integer (2 ) + Integer (1 ))/ tanh (Integer (1 )/ Integer (2 )* x ).function (x )
2401
+ }
2402
+ Halves = list (HalvesDict .keys ())
2403
+ def __init__ (self , ex ):
2404
+ """
2405
+ TODO
2406
+ """
2407
+ self .ex = ex
2408
+ def composition (self , ex , op ):
2409
+ """
2410
+ TODO
2411
+ """
2412
+ if op in self .Halves :
2413
+ return self .HalvesDict .get (op )(* [self (_ ) for _ in ex .operands ()])
2414
+ return super (HalfAngle , self ).composition (ex , op )
2415
+
2378
2416
class HoldRemover (ExpressionTreeWalker ):
2379
2417
def __init__ (self , ex , exclude = None ):
2380
2418
"""
0 commit comments