SymPy教程之四——表达式化简

在本文中,我们将详细研究SymPy中对表达式的化简。SymPy针对表达式类型的多样,提供了丰富的化简函数,供我们调用。除此之外,SymPy还提供了通用的化简函数simplify,它采用启发式算法,能够自己探寻最好的化简结果。显然地,启发式算法并不完美,有时的结果并不“最简”。所以,熟悉这些函数、活用这些函数,才能保证我们得到想要的结果。如果你对这SymPy库尚不太熟悉,可以参考我之前的三篇基础教程:SymPy教程之一——SymPy介绍SymPy教程之二——基本概念SymPy教程之三——基本运算关于示例程序本文的示例程序在Python 3.4.1交互环境运行,文中的>>>表示语句,其它表示语句的执行结果。表达式的显示方式,采用默认的文本方式展示。在日常工作、学习实际推导中,推荐使用IPython,并开启公式渲染,以获得更佳的显示效果。具体设计方法可以参考SymPy教程之一——SymPy介绍

化简

符号运算系统最有用的一项特性就是数学表达式的化简。SymPy中有许多能够进行不同类型表达式化简的函数。其中,有一个通用的函数名为simplify,它能够试图以一种智能的方式应用这些化简函数,并最终得到表达式的最简形式。下面给出几个例子:
>>> simplify(sin(x)**2 + cos(x)**2)1>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))x - 1>>> simplify(gamma(x)/gamma(x - 2))(x - 2)*(x - 1)
IPython中执行上面语句,效果如下:image

simplify的缺陷

simplify有一个缺陷,由于表达式“最简化”并没有一个良好的定义,SymPy只能使用库中已有的化简操作,使用启发式方法来决定其认为的“最简化”结果。举例来说,对于表达式(x^2+2x+1),使用simplify函数并不能化简成((x+1)^2)simplify的另外一个缺陷是,由于它要尝试使用不同的化简方法,并选择最佳的那个,这个过程要花费一些时间。如果你事先已经你确定要进行那一种化简,那么直接调用特定的化简函数,这是更佳的方法,能节省一些时间。指定化简函数,而不使用通用的simplify函数还有一个好处,就是可以保证输出的形式。例如,对于factor函数,如果施加到有理系数多项式上,那么得到的结果一定是最简因式。而simplify没有这种保证,因为它是完全启发式的,有时会错过可能的化简类型。何时使用simplify比较好?当你在交互式的环境里,调用simplify函数,想看看它能把表达式化简到什么程度,然后你再选择几个特定的化简函数,看看是否还能再进一步简化。

展开表达式

表达式展开SymPy中最常用的化简操作,对应的函数为expand。很多数学理论都有展开的概念,我们在这里特指对多项式的展开。例如
>>> expand((x + 1)**2)x**2 + 2*x + 1>>> expand((x + 2)*(x - 3))x**2 - x - 6
它能为我们完成两件事:展开合并同类项

因式分解

因式化对应的函数是...

继续阅读

SymPy教程之三——基本运算

在本文中,我们将讨论使用SymPy进行表达式操作的一些最为基本的操作。对于更高级的操作,可以参考advanced expression manipulation一文。首先我们要在Python中导入SymPy库:
from sympy import *x, y, z = symbols("x y z")
如果你对这两行代码尚不太熟悉,可以参考我之前的两篇基础教程:SymPy教程之一——SymPy介绍SymPy教程之二——基本概念

表达式赋值

对于数学表达式,最基础的一项操作就是赋值。表达式赋值,就是将表达式中所包含的某个变量的所有实例,都替换为另一个数、变量或者表达式。这个操作需要使用SymPy库的subs函数。例如,我们先创建一个表达式,之后将x赋值为y:
expr = cos(x) + 1expr.subs(x, y)
将会得到结果:cos(y) + 1对于上面我们创建的表达式expr,若要求取x为0时的值:expr.subs(x, 0)有的时候,我们需要将表达式中的某一个变量,用另一个表达式来代替。我在平时的科研中常常使用这种方法。有时候一个数学模型中的一个变量,往往代表着另外一个小的数学模型,通过subs方法,就可以实现合二为一。举一个简单的例子:
d = sqrt(r)r2 = x**2 + y**2r3 = x**2 + y**2 +z**2d.subs(r, r2)d.subs(r, r3)
通过给d赋予不同的表达式r2r3,就可以求取二维、三维空间中一点到原点的距离。运行效果如下:image如何给多个变量赋值?例如我们在...

继续阅读