• 5.3Python数据处理篇之Sympy系列(三)---简化操作


    5.3简化操作

    目录

    前言

    既然sympy是对于符号的运算,那么它对于符号表达式的简化与展开一定很强大。

    今天我们学习的是符号表达式的简化与展开。

    本章节对应官网的Simplification

    官网的Simplification

    https://docs.sympy.org/latest/tutorial/simplification.html

    (一)有理数与多项式的简化

    1.最简化-simplify()

    (1)说明:

    simplify()是尽可能的让表达式最简化,其最简化的形式是不定的。

    (2)源代码:

    from sympy import *
    
    
    x = Symbol('x')
    
    expr1 = cos(x)**2+sin(x)**2
    
    expr2 = (x**3 + x**2 - x - 1)/(x**2 + 2*x + 1)
    
    # 简化表达式
    r1 = simplify(expr1)
    r2 = simplify(expr2)
    
    print(r1)
    print(r2)
    

    (3)输出:

    (cos(x)^2+sin(x)^2)-->1

    ((x^3 + x^2 - x - 1)/(x^2 + 2x + 1))-->(x-1)

    01.png

    2.展开-expand()

    (1)说明:

    expand()是对括号里的多项式进行展开。

    (2)源代码:

    from sympy import *
    
    x = Symbol('x')
    
    expr1 = (x+1)**2
    expr2 = ((x + 1)*(x - 2) - (x - 1)*x)
    
    # 展开
    r1 = expand(expr1)
    r2 = expand(expr2)
    
    print(r1)
    print(r2)
    

    (3)输出:

    ((x+1)^2)-->(x^2+2x+1)

    ((x + 1)(x - 2) - (x - 1)x)-->-2

    02.png

    3.提公因式-factor()

    (1)说明:

    factor()是对展开的多项式进行提公因式

    (2)源代码:

    from sympy import *
    
    x = Symbol('x')
    
    expr1 = (x ** 3 - x ** 2 + x - 1)
    
    # 提公因数
    r1 = factor(expr1)
    
    print(r1)
    print(latex(expr1))
    print(latex(r1))
    

    (3)输出:

    (x^{3} - x^{2} + x - 1)-->(left(x - 1 ight) left(x^{2} + 1 ight))

    03.png

    4.合并同类项-ceiling()

    (1)说明:

    对于多项式进行合并同类项

    (2)源代码:

    from sympy import *
    
    x = Symbol('x')
    y = Symbol('y')
    z = Symbol('z')
    
    expr1 = x*y + x - 3 + 2*x**2 - z*x**2 + x**3
    expr2 = x**3+x*2-3*x**2+x**3-x**2+x*4-5
    
    # 合并同类项
    r1 = ceiling(expr1)
    r2 = ceiling(expr2)
    
    print(r1)
    print(r2)
    print(latex(r1))
    print(latex(r2))
    

    (3)输出:

    (xy + x - 3 + 2x^2 - zx^2 + x^3) --> (lceil{x^{3} - x^{2} z + 2 x^{2} + x y + x} ceil - 3)

    (x^3+x2-3x^2+x^3-x^2+x4-5) --> (lceil{2 x^{3} - 4 x^{2} + 6 x} ceil - 5)

    04.png

    5.简化分式-cancel()

    (1)说明:

    cancle既有约分又有简化的作用

    (2)源代码:

    from sympy import *
    
    x = Symbol('x')
    
    expr1 = (x**2 + 2*x + 1)/(x**2 + x)
    expr2 = 1/x + (3*x/2 - 2)/(x - 4)
    
    # 约分消去分式的公因数
    r1 = cancel(expr1)
    
    # 简化分式
    r2 = cancel(expr2)
    
    # 结果
    print("结果:r1", r1)
    print("结果:r2", r2)
    
    # r1的表达式与结果
    print("r1的表达式与结果:")
    print(latex((x**2 + 2*x + 1)/(x**2 + x)))
    print(latex(r1))
    
    
    # r2的表达式与结果
    print("
    r2的表达式与结果:")
    print(latex(1/x + (3*x/2 - 2)/(x - 4)))
    print(latex(r2))
    

    (3)输出:

    (frac{x^{2} + 2 x + 1}{x^{2} + x}) --》 (frac{x + 1}{x})

    (frac{frac{3 x}{2} - 2}{x - 4} + frac{1}{x}) --》 (frac{3 x^{2} - 2 x - 8}{2 x^{2} - 8 x})

    05.png

    6.分式展开-apart()

    (1)说明:

    原本只有一项的分式表达式,展开为多项的分式表达式。

    (2)源代码:

    from sympy import *
    
    x = Symbol('x')
    
    expr1 = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x)
    
    # 对于分式进行展开
    r1 = apart(expr1)
    
    print(r1)
    print(latex(r1))
    print(latex(expr1))
    

    (3)输出:

    [frac{4x^3 + 21x^2 + 10x + 12}{x^4 + 5x^3 + 5x^2 + 4x} ]

    ---》

    [frac{2 x - 1}{x^{2} + x + 1} - frac{1}{x + 4} + frac{3}{x} ]

    06.png

    (二)三角函数的简化

    1.三角形的简化-trigsimp()

    (1)说明:

    使用trigsimp()可以简化三角函数,反三角函数也可以。

    (2)源代码:

    from sympy import *
    
    x = Symbol('x')
    
    expr1 = sin(x)**2+cos(x)**2
    expr2 = sin(x)**4 - 2*cos(x)**2*sin(x)**2 + cos(x)**4
    
    # 进行三角形简化
    r1 = trigsimp(expr1)
    r2 = trigsimp(expr2)
    
    
    print("r1:", r1)
    print("r2:", r2)
    
    # r1的latex
    print("="*20)
    print("expr1-latex:", latex(expr1))
    print("r1-latex:", latex(r1))
    
    # r2的latex
    print("="*20)
    print("expr2-latex:", latex(expr2))
    print("r2-latex:", latex(r2))
    

    (3)输出:

    (sin^{2}{left (x ight )} + cos^{2}{left (x ight )}) --> (1)

    (sin^{4}{left (x ight )} - 2 sin^{2}{left (x ight )} cos^{2}{left (x ight )} + cos^{4}{left (x ight )}) --> (frac{cos{left (4 x ight )}}{2} + frac{1}{2})

    07.png

    2.三角形的展开-expand_trig()

    (1)说明:

    使用expand_trig()可以展开三角函数,同样反三角函数也可以。

    (2)源代码:

    from sympy import *
    
    x = Symbol('x')
    y = Symbol('y')
    
    expr1 = sin(x+y)
    expr2 = tan(2*x)
    
    # 三角形的展开
    r1 = expand_trig(expr1)
    r2 = expand_trig(expr2)
    
    print("===========r1==========")
    print(r1)
    print(latex(expr1))
    print(latex(r1))
    
    print("===========r2==========")
    print(r2)
    print(latex(expr2))
    print(latex(r2))
    

    (3)输出:

    (sin{left (x + y ight )}) --> (sin{left (x ight )} cos{left (y ight )} + sin{left (y ight )} cos{left (x ight )})

    ( an{left (2 x ight )}) --> (frac{2 an{left (x ight )}}{- an^{2}{left (x ight )} + 1})

    08.png

    (三)指数函数的简化

    1.指数的合并一-powsimp()

    (1)说明:

    powsimp()主要用于同底数或者同指数

    (2)源代码:

    from sympy import *
    
    # 假设 x与y 是正值, a 是真实的值
    x = Symbol('x', positive=True)
    y = Symbol('y', positive=True)
    a = Symbol('a', real=True)
    
    expr1 = x**2*x**3
    expr2 = x**a*y**a
    
    
    # 进行指数的合并,如果不符合,则不进行简化
    r1 = powsimp(expr1)
    r2 = powsimp(expr2)
    
    
    print("===========r1==========")
    print(r1)
    print(latex(expr1))
    print(latex(r1))
    
    print("===========r2==========")
    print(r2)
    print(latex(expr2))
    print(latex(r2))
    

    (3)输出:

    (x^2x^3) --> (x^5)

    (x^ay^b) --> (left(x y ight)^{a})

    09.png

    2.指数的合并二-powdenest()

    (1)说明:

    powdenest()主要用于只有一个底数的不同指数。

    (2)源代码:

    from sympy import *
    
    # 假设 x与y 是正值, a 是真实的值
    x = Symbol('x', positive=True)
    y = Symbol('y', positive=True)
    a = Symbol('a', real=True)
    b = Symbol('b', real=True)
    
    expr1 = (x**a)**b
    expr2 = (((x**2)**a)**b)
    
    
    # 进行指数的合并,如果不符合,则不进行简化
    r1 = powdenest(expr1)
    r2 = powdenest(expr2)
    
    
    print("===========r1==========")
    print(r1)
    print(latex(expr1))
    print(latex(r1))
    
    print("===========r2==========")
    print(r2)
    print(latex(expr2))
    print(latex(r2))
    

    (3)输出:

    ((x^a)^b) --> (x^{ab})

    ({{x^2}^a}^b) --> (x^{2ab})

    10.png

    3.指数的展开:-expand_power_expexpand_power_base

    (1)说明:

    1. expand_power_exp()用于同底数的展开
    2. expand_power_base()用于同指数的展开

    (2)源代码:

    from sympy import *
    
    # 假设 x与y 是正值, a 是真实的值
    x = Symbol('x', positive=True)
    y = Symbol('y', positive=True)
    a = Symbol('a', real=True)
    b = Symbol('b', real=True)
    
    expr1 = x**(a+b)
    expr2 = (x*y)**a
    
    
    # 进行指数的展开
    # 底数相同展开
    r1 = expand_power_exp(expr1)
    
    # 指数相同展开
    r2 = expand_power_base(expr2)
    
    
    print("===========r1==========")
    print(r1)
    print(latex(expr1))
    print(latex(r1))
    
    print("===========r2==========")
    print(r2)
    print(latex(expr2))
    print(latex(r2))
    

    (3)输出:

    (x^{a+b}) --> (x^{a} x^{b})

    (left(x y ight)^{a}) --> (x^{a} y^{a})

    11.png

    (四)对数函数的简化

    1.对数的简化-logcombine()

    (1)说明:

    logcombine()用于合并对数。

    (2)源代码:

    from sympy import *
    
    # 假设 x与y 是正值, a 是真实的值
    x = Symbol('x', positive=True)
    y = Symbol('y', positive=True)
    n = Symbol('n', real=True)
    
    expr1 = log(x) + log(y)
    expr2 = log(x) - log(y)
    expr3 = n*log(x)
    
    
    # 对于对数的展开
    r1 = logcombine(expr1)
    r2 = logcombine(expr2)
    r3 = logcombine(expr3)
    
    print(r1)
    print(r2)
    print(r3)
    

    (3)输出:

    (log(x) + log(y)) --> (log(xy))

    (log(x)-log(y)) --> (log(xy))

    (nlog(x)) --> (log(x^n))

    12.png

    2.对数的展开-expand_log()

    (1)说明:

    expand_log()用于对数的展开。

    (2)源代码:

    from sympy import *
    
    # 假设 x与y 是正值, a 是真实的值
    x = Symbol('x', positive=True)
    y = Symbol('y', positive=True)
    n = Symbol('n', real=True)
    
    expr1 = log(x*y)
    expr2 = log(x/y)
    expr3 = log(x**n)
    
    
    # 对于对数的展开
    r1 = expand_log(expr1)
    r2 = expand_log(expr2)
    r3 = expand_log(expr3)
    
    print(r1)
    print(r2)
    print(r3)
    

    (3)输出:

    (log(xy)) --> (log(x)+log(y))

    (log(x/y)) --> (log(x)-log(y)​)

    (log(x^n)) --> ​(nlog(x))

    13.png

    (五)其他函数的简化

    1.阶乘与排列组合-factorial()inomial()

    (1)说明:

    1. factorial()用于求阶乘
    2. binomial()用于求排列组合

    (2)源代码:

    from sympy import *
    
    n = Symbol("n")
    
    # 求阶乘
    r1 = factorial(3)
    r2 = factorial(n)
    
    
    print(r1)
    print(r2)
    
    # 排列组合
    print(binomial(4, 2))
    

    (3)输出:

    14.png

    作者:Mark

    日期:2019/03/16 周六

  • 相关阅读:
    【leetcode】对称二叉树
    【leetcode】判断回文数
    053686
    053685
    053684
    053683
    053682
    053681
    053680
    053477
  • 原文地址:https://www.cnblogs.com/zyg123/p/10544277.html
Copyright © 2020-2023  润新知