SymPy - 简化

  • 简述

    Sympy 具有强大的简化数学表达式的能力。SymPy 中有许多函数可以执行各种简化。那里有一个称为 simple() 的通用函数,它试图得出最简单的表达式形式。
  • 简化

    该函数在 sympy.simplify 模块中定义。simple() 尝试应用智能启发式来使输入表达式“更简单”。以下代码显示了简化表达式 $$sin^2(x)+cos^2(x)$$。
    
    
    >>> from sympy import * 
    
    >>> x=Symbol('x')
    
    >>> expr=sin(x)**2 + cos(x)**2 
    
    >>> simplify(expr)
    
    
    上面的代码片段给出了以下输出 -
    1
  • 展开

    expand() 是 SymPy 中最常见的简化函数之一,用于扩展多项式表达式。例如 -
    
    
    >>> a,b=symbols('a b') 
    
    >>> expand((a+b)**2)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$a^2 + 2ab + b^2$$
    
    
    >>> expand((a+b)*(a-b))
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$a^2 - b^2$$
    expand() 函数使表达式更大,而不是更小。通常是这种情况,但在调用 expand() 时,表达式通常会变小。
    
    
    >>> expand((x + 1)*(x - 2) - (x - 1)*x)
    
    
    上面的代码片段给出了以下输出 -
    -2
  • 因数

    该函数采用多项式并将其分解为有理数上的不可约因数。
    
    
    >>> x,y,z=symbols('x y z') 
    
    >>> expr=(x**2*z + 4*x*y*z + 4*y**2*z) 
    
    >>> factor(expr)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$z(x + 2y)^2$$
    
    
    >>> factor(x**2+2*x+1)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$(x + 1)^2$$
    factor() 函数与 expand() 相反。factor() 返回的每个因子都保证是不可约的。factor_list() 函数返回更结构化的输出。
    
    
    >>> expr=(x**2*z + 4*x*y*z + 4*y**2*z) 
    
    >>> factor_list(expr)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    (1, [(z, 1), (x + 2*y, 2)])
  • 收集

    此函数收集一个表达式的附加项,该表达式与一个有理指数幂的表达式列表有关。
    
    
    >>> expr=x*y + x - 3 + 2*x**2 - z*x**2 + x**3 
    
    >>> expr
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$x^3 + x^2z + 2x^2 + xy + x - 3$$
    该表达式上的 collect() 函数结果如下 -
    
    
    >>> collect(expr,x)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$x^3 + x^2(2 - z) + x(y + 1) - 3$$
    
    
    >>> expr=y**2*x + 4*x*y*z + 4*y**2*z+y**3+2*x*y 
    
    >>> collect(expr,y)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$Y^3+Y^2(x+4z)+y(4xz+2x)$$
  • 抵消

    cancel() 函数将采用任何有理函数并将其放入标准规范形式 p/q 中,其中 p 和 q 是没有公因数的扩展多项式。p 和 q 的前导系数没有分母,即它们是整数。
    
    
    >>> expr1=x**2+2*x+1 
    
    >>> expr2=x+1 
    
    >>> cancel(expr1/expr2)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$x+1$$
    
    
    >>> expr = 1/x + (3*x/2 - 2)/(x - 4) 
    
    >>> expr
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$\frac{\frac{3x}{2} - 2}{x - 4} + \frac{1}{x}$$
    
    
    >>> cancel(expr)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$\frac{3x^2 - 2x - 8}{2x^2 - 8}$$
    
    
    >>> expr=1/sin(x)**2 
    
    >>> expr1=sin(x) 
    
    >>> cancel(expr1*expr)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$\frac{1}{\sin(x)}$$
  • 反三角

    此函数用于简化三角恒等式。可能需要注意的是,反三角函数的命名约定是将 a 附加到函数名称的前面。例如,反余弦或反余弦称为 acos()。
    
    
    >>> from sympy import trigsimp, sin, cos 
    
    >>> from sympy.abc import x, y
    
    >>> expr = 2*sin(x)**2 + 2*cos(x)**2 
    
    >>> trigsimp(expr)
    
    
    2
    trigsimp 函数使用启发式方法来应用最合适的三角恒等式。
  • 幂结合

    该函数通过将幂与相似的基数和指数相结合来减少给定的表达式。
    
    
    >>> expr=x**y*x**z*y**z 
    
    >>> expr
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$x^y x^z y^z$$
    
    
    >>> powsimp(expr)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$x^{y+z} y^z$$
    您可以通过更改 combine='base' 或 combine='exp' 使 powsimp() 仅组合基数或仅组合指数。默认情况下,combine='all',两者兼而有之。如果 force 为 True,则将组合基础而不检查假设。
    
    
    >>> powsimp(expr, combine='base', force=True)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$x^y(xy)^z$$
  • combsimp

    使用 combsimp() 函数可以简化涉及阶乘和二项式的组合表达式。SymPy 提供了一个 factorial() 函数
    
    
    >>> expr=factorial(x)/factorial(x - 3) 
    
    >>> expr
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$\frac{x!}{(x - 3)!}$$
    为了简化上述组合表达式,我们使用 combsimp() 函数如下 -
    
    
    >>> combsimp(expr)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$x(x-2)(x-1)$$
    binomial(x, y) 是从一组 x 个不同项目中选择 y 个项目的方法的数量。它也经常写成 xCy。
    
    
    >>> binomial(x,y)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$(\frac{x}{y})$$
    
    
    >>> combsimp(binomial(x+1, y+1)/binomial(x, y))
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$\frac{x + 1}{y + 1}$$
  • 对数组合

    此函数采用对数并使用以下规则将它们组合 -
    • 如果两者都是正数,则 log(x) + log(y) == log(x*y)
    • a*log(x) == log(x**a) 如果 x 为正且 a 为实数
    
    
    >>> logcombine(a*log(x) + log(y) - log(z))
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$a\log(x) + \log(y) - \log(z)$$
    如果此函数的 force 参数设置为 True,则如果没有对某个量的假设,则将假设上述假设成立。
    
    
    >>> logcombine(a*log(x) + log(y) - log(z), force=True)
    
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$\log\frac{x^a y}{z}$$