1.1.1. 简介

符号计算

符号计算(Symbolic Computation)是以符号的方式处理数学对象的计算。这意味着数学对象被精确的表示,而不是近似的表示,带有未求值的数学表达式保留符号形式。

下面举几个例子来说明符号计算的好处。

精确求值

对于 9=3 这个数学常识,我们一定不会陌生。可以直接使用 Python 内建库求取:

import math
math.sqrt(9)
3.0

此时,符合数学直观。但是,对于 8 可能并不一定会那么的准确:

math.sqrt(8)
2.8284271247461903

这里得到的是 8 的近似值(因为 8 是无理数,不能使用有限小数表示)。如果仅仅是想要获得 8 的近似值,这样就结束是没有问题的,但是,想要通过下面的近似值立即判断 8=22

math.sqrt(8), math.sqrt(2)
(2.8284271247461903, 1.4142135623730951)

是很难的。对于符号计算,则是很容易的:

import sympy
sympy.sqrt(8)
22

数学表达式

上面的例子可以看出 SymPy 可以精确的表达数学概念。符号计算系统(Symbolic computation systems,也称为 CAS(computer algebra systems)) 可以使用变量计算数学表达式:

数学变量是使用 symbols 定义的。比如,可以定义数学表达式 x+2y

from sympy import symbols

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

可以继续对数学表达式 expr 进行计算:

expr + 1
x+2y+1
expr - x
2y
x*expr
x(x+2y)

也可以对数学表达式进行因式分解或者展示:

from sympy import expand, factor

expanded_expr = expand(x*expr)
expanded_expr # 展示表达式
x2+2xy
factor(expanded_expr) # 转换为因子分解表达式
x(x+2y)

求导和求积分

from sympy import *

计算:sin(x)exp(x) 的导数:

diff(sin(x)*exp(x), x)
exsin(x)+excos(x)

计算:(exsin(x)+excos(x))dx

integrate(exp(x)*sin(x) + exp(x)*cos(x), x)
exsin(x)

计算:sin(x2)dx

integrate(sin(x**2), (x, -oo, oo))
2π2

计算:limx0sin(x)x

limit(sin(x)/x, x, 0)
1

其他

解方程:x22=0

init_printing(use_latex='mathjax')
solve(x**2 - 2, x)
[2, 2]

解微分方程:yy=et

y = Function('y')
t = symbols('t')
dsolve(Eq(y(t).diff(t, t) - y(t), exp(t)), y(t))
y(t)=C2et+(C1+t2)et

计算 [1222] 的奇异值:

Matrix([[1, 2], [2, 2]]).eigenvals()
{32172:1, 32+172:1}

使用球面 Bessel 函数 jν(z) 重写 Bessel 函数 Jν(z)

nu, z = symbols('nu z')
besselj(nu, z).rewrite(jn)
2zjν12(z)π