SymPy學習之Simplification

Simplification

>>> from sympy import *
>>> x, y, z = symbols('x y z')
>>> init_printing(use_unicode=True)
simplify
#對式子進行化簡
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)

Polynomial/Rational Function Simplification

expand
#將式子展開成多項式
>>> expand((x + 1)**2)
 2
x  + 2⋅x + 1
>>> expand((x + 2)*(x - 3))
 2
x  - x - 6
>>> expand((x + 1)*(x - 2) - (x - 1)*x)
-2
factor
#進行因式分解
>>> factor(x**3 - x**2 + x - 1)
        ⎛ 2    ⎞
(x - 1)⋅⎝x  + 1⎠
>>> factor(x**2*z + 4*x*y*z + 4*y**2*z)
           2
z⋅(x + 2⋅y)
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
>>> expand((cos(x) + sin(x))**2)
 2 2
sin (x) + 2⋅sin(x)⋅cos(x) + cos (x)
>>> factor(cos(x)**2 + 2*cos(x)*sin(x) + sin(x)**2)
 2
(sin(x) + cos(x))
collect
#合併同類項
>>> expr = x*y + x - 3 + 2*x**2 - z*x**2 + x**3
>>> expr
 3    2        2
x  - x ⋅z + 2⋅x  + x⋅y + x - 3
>>> collected_expr = collect(expr, x)
>>> collected_expr
 3    2
x  + x ⋅(-z + 2) + x⋅(y + 1) - 3
>>> collected_expr.coeff(x, 2)
-z + 2
cancel
#化成最簡分式
>>> cancel((x**2 + 2*x + 1)/(x**2 + x))
x + 1
─────
  x
>>> expr = 1/x + (3*x/2 - 2)/(x - 4)
>>> expr
3*x
--- - 2
 2        1
------- + -
 x - 4    x
>>> cancel(expr)
  2
3*x - 2*x - 8
--------------
    2
 2*x - 8*x
>>> expr = (x*y**2 - 2*x*y*z + x*z**2 + y**2 - 2*y*z + z**2)/(x**2 - 1)
>>> expr
   2               2   2           2
x*y - 2*x*y*z + x*z + y - 2*y*z + z
---------------------------------------
                 2
                x - 1
>>> cancel(expr)
 2           2
y - 2*y*z + z
---------------
    x - 1
>>> factor(expr)
       2
(y - z)
--------
 x - 1
apart
#與cancel相反,將分式展開
>>> expr = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x)
>>> expr
   3      2
4*x + 21*x + 10*x + 12
------------------------
  4     3     2
 x + 5*x + 5*x + 4*x
>>> apart(expr)
 2*x - 1       1     3
---------- - ----- + -
 2           x + 4   x
x + x + 1

Trigonometric Simplification

trigsimp
>>> trigsimp(sin(x)**2 + cos(x)**2)
1
>>> trigsimp(sin(x)**4 - 2*cos(x)**2*sin(x)**2 + cos(x)**4)
cos(4*x)   1
-------- + -
   2       2
>>> trigsimp(sin(x)*tan(x)/sec(x))
   2
sin (x)
>>> trigsimp(cosh(x)**2 + sinh(x)**2)
cosh(2⋅x)
>>> trigsimp(sinh(x)/tanh(x))
cosh(x)
expand_trig
>>> expand_trig(sin(x + y))
sin(x)⋅cos(y) + sin(y)⋅cos(x)
>>> trigsimp(sin(x)*cos(y) + sin(y)*cos(x))
sin(x + y)
>>> expand_trig(tan(2*x))
 2*tan(x)
-------------
     2
- tan (x) + 1
#sqrt(x) is just a shortcut to x**Rational(1, 2)
>>> sqrt(x) == x**Rational(1, 2)
True

Powers

powsimp
>>> x, y = symbols('x y', positive=True)
>>> a, b = symbols('a b', real=True)
>>> z, t, c = symbols('z t c')
>>> powsimp(x**a*x**b)
  a + b
 x
>>> powsimp(x**a*y**a)
     a
(x⋅y)
>>> powsimp(t**c*z**c)  #c沒有指明類型
 c c
t ⋅z
>>> powsimp(t**c*z**c, force=True)
    c
(t⋅z)
>>> powsimp(z**2*t**2)  #指數爲實數時無法合併
  2  2
 t ⋅z
>>> powsimp(sqrt(x)*sqrt(y))
 √x⋅√y
expand_power_exp / expand_power_base
>>> expand_power_exp(x**(a + b))
 a  b
x ⋅x
>>> expand_power_base((x*y)**a)
 a  a
x ⋅y
powdenest
>>> powdenest((x**a)**b)
 a⋅b
x

Exponentials and logarithms

>>> x, y = symbols('x y', positive=True)
>>> n = symbols('n', real=True)
expand_log
>>> expand_log(log(x*y))
log(x) + log(y)
>>> expand_log(log(x/y))
log(x) - log(y)
>>> expand_log(log(x**2))
2⋅log(x)
>>> expand_log(log(x**n))
n⋅log(x)
>>> expand_log(log(z*t))
log(t⋅z)
logcombine
>>> logcombine(log(x) + log(y))
log(x⋅y)
>>> logcombine(n*log(x))
   ⎛ n⎞
log⎝x ⎠
>>> logcombine(n*log(z))
n⋅log(z)

Special Functions

>>> x, y, z = symbols('x y z')
>>> k, m, n = symbols('k m n')
>>> factorial(n)
n!
>>> binomial(n, k)
⎛n⎞
⎜ ⎟
⎝k⎠
>>> gamma(z)
Γ(z)
rewrite
>>> tan(x).rewrite(sin)
     2
2⋅sin (x)
─────────
 sin(2⋅x)
>>> factorial(x).rewrite(gamma)
Γ(x + 1)
expand_func
>>> expand_func(gamma(x + 3))
x⋅(x + 1)⋅(x + 2)⋅Γ(x)
combsimp
#化簡組合函數
>>> combsimp(factorial(n)/factorial(n - 3))
n⋅(n - 2)⋅(n - 1)
>>> combsimp(binomial(n+1, k+1)/binomial(n, k))
n + 1
─────
k + 1

Example: Continued Fractions

>>> def list_to_frac(l):
...     expr = Integer(0)
...     for i in reversed(l[1:]):
...         expr += i
...         expr = 1/expr
...     return l[0] + expr
>>> list_to_frac([x, y, z])
      1
x + ─────
        1
    y + ─
        z
>>> list_to_frac([1, 2, 3, 4])
43
──
30
>>> syms = symbols('a0:5')  #創建編號變量
>>> syms
(a₀, a₁, a₂, a₃, a₄)
>>> a0, a1, a2, a3, a4 = syms
>>> frac = list_to_frac(syms)
>>> frac
             1
a₀ + ─────────────────
               1
     a₁ + ────────────
                  1
          a₂ + ───────
                    1
               a₃ + ──
                    a₄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章