#!/usr/bin/env python # coding: utf-8 # # Simplification # In[ ]: from sympy import * x, y, z = symbols('x y z') init_printing() # For each exercise, fill in the function according to its docstring. # ## Polynomial/Rational Function Simplification # In each exercise, apply specific simplification functions to get the desired result. # In[ ]: def polysimp1(expr): """ >>> polysimp1(cos(x)*sin(x) + cos(x)) (sin(x) + 1)*cos(x) >>> polysimp1(cos(x)*sin(x) + cos(x) + 1) (sin(x) + 1)*cos(x) + 1 """ # In[ ]: polysimp1(cos(x)*sin(x) + cos(x)) # In[ ]: polysimp1(cos(x)*sin(x) + cos(x) + 1) # In[ ]: def polysimp2(expr): """ >>> polysimp2((2*x + 1)/(x**2 + x)) 1/(x + 1) + 1/x >>> polysimp2((x**2 + 3*x + 1)/(x**3 + 2*x**2 + x)) 1/(x**2 + 2*x + 1) + 1/x """ # In[ ]: polysimp2((2*x + 1)/(x**2 + x)) # In[ ]: polysimp2((x**2 + 3*x + 1)/(x**3 + 2*x**2 + x)) # ## Powers # In each exercise, apply specific simplification functions to get the desired result. # In[ ]: def powersimp1(expr): """ >>> powersimp1(exp(x)*(exp(y) + 1)) exp(x) + exp(x + y) """ # In[ ]: powersimp1(exp(x)*(exp(y) + 1)) # In[ ]: def powersimp2(expr): """ >>> powersimp2(2**x*x**x) (2*x)**x >>> powersimp2(x**x*x**x) (x**2)**x """ # In[ ]: powersimp2(2**x*x**x) # In[ ]: powersimp2(x**x*x**x) # In[ ]: def powersimp3(expr): """ >>> a, b, c = symbols('a b c') >>> powersimp3((a**b)**c) a**(b*c) >>> powersimp3((a**b)**(c + 1)) a**(b*c + b) """ # In[ ]: a, b, c = symbols('a b c') # In[ ]: powersimp3((a**b)**c) # In[ ]: powersimp3((a**b)**(c + 1)) # ## Logs # In[ ]: def logsimp1(expr): """ >>> a, b = symbols('a b', positive=True) >>> logsimp1(log(x**y*a**b)) y*log(x) + log(a**b) >>> logsimp1(log(x*y*a*b)) log(x) + log(y) + log(a*b) """ # In[ ]: a, b = symbols('a b', positive=True) # In[ ]: logsimp1(log(x**y*a**b)) # In[ ]: logsimp1(log(x*y*a*b)) # ## Miscellaneous # In[ ]: def miscsimp1(expr): """ >>> miscsimp1(sin(x + y)) 2*(-tan(x/2)**2 + 1)*tan(y/2)/((tan(x/2)**2 + 1)*(tan(y/2)**2 + 1)) + 2*(-tan(y/2)**2 + 1)*tan(x/2)/((tan(x/2)**2 + 1)*(tan(y/2)**2 + 1)) """ # In[ ]: miscsimp1(sin(x + y)) # In[ ]: def miscsimp2(expr): """ >>> miscsimp2(gamma(x + 4)) x**4*gamma(x) + 6*x**3*gamma(x) + 11*x**2*gamma(x) + 6*x*gamma(x) """ # In[ ]: miscsimp2(gamma(x + 4)) # ## Continued Fractions # If we do not cover this, see http://asmeurer.github.io/scipy-2014-tutorial/html/tutorial/simplification.html#example-continued-fractions. # In[ ]: def list_to_frac(l): expr = Integer(0) for i in reversed(l[1:]): expr += i expr = 1/expr return l[0] + expr # In[ ]: a0, a1, a2, a3, a4 = symbols('a0:5') # Determine the list used to create the continued fraction $$\frac{a_{0} a_{1} a_{2} a_{3} a_{4} + a_{0} a_{1} a_{2} + a_{0} a_{3} a_{4} + a_{0} + a_{1} a_{2} a_{3} + a_{1} a_{3} a_{4} + a_{1} + a_{3}}{a_{0} a_{1} a_{2} a_{4} + a_{0} a_{4} + a_{1} a_{2} + a_{1} a_{4} + 1}.$$ # In[ ]: def continued_frac(): """ Determine the original list used to create the fraction. Return the original list from this function. >>> orig_frac = (a0*a1*a2*a3*a4 + a0*a1*a2 + a0*a3*a4 + a0 + a1*a2*a3 + a1*a3*a4 + a1 + a3)/(a0*a1*a2*a4 + a0*a4 + a1*a2 + a1*a4 + 1) >>> pprint(orig_frac) a₀⋅a₁⋅a₂⋅a₃⋅a₄ + a₀⋅a₁⋅a₂ + a₀⋅a₃⋅a₄ + a₀ + a₁⋅a₂⋅a₃ + a₁⋅a₃⋅a₄ + a₁ + a₃ ───────────────────────────────────────────────────────────────────────── a₀⋅a₁⋅a₂⋅a₄ + a₀⋅a₄ + a₁⋅a₂ + a₁⋅a₄ + 1 >>> cancel(list_to_frac(continued_frac())) == orig_frac True """ # In[ ]: orig_frac = (a0*a1*a2*a3*a4 + a0*a1*a2 + a0*a3*a4 + a0 + a1*a2*a3 + a1*a3*a4 + a1 + a3)/(a0*a1*a2*a4 + a0*a4 + a1*a2 + a1*a4 + 1) # In[ ]: orig_frac # In[ ]: cancel(list_to_frac(continued_frac())) == orig_frac # In[ ]: