# 符号计算的艺术

> 让计算机像人一样「推公式」——不是算出 1.414，而是保留 √2 本身。这个专栏从「表达式是一棵树、计算是按规则重写这棵树」讲起，用 SymPy 代码优先，一路走过精确数、多项式、Gröbner 基、符号积分、方程精确解，详解业内主流的计算机代数方法，并揭示一个朴素而深刻的本质：计算，就是符号变换。

- 作者：David（道雾轩）
- 最后更新：2026-10-01
- 原文：https://daiw.org/manual/symbolic-computing
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

# 序 · 让计算机像人一样推公式

问计算机 $\sqrt{8}$ 等于多少，你期待什么答案？

```python
from sympy import *
print(sqrt(8))        # 2*sqrt(2)   —— 不是 2.8284271……
```

它没有算出小数，而是回答 $2\sqrt{2}$——就像一个学生在草稿纸上做的那样，**保留精确的符号**。再往前一步，让它做一道积分：

```python
x = symbols('x')
print(integrate(1/(x**2 - 1), x))    # log(x - 1)/2 - log(x + 1)/2
```

它给出的不是一个数，而是一个**精确的公式**。这台机器，正在像人一样**推导数学**。这就是**符号计算（symbolic computation）**，又叫**计算机代数（computer algebra）**——本专栏的主角。

## 和「数值计算」正好相反

