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)
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}
logcombine
这个函数接受对数,并使用以下规则进行合并 –
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}