SymPy教程之一——SymPy介绍

SymPy 是一个用来进行数学符号(symbolic mathematics)运算的 Python 库。SymPy 的目标是成为一个全功能的计算机代数系统(computer algebra system ,CAS)。与此同时还要保持代码尽可能的简单,以便于理解和扩展。SymPy 完全采用 Python 语言编写,并且并且不依赖于外部库。

环境设置

我采用 IPython 作为 SymPy 的学习环境。IPython 的强大之处在于,可以将我们符号运算的结果,渲染成公式图像,方面我们对运算结果的理解。
效果图如下:
ipython
本文使用的 Linux 发行版为: Arch Linux
执行命令,打开 IPython:ipython qtconsole
进入 IPython 后,要导入 SymPy 库,并初始化对LaTex公式渲染:

from sympy import *
init_session(use_latex=True)
init_printing(use_latex=True)

我们可以编写一个程序,来测试设置是否生效:
Integral(sqrt(1/x),x)
执行后,若配置正确,则会渲染出上述指令的计算结果:
integral

实例:带变量的表达式

在本节中,我们将创建一个变量为 x 和 y 的表达式 expr。
首先,像上一节一样,我们要先初始化环境:

from sympy import *
init_session(use_latex=True)
init_printing(use_latex=True)

之后,我们定义两个变量x和y,并创建表达式:

x,y = symbols('x y')
expr = x + 2*y

现在我们就有了一个表达式,我们可以对它进行操作:

expr + 1    #将产生一个新的表达式 x + 2*y +1
expr * expr #将产生一个新的表达式 (x + 2*y)^2

符号运算的真正威力

向 SymPy 这种符号运算系统的真正威力是,它能够做所有类型的符号运算。SymPy 能够计算导数、积分、求极限、解方程、矩阵运算等等。所有这些,都是基于符号的。它还包括了绘图(绘制函数的输出)、自动生成 LaTex 代码、物理、统计、数论、几何、逻辑等模块。
在下面的例子中,我们将展示 SymPy 的符号为例:
首先像前面几节一样,我们要先配置环境,这里不再赘述。
创建以下符号:
x, t, z, nu = symbols('x t z nu')
计算表达式对x的导数:
diff(sin(x)*exp(x), x)
计算不定积分:
integrate(exp(x)*sin(x) + exp(x)*cos(x), x)
计算定积分:
integrate(sin(x**2), (x, -oo, oo))
求极限:
limit(sin(x)/x, x, 0)
解方程:
solve(x**2 - 2, x)
求解微分方程:
y = Function('y')
dsolve(Eq(y(t).diff(t, t) - y(t), exp(t)), y(t))
求矩阵的特征值:
Matrix([[1, 2], [2, 2]]).eigenvals()
生成LaTex代码:
latex(Integral(cos(x)**2, (x, 0, pi)))

使用SymPy的理由

有许多现存的计算机代数系统(CAS),这篇维基百科列出了其中的许多。在这些CAS中,SymPy 有哪些优势呢?

首先 SymPy 是完全免费的。它是开源的,并且遵守 BSD 许可。如果你想的话,你可以修改源代码之后拿出去卖。相比流行的商业系统,要花费高额资金购买授权。

第二, SymPy 使用 Python 语言。学多 CAS 发明了他们自己的语言。而 SymPy 没有,它完全采用 Python 编写,完全在 Python 中运行。这就意味着,如果你已经学会 Python ,也就会很容易地使用 SymPy ,因为你已经学会了语法。(如果你并不会 Python ,它也很容易学)。除此之外,我们已经知道,Python 是一个设计优良的编程语言。 SymPy 的开发者对他们开发数学软件的能力很自信,但是发明一门全新语言就是另外一回事情了。通过重用现有语言,我们将精力集中在了主要问题——数学上。

另外一个 CAS ,Sage 也使用 Python 作为它的语言。但是 Sage 很庞大,要下载超过 1GB 的数据。 SymPy 的一大优势就是它很轻量。除了体积小之外,他只依赖 Python ,所以容易地在任何地方运行。此外,Sage 和 SymPy 的目标不同。Sage 的目标是一个全功能的数学系统,通过将所有主要的开源数学系统编译组合成为一个。当你在 Sage 中调用一个函数,例如积分,它将调用其所包含的开源包中的一个。实际上, SymPy 也被包含在 Sage 之中。 SymPy 的目标是成为一个独立的系统,所有特性都是 SymPy 自己实现的。

SymPy 的最后一个重要特性是,它可以被当作库来使用。许多 CAS 致力于在交互环境下使用,但是若你打算将运算自动化,或者是扩展,他们将很难实现。而使用 SymPy ,你可以轻松地使用两种环境:交互式 Python 环境或作为库导入到你自己 Python 程序中。 SymPy 也提供了 API 给你,用来扩展你自己自定义的函数。

附录

本文是对SymPy官网教程介绍一章的翻译。在此基础上,本文还包含了 IPython 环境的介绍。