SymPy教程之二——基本概念

在入门 SymPy 时,我们应当弄清一些概念。就像 NumPy 、Django 和 Python 标准库中的 sys 和 re 模块一样, SymPy 只不过是一个 Python 库。这就意味着 SymPy 并没有对 Python 语言做出修改。因此 Python 语言中存在的限制在 SymPy 中也是一样的。这也意味着 SymPy 试图尽可能得遵循 Python 语言典范,让熟悉使用 Python 语言编程的用户可以容易得使用 SymPy 库编程。举一个简单的例子, SymPy 使用 Python 的语法来建立表达式。省略乘号(例如 3x 或 3 x)是 Python 中不允许的,因此在 SymPy 中也是不允许的。要让 3 和 x 相乘,你必须输入3*x*必须要有。

库的正确导入姿势

SymPy 作为一个 Python 库的结果就是,你可以在任何支持 Python 的环境下使用 SymPy 。我们只需要向导入任何 Python 库那样导入 SymPy :
from sympy import *
这样,在当前的 Python 会话里导入了 SymPy 所有的函数和类。

变量与表达式

表达式包含有变量,通常用 x、y 等符号来表示。在 SymPy 中,若想要用一个符号表示变量,要首先对其进行定义:
x = symbols('x')
这样,在 SymPy 中,x 就被认为是一个变量,可以参与符号运算。
符号不仅限于 x、y 这样单个的字符,也可以是一个字符串。例如,Ri、CRLB 也可以表示变量。
如果要同时定义多个变量,可用下面语句:
x, y, z = symbols('x y z')
我们可以创建一个表达式,含有变量 x、y、z:
expr = 2*x + 3*y + 4*z
程序的运行效果如图所示:
image1
如果我们想给定一组 x、y、z,求取表达式值,应该如何去做?
例如,我们想令[x, y, z] = [2, 3, 4],执行下列语句:
expr.subs({x:2, y:3, z:4})

表示方程

如果我们想表示方程x + 1 = 4,是否可以这样来表示?
x + 1 == 4
答案是不行。因为 SymPy 作为一个 Python 库,还是使用 Python 的语法,因此 == 符号的含义还是同 Python 语言,也就是判断两个对象是否相同。
通过type(x + 1)type(1),前者返回sympy.core.add.Add后者为int,故上面这个方法只是进行了一个判断,并返回了一个False
如何正确地表示一个方程呢?正确的语句是:
Eq(x+1, 4)

表达式判等

如何判断两个表达式是否相等?
利用 Python 语言中的 == 还是不可行的。因为对于语句:
(x + 1)**2 == x**2 + 2*x + 1
我们都知道,这两个表达式中,后者是前者的展开形式。可是仅 Python 的==,并不能识别出符号表达式来。
SymPy 库中提供了判断表达式是否相等的方法,主要有两种:

simplify(a – b) # 一种变通做法,判断差是否为零
a.equals(b) # 相等返回True,否则False

指数的表达

符号^在 Python语言中是或非,**在 Python 中表示指数。
例如,表示一个平方项:
expr2 = (x + y)**2
将得到:
image2

附录

本文是对 SymPy 官网教程 Gotchas 一章的翻译。我翻译了其中的大部分内容,并结合自己的理解,对内容加以调整。
对于基础知识,还有一篇更加详细的文档 Gotchas and Pitfalls,在本文内容的基础上,讨论了更多的内容