SymPy - 简化

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


simplify

此函数在 sympy.simplify 模块中定义。 simplify() 尝试应用智能启发式方法使输入表达式"更简单"。 以下代码显示了简化表达式 $sin^2(x)+cos^2(x)$。

>>> from sympy import * 
>>> x=Symbol('x')
>>> expr=sin(x)**2 + cos(x)**2 
>>> simplify(expr)

上面的代码片段给出了以下输出 −

1


expand

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


factor

此函数采用多项式并将其分解为有理数的不可约因子。

>>> 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)])


collect

此函数收集关于表达式列表的表达式的附加项,直至具有有理指数的幂。

>>> 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

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)}$


trigsimp

此函数用于简化三角恒等式。 可能会注意到,反三角函数的命名约定是在函数名称的前面附加一个 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 函数使用试探法来应用最合适的三角恒等式。


powersimp

此函数通过将具有相似底数和指数的幂组合起来来减少给定的表达式。

>>> 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)$

二项式 (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}$


logcombine

此函数采用对数并使用以下规则组合它们 −

  • log(x) + log(y) == log(x*y) if both are positive
  • a*log(x) == log(x**a) if x is positive and a is real
>>> 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}$