Skip to content
返回

SymPy 符号计算能力调研

更新于

SymPy 是 Python 生态中最知名的开源符号计算库,也是计算机代数系统(Computer Algebra System, CAS)的代表实现。其表达式表示、规则应用和化简策略等机制对理解符号计算系统至关重要。本文将研究 SymPy 的核心机制,涵盖运算结构、求导与积分的规则实现、化简策略及积分变换,并在文末对比类 SymPy 系统(如 Symbolica、MathCore、Symmetrica 等)在表达式表示、规则驱动等层面的实现差异。

运算与核心结构

基本运算

SymPy 将表达式抽象为统一的 Basic 对象,核心运算对应以下内部结构:

结构对应运算示例
Add加法a + b
Mul乘法a * b
Powa ** b
Sub减法a - b(内部为 a + (-1)*b
Div除法a / b(内部为 a * b**(-1)
Mod取模a % b

所有符号对象通过 sympify() 转为 SymPy 可用的类型;支持 evaluate=False 延迟求值,便于保留表达式原始结构。

关系与逻辑

比较运算包括 Eq(Equal,等于)、Ne(Not Equal,不等于)、Lt(Less Than,小于)、Le(Less or Equal)、Gt(Greater Than)、Ge(Greater or Equal);逻辑运算有 OrAndNot。符号对象可通过 .is_* 属性查询假设(如 is_realis_positive),用于基于假设的化简。

初等函数

三角函数sincostancotseccscsinc。当自变量为 π 的有理倍数时(如 π/2、π/6)会自动求值。

反三角函数asinacosatanacotasecacscatan2atan2(y, x) 按象限正确确定角度范围 ((-\pi, \pi])。

双曲函数sinhcoshtanhcothsechcsch 及对应反函数 asinhacoshatanh 等。

指数与对数explog(自然对数)、lnsqrt(x) 等价于 x**0.5

复数与其它reimconjugateAbssignargMinMax 用于多变量极值。

特殊函数

支持 gammafactorialbinomialhypermeijerg(Meijer G 函数)、besseljbesselierf(误差函数,error function)等。部分积分会返回含这些函数的非初等表达式。

求导规则

API 与用法

自定义求导

常用导数规则

表达式导数
xx1
常数0
a + ba' + b'
a * ba'*b + a*b'
a / b(a'*b - a*b')/b²
a**bb*a**(b-1)*a' + a**b*ln(a)*b'
sin(x)cos(x)
cos(x)-sin(x)
tan(x)sec²(x)1 + tan²(x)
exp(x)exp(x)
log(x)1/x
asin(x)1/sqrt(1-x²)
Abs(x)sign(x)

隐式求导与有限差分

积分规则

主 API

积分策略

SymPy 使用多种策略组合:

通过 sympy_rubi 扩展还可使用 Rubi(Rule-based Integration,基于规则的积分)规则式积分,可提供更细粒度的分步结果。

无法得到闭式解时,会返回未求值的 Integral 对象,可配合 evalf()(evaluate to float,数值求值)做数值积分。

常用积分示例

被积函数积分
1x + C
xⁿ (n≠-1)x^(n+1)/(n+1) + C
1/xlog(x) + C
exp(x)exp(x) + C
sin(x)-cos(x) + C
cos(x)sin(x) + C
1/(1+x²)atan(x) + C

多项式与 expsincos 的乘积也可积分;部分积分会得到含误差函数 erf、菲涅尔积分(Fresnel)等非初等结果。

积分变换

变换函数
Mellinmellin_transform / inverse_mellin_transform
Laplacelaplace_transform / inverse_laplace_transform
Fourierfourier_transform / inverse_fourier_transform
正弦 / 余弦sine_transform / cosine_transform 及逆变换
Hankelhankel_transform / inverse_hankel_transform

Laplace 变换还提供 laplace_correspondencelaplace_initial_conds 等辅助函数,便于求解微分方程。

化简规则

通用化简

simplify(expr) 综合多种策略,无保证输出形式。参数包括:

建议在明确需求时优先使用专项化简函数,以获得可预期的结果。

多项式与有理式

函数作用
expand()展开多项式与乘积
factor()有理系数因式分解
collect(expr, x)x 合并同类项
cancel()化为 p/q 并约分
apart()部分分式分解
together()合并为单分式

三角函数与幂

函数作用
trigsimp()三角恒等式化简
expand_trig()展开 sin(x+y)、倍角公式等
powsimp()x^a·x^b → x^(a+b),x^a·y^a → (xy)^a
expand_power_exp()x^(a+b) → x^a·x^b
expand_power_base()(xy)^a → x^a·y^a
powdenest()(x^a)^b → x^(ab)

对数与根式

函数作用
expand_log()log(xy) → log(x)+log(y),log(xⁿ) → n·log(x)
logcombine()逆操作:log(x)+log(y) → log(xy)
radsimp()分母有理化、去根号
collect_sqrt()合并含 √ 的项
collect_const()合并常数系数
rcollect()递归收集和式

其它专用化简

separatevars()nsimplify()combsimp()gammasimp()besselsimp()kroneckersimp()hyperexpand()posify() 等用于特定类型的化简。基于假设时可使用 refine(expr, assumptions)ask()

级数展开与极限

方程求解与矩阵

数值计算

类符号计算系统的机制对比

表达式表示

SymPy 将表达式抽象为不可变 Basic 树结构,子类(AddMulPow 等)通过 .args.func 实现结构化遍历。同类系统在表示层有多种取舍:AST 指抽象语法树(Abstract Syntax Tree);DAG 指有向无环图(Directed Acyclic Graph);Hash-consed 指哈希一致化(hash consing),一种结构共享技术;GMP 指 GNU 多精度算术库;i64 指 64 位有符号整数。

系统表达式结构特点
SymPy不可变 ASTBasic 基类,func(*args) 结构共享
Symbolica内部 DAG侧重性能,有理算术基于 GMP
SymmetricaHash-consed DAG结构共享、确定性排序、无浮点(i64 有理数)
rusymbols极简 AST100% Rust、易扩展,适合研究实现

规则与策略

求导、积分、化简均依赖规则应用。SymPy 的 _eval_derivativefdiff 实现链式法则;积分组合 heurisch、manualintegrate、meijerg 等策略。对比:

化简机制

SymPy 的 simplify() 无保证输出形式,依赖 ratiomeasure 等启发式;专项函数(trigsimppowsimplogcombine 等)提供可预期变换。Symbolica 通过模式匹配做重写;Symmetrica 的 simplifyStore 配合,在 hash-consed(哈希一致化)结构上做等价化简。

参考文献

SymPy 文档

Rust 生态


建议修改

上一篇
Egglog 快速入门(三):复数定义与内置类型
下一篇
Egglog 快速入门(二):从自然数到整数、有理数与实数