SymPy 简化

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}

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程