SymPy – 简化
Sympy具有强大的简化数学表达式的能力。在SymPy中,有许多函数可以进行各种类型的简化操作。其中有一个叫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()是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)])
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}}{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
你可以通过改变combined=’base’或combined=’exp’使powsimp()只合并基数或只合并指数。默认情况下,combined=’all’,两者都做。如果force为True,那么基数将被合并,而不检查假设。
>>> powsimp(expr, combine='base', force=True)
上述代码片断给出的输出等同于以下表达式 −
$x^y(xy)^z*
combsimp
涉及阶乘和二项式的组合表达式可以通过使用combsimp()函数来简化。SymPy提供了一个阶乘()函数
>>> 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) 如果两者都是正数的话
- a*log(x) == log(x**a) 如果x是正数,a是实数
>>> logcombine(a*log(x) + log(y) - log(z))
上述代码片段给出的输出相当于下面的表达式–
$a\log(x) +** \log (y) – \log **(z)$
如果这个函数的强制参数被设置为True,那么如果没有对一个数量的假设,上述的假设将被假定为成立。
>>> logcombine(a*log(x) + log(y) - log(z), force=True)
上述代码片断给出的输出等同于以下表达式 −
log\frac{x^a y}{z}