这个专栏是[《数值计算的艺术》](https://daiw.org/manual/numerical-computing)的孪生兄弟，而它们的世界观**恰好相反**：

| | 数值计算 | 符号计算 |
| --- | --- | --- |
| 处理的对象 | **近似的浮点数** | **精确的表达式** |
| $\sqrt{2}$ 是 | `1.4142135623` | $\sqrt{2}$（原样保留） |
| $\frac13+\frac16$ 是 | `0.5000000001`（可能） | $\frac12$（精确） |
| 追求 | 快、可扩展、够准 | 准确无误、给出公式 |
| 像谁 | 拿计算器按数 | **拿笔推公式的数学家** |
| 代表工具 | NumPy / SciPy | **SymPy / Mathematica** |

数值计算里那个著名的坑——`0.1 + 0.2 != 0.3`——在符号计算里根本不存在：

```python
print(Rational(1,10) + Rational(2,10) == Rational(3,10))   # True,精确相等
```

因为符号计算**不用浮点数**，它用精确的有理数 $\frac{3}{10}$。没有舍入，没有误差，答案要么对、要么是一个精确的公式。

## 这个专栏的主线：表达式是树，计算是重写

符号计算看似神奇，内核却出奇地朴素。整个专栏，我们会反复回到**两句话**：

<Callout type="info">
  **第一句：一切数学表达式，本质都是一棵树。** $x^2 + 2x + 1$ 在计算机里不是一串字符，而是一个**结构化的树**：一个「加法」节点，挂着「$x^2$」「$2x$」「$1$」三个孩子。符号计算做的一切，都是在**操作这棵树**。

  **第二句：计算，就是按规则把一棵树重写成另一棵树。** 求导、化简、积分、解方程……剥开外壳，全都是**模式匹配 + 替换**：在树里找到符合某条规则的部分，把它换成规则右边的样子。这个朴素的动作——**按规则重写符号**——不仅是符号计算的内核，更是「计算」这个概念最古老、最本质的一副面孔。它和数理逻辑、λ 演算、Lisp 求值，是**同一件事**。
</Callout>

把这两句话吃透，你就抓住了从 SymPy 到 Mathematica 所有计算机代数系统（CAS）的灵魂。

## 方法：代码优先，SymPy 贯穿全篇

和孪生专栏一样，我们**代码优先**——每个概念都配一段能立即跑的 [SymPy](https://www.sympy.org/) 代码（Python 的计算机代数库，`pip install sympy` 即得），左边是符号操作、右边用人话讲清它在干什么。选 SymPy 是因为它**纯 Python、免费、随手可跑**；涉及主流方法时，我们也会对照 **Mathematica、Maple、Maxima、SageMath** 这些业内工具的做法。

学完你会明白这些每天在科学与工程里发生的事是怎么实现的：

- 为什么**符号求导**总能算、还精确，而**符号积分**难得多、有些甚至**根本没有初等答案**（而且计算机能**证明**这一点）？
- **Gröbner 基**——多元方程组的「高斯消元」——凭什么被称作计算机代数的明珠？
- 为什么五次以上的方程**没有求根公式**，而计算机代数系统「知道」这件事？
- 符号计算的阿喀琉斯之踵——**表达式膨胀**——是什么，为什么它不能取代数值计算？

## 路线图：七站

1. **地基 · 一切都是表达式树** —— [表达式即树](https://daiw.org/manual/symbolic-computing/expression-tree)、[精确数](https://daiw.org/manual/symbolic-computing/exact-numbers)（有理数/大整数/根式）、[自动化简的边界](https://daiw.org/manual/symbolic-computing/auto-simplification)。
2. **内核 · 符号即规则重写** —— [替换与模式匹配](https://daiw.org/manual/symbolic-computing/substitution-matching)、[计算即重写](https://daiw.org/manual/symbolic-computing/term-rewriting)（本质篇）。
3. **代数引擎 · 主流方法** —— [多项式](https://daiw.org/manual/symbolic-computing/polynomials)、[因式分解与 GCD](https://daiw.org/manual/symbolic-computing/factor-gcd)、[Gröbner 基](https://daiw.org/manual/symbolic-computing/groebner)。
4. **微积分的符号版** —— [符号求导](https://daiw.org/manual/symbolic-computing/symbolic-diff)、[符号积分](https://daiw.org/manual/symbolic-computing/symbolic-integration)、[极限与级数](https://daiw.org/manual/symbolic-computing/limits-series)、[符号解 ODE](https://daiw.org/manual/symbolic-computing/symbolic-ode)。
5. **精确求解** —— [解方程](https://daiw.org/manual/symbolic-computing/equation-solving)、[符号线性代数](https://daiw.org/manual/symbolic-computing/symbolic-linalg)。
6. **工具、生态与陷阱** —— [主流 CAS 全景](https://daiw.org/manual/symbolic-computing/cas-landscape)、[表达式膨胀](https://daiw.org/manual/symbolic-computing/expression-swell)、[符号 vs 数值](https://daiw.org/manual/symbolic-computing/symbolic-vs-numeric)。
7. **收尾** —— [一张图串起全篇](https://daiw.org/manual/symbolic-computing/recap)。

准备好了吗？我们从最基础、也最重要的一个洞察开始：**你眼里的公式，在计算机眼里是一棵树。** 👉 [表达式即树](https://daiw.org/manual/symbolic-computing/expression-tree)。

## 本专栏篇目

- [符号计算的艺术](https://daiw.org/manual/symbolic-computing.md): 让计算机像人一样「推公式」——不是算出 1.414，而是保留 √2 本身。这个专栏从「表达式是一棵树、计算是按规则重写这棵树」讲起，用 SymPy 代码优先，一路走过精确数、多项式、Gröbner 基、符号积分、方程精确解，详解业内主流的计算机代数方法，并揭示一个朴素而深刻的本质：计算，就是符号变换。

### 地基 · 一切都是表达式树

- [表达式即树 · 符号计算的第一性原理](https://daiw.org/manual/symbolic-computing/expression-tree.md): 你眼里的公式 x²+2x+1 是一行字符，计算机眼里却是一棵结构化的树：一个加法节点，挂着三个孩子。这一章用 SymPy 的 srepr、.func、.args 把这棵树剖开——理解了「表达式是树」，你就抓住了整个符号计算的地基。
- [精确数 · 有理数、大整数与根式](https://daiw.org/manual/symbolic-computing/exact-numbers.md): 符号计算的底气，是它的数从不四舍五入。1/3 就是 1/3，不是 0.333；50 的阶乘一位不差；√2 平方精确等于 2。这一章讲清 SymPy 的整数（任意精度）、有理数（精确分数）和根式，以及「精确」这件事到底意味着什么。
- [自动化简的边界 · 为什么 sin²+cos² 不自动等于 1](https://daiw.org/manual/symbolic-computing/auto-simplification.md): x+x 自动变成 2x，sin²+cos² 却不自动变成 1——这不是 SymPy 偷懒，而是一个深刻的事实：判断一个表达式是否等于零，在一般情况下是「不可判定」的。这一章讲清自动化简的边界、「最简」的模糊，以及为什么 simplify 只能是一个尽力而为的启发式操作。

### 内核 · 符号即规则重写

- [替换与模式匹配 · 符号操作的基本动作](https://daiw.org/manual/symbolic-computing/substitution-matching.md): 求导、化简、解方程，底层都是同一个动作：在表达式树里找到一个模式，把它替换掉。这一章讲清 SymPy 的三件基本兵器——subs（替换）、match（模式匹配）、replace（按模式批量替换），它们是下一章「计算即重写」的砖石。
- [计算即重写 · 逻辑计算的本质](https://daiw.org/manual/symbolic-computing/term-rewriting.md): 这是全专栏最深的一章。求导只是 5 条规则的递归应用；把这个想法推到极致，你会发现符号计算的全部，乃至「计算」本身，都是同一件事——按规则把符号一步步重写。这条线索把 CAS、λ 演算、Lisp 和数理逻辑连成了一体。

### 代数引擎 · 主流方法

- [多项式 · 符号计算的主力](https://daiw.org/manual/symbolic-computing/polynomials.md): 计算机代数系统里，绝大多数硬核操作最后都落到多项式上。这一章讲清多项式的展开、合并、次数与系数，专门的 Poly 对象，以及最关键的多项式除法——它是下一章 GCD 与因式分解的地基。
- [因式分解与最大公因式 · 系数域的魔法](https://daiw.org/manual/symbolic-computing/factor-gcd.md): 把 x⁴-1 拆成 （x-1）(x+1)（x²+1），把 x²-2 拆成含 √2 的因子——因式分解的答案取决于「系数从哪个数集来」。这一章讲清因式分解、多项式版欧几里得算法求 GCD，以及一个反直觉的事实：多项式因式分解其实是「快」的，不像整数分解那样难。
- [Gröbner 基 · 多项式方程组的高斯消元](https://daiw.org/manual/symbolic-computing/groebner.md): 线性方程组有高斯消元，把它化成上三角、逐个回代。多元「非线性」多项式方程组呢？Gröbner 基就是它的对应物——一组等价却「三角化」的多项式，让方程组能被逐个解出。这一章用一个能跑的例子，把这个被誉为计算机代数明珠的算法讲得看得见摸得着。

### 微积分的符号版

- [符号微分 · 机械的规则](https://daiw.org/manual/symbolic-computing/symbolic-diff.md): 符号求导是符号计算里最「顺」的操作：一组有限的规则，机械地递归应用，总能算、还精确。这一章看 SymPy 的 diff、高阶与偏导，并说清它和数值微分的天壤之别，以及它如何长成了深度学习的引擎——自动微分。
- [符号积分 · 为什么难得多](https://daiw.org/manual/symbolic-computing/symbolic-integration.md): 求导是机械的，积分却是一门「艺术」——没有万能规则，有些函数（比如 e^（-x²））根本没有初等原函数，而计算机能证明这一点。这一章讲清这个惊人的不对称、特殊函数从哪来，以及背后那套优雅的判定理论：Risch 算法与 Liouville 定理。
- [极限与级数 · 无穷的符号化](https://daiw.org/manual/symbolic-computing/limits-series.md): 极限和 Taylor 级数是分析学的两块基石，符号计算把它们也变成了机械操作。这一章看 SymPy 怎么精确求极限（包括 0/0、∞ 这些棘手情形）、怎么把函数展成幂级数，以及这些能力在近似、渐近分析里的用处。
- [符号解微分方程 · 分类，然后套已知方法](https://daiw.org/manual/symbolic-computing/symbolic-ode.md): 已知函数与它导数的关系，反求这个函数——这就是解微分方程。符号地解 ODE，核心是「先给方程分类，再套那类方程的已知解法」。这一章看 SymPy 的 dsolve、classify_ode，并说清它和数值解 ODE 的分工：能求闭式就符号，求不出就数值。

### 精确求解

- [解方程 · 精确的根，与一堵数学的墙](https://daiw.org/manual/symbolic-computing/equation-solving.md): solve 给出方程的精确根：二次是求根公式，三次四次也有（繁琐的）根式解。但到了五次，一堵墙立在那里——Abel-Ruffini 定理证明：五次以上方程没有通用的根式解。这一章看符号求解的威力，以及计算机如何「知道」并诚实面对这堵墙。
- [符号线性代数 · 精确的矩阵，与一次漂亮的「打脸」](https://daiw.org/manual/symbolic-computing/symbolic-linalg.md): 符号地做线性代数：精确的行列式、逆、特征值，矩阵元素还能是变量。这一章最精彩的是一处回扣——孪生的数值专栏千叮万嘱「绝不要用特征多项式求特征值」，符号世界里却正大光明地这么做。同一件事，两种世界，答案相反。

### 工具、生态与陷阱

- [主流 CAS 全景 · 从 Macsyma 到 Mathematica](https://daiw.org/manual/symbolic-computing/cas-landscape.md): 计算机代数系统有一整个生态：商业的 Mathematica、Maple，开源的 SymPy、SageMath、Maxima，以及一批专用利器。这一章带你俯瞰全景，理清各家所长，并回溯它们共同的起点——1968 年 MIT 那个用 Lisp 写的 Macsyma。
- [表达式膨胀 · 符号计算的阿喀琉斯之踵](https://daiw.org/manual/symbolic-computing/expression-swell.md): 符号计算最大的软肋，是表达式会爆炸式增长——一个 n×n 符号行列式有 n! 项，中间结果能撑到几百兆字节，把内存和时间一起吃光。这一章看膨胀怎么发生、为什么它是「精确」的必然代价，以及能怎么缓解。
- [符号 vs 数值 · 何时用哪个，以及怎么合体](https://daiw.org/manual/symbolic-computing/symbolic-vs-numeric.md): 符号计算精确但可能爆炸，数值计算高效但有误差——它们是一对互补的世界观。这一章给出清晰的决策框架：什么时候用符号、什么时候用数值，以及那个把两者优点合一的杀手锏：lambdify——先符号推导公式，再编译成飞快的数值函数。

### 收尾

- [收尾 · 一张图串起全篇](https://daiw.org/manual/symbolic-computing/recap.md): 七站走完，回头看。这一章不讲新知识，而是把整条专栏的主线——表达式是树、计算即重写、精确的力量与代价、一道道「不可能」的墙，以及符号与数值的互补——收拢成一张全景图和一套世界观，并回到那个最深的命题：计算，就是符号变换。
