# Sympy

> SymPy 是 Python 符号数学库，支持使用数学符号进行精确计算而非数值近似。当用户需要进行符号代数、微积分、方程求解、矩阵运算、物理计算或代码生成时使用。触发词：符号计算、符号数学、SymPy、方程求解、微积分、矩阵符号运算、符号代数。

- Skill: `kscz0000/sympy` (Agent Skill)
- Install (CLI): `npx skillmds@latest add kscz0000/sympy`
- Raw SKILL.md: https://api.skillmd.com/api/skills/kscz0000/sympy/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: https://github.com/sympy/sympy/blob/master/LICENSE
- Author: kscz0000 (https://skillmd.com/u/kscz0000)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/kscz0000/sympy

---


# SymPy - Python 符号数学库

## 概述

SymPy 是一个用于符号数学的 Python 库，支持使用数学符号进行精确计算而非数值近似。本技能提供使用 SymPy 进行符号代数、微积分、线性代数、方程求解、物理计算和代码生成的全面指导。

## 何时使用此技能

在以下场景使用此技能：
- 符号求解方程（代数方程、微分方程、方程组）
- 执行微积分运算（导数、积分、极限、级数）
- 操作和简化代数表达式
- 符号矩阵和线性代数运算
- 物理计算（力学、量子力学、向量分析）
- 数论计算（素数、因式分解、模运算）
- 几何计算（2D/3D 几何、解析几何）
- 将数学表达式转换为可执行代码（Python、C、Fortran）
- 生成 LaTeX 或其他格式的数学输出
- 需要精确的数学结果（例如 `sqrt(2)` 而非 `1.414...`）

## 核心能力

### 1. 符号计算基础

**创建符号和表达式：**
```python
from sympy import symbols, Symbol
x, y, z = symbols('x y z')
expr = x**2 + 2*x + 1

# 带假设条件
x = symbols('x', real=True, positive=True)
n = symbols('n', integer=True)
```

**简化和操作：**
```python
from sympy import simplify, expand, factor, cancel
simplify(sin(x)**2 + cos(x)**2)  # 返回 1
expand((x + 1)**3)  # x**3 + 3*x**2 + 3*x + 1
factor(x**2 - 1)    # (x - 1)*(x + 1)
```

**详细基础内容：** 参见 `references/core-capabilities.md`

### 2. 微积分

**导数：**
```python
from sympy import diff
diff(x**2, x)        # 2*x
diff(x**4, x, 3)     # 24*x (三阶导数)
diff(x**2*y**3, x, y)  # 6*x*y**2 (偏导数)
```

**积分：**
```python
from sympy import integrate, oo
integrate(x**2, x)              # x**3/3 (不定积分)
integrate(x**2, (x, 0, 1))      # 1/3 (定积分)
integrate(exp(-x), (x, 0, oo))  # 1 (广义积分)
```

**极限和级数：**
```python
from sympy import limit, series
limit(sin(x)/x, x, 0)  # 1
series(exp(x), x, 0, 6)  # 1 + x + x**2/2 + x**3/6 + x**4/24 + x**5/120 + O(x**6)
```

**详细微积分运算：** 参见 `references/core-capabilities.md`

### 3. 方程求解

**代数方程：**
```python
from sympy import solveset, solve, Eq
solveset(x**2 - 4, x)  # {-2, 2}
solve(Eq(x**2, 4), x)  # [-2, 2]
```

**方程组：**
```python
from sympy import linsolve, nonlinsolve
linsolve([x + y - 2, x - y], x, y)  # {(1, 1)} (线性)
nonlinsolve([x**2 + y - 2, x + y**2 - 3], x, y)  # (非线性)
```

**微分方程：**
```python
from sympy import Function, dsolve, Derivative
f = symbols('f', cls=Function)
dsolve(Derivative(f(x), x) - f(x), f(x))  # Eq(f(x), C1*exp(x))
```

**详细求解方法：** 参见 `references/core-capabilities.md`

### 4. 矩阵和线性代数

**矩阵创建和运算：**
```python
from sympy import Matrix, eye, zeros
M = Matrix([[1, 2], [3, 4]])
M_inv = M**-1  # 逆矩阵
M.det()        # 行列式
M.T            # 转置
```

**特征值和特征向量：**
```python
eigenvals = M.eigenvals()  # {特征值: 重数}
eigenvects = M.eigenvects()  # [(特征值, 重数, [特征向量])]
P, D = M.diagonalize()  # M = P*D*P^-1
```

**求解线性方程组：**
```python
A = Matrix([[1, 2], [3, 4]])
b = Matrix([5, 6])
x = A.solve(b)  # 求解 Ax = b
```

**完整线性代数内容：** 参见 `references/matrices-linear-algebra.md`

### 5. 物理和力学

**经典力学：**
```python
from sympy.physics.mechanics import dynamicsymbols, LagrangesMethod
from sympy import symbols

# 定义系统
q = dynamicsymbols('q')
m, g, l = symbols('m g l')

# 拉格朗日量 (T - V)
L = m*(l*q.diff())**2/2 - m*g*l*(1 - cos(q))

# 应用拉格朗日方法
LM = LagrangesMethod(L, [q])
```

**向量分析：**
```python
from sympy.physics.vector import ReferenceFrame, dot, cross
N = ReferenceFrame('N')
v1 = 3*N.x + 4*N.y
v2 = 1*N.x + 2*N.z
dot(v1, v2)  # 点积
cross(v1, v2)  # 叉积
```

**量子力学：**
```python
from sympy.physics.quantum import Ket, Bra, Commutator
psi = Ket('psi')
A = Operator('A')
comm = Commutator(A, B).doit()
```

**详细物理能力：** 参见 `references/physics-mechanics.md`

### 6. 高级数学

本技能包含以下全面支持：

- **几何：** 2D/3D 解析几何、点、线、圆、多边形、变换
- **数论：** 素数、因式分解、GCD/LCM、模运算、丢番图方程
- **组合数学：** 排列、组合、分拆、群论
- **逻辑和集合：** 布尔逻辑、集合论、有限集和无限集
- **统计学：** 概率分布、随机变量、期望、方差
- **特殊函数：** Gamma 函数、Bessel 函数、正交多项式、超几何函数
- **多项式：** 多项式代数、根、因式分解、Groebner 基

**详细高级主题：** 参见 `references/advanced-topics.md`

### 7. 代码生成和输出

**转换为可执行函数：**
```python
from sympy import lambdify
import numpy as np

expr = x**2 + 2*x + 1
f = lambdify(x, expr, 'numpy')  # 创建 NumPy 函数
x_vals = np.linspace(0, 10, 100)
y_vals = f(x_vals)  # 快速数值计算
```

**生成 C/Fortran 代码：**
```python
from sympy.utilities.codegen import codegen
[(c_name, c_code), (h_name, h_header)] = codegen(
    ('my_func', expr), 'C'
)
```

**LaTeX 输出：**
```python
from sympy import latex
latex_str = latex(expr)  # 转换为 LaTeX 用于文档
```

**完整代码生成内容：** 参见 `references/code-generation-printing.md`

## 使用 SymPy 的最佳实践

### 1. 始终先定义符号

```python
from sympy import symbols
x, y, z = symbols('x y z')
# 现在 x, y, z 可以在表达式中使用
```

### 2. 使用假设条件获得更好的简化

```python
x = symbols('x', positive=True, real=True)
sqrt(x**2)  # 返回 x（而非 Abs(x)），因为正数假设
```

常用假设：`real`、`positive`、`negative`、`integer`、`rational`、`complex`、`even`、`odd`

### 3. 使用精确算术

```python
from sympy import Rational, S
# 正确（精确）：
expr = Rational(1, 2) * x
expr = S(1)/2 * x

# 错误（浮点数）：
expr = 0.5 * x  # 创建近似值
```

### 4. 需要时进行数值计算

```python
from sympy import pi, sqrt
result = sqrt(8) + pi
result.evalf()    # 5.96371554103586
result.evalf(50)  # 50 位精度
```

### 5. 转换为 NumPy 以提高性能

```python
# 大量计算时慢：
for x_val in range(1000):
    result = expr.subs(x, x_val).evalf()

# 快速：
f = lambdify(x, expr, 'numpy')
results = f(np.arange(1000))
```

### 6. 使用适当的求解器

- `solveset`：代数方程（首选）
- `linsolve`：线性方程组
- `nonlinsolve`：非线性方程组
- `dsolve`：微分方程
- `solve`：通用求解（遗留但灵活）

## 参考文件结构

本技能使用模块化参考文件来涵盖不同能力：

1. **`core-capabilities.md`**：符号、代数、微积分、简化、方程求解
   - 加载时机：基础符号计算、微积分或求解方程

2. **`matrices-linear-algebra.md`**：矩阵运算、特征值、线性方程组
   - 加载时机：处理矩阵或线性代数问题

3. **`physics-mechanics.md`**：经典力学、量子力学、向量、单位
   - 加载时机：物理计算或力学问题

4. **`advanced-topics.md`**：几何、数论、组合数学、逻辑、统计学
   - 加载时机：基础代数和微积分之外的高级数学主题

5. **`code-generation-printing.md`**：lambdify、codegen、LaTeX 输出、打印
   - 加载时机：将表达式转换为代码或生成格式化输出

## 常见用例模式

### 模式 1：求解并验证

```python
from sympy import symbols, solve, simplify
x = symbols('x')

# 求解方程
equation = x**2 - 5*x + 6
solutions = solve(equation, x)  # [2, 3]

# 验证解
for sol in solutions:
    result = simplify(equation.subs(x, sol))
    assert result == 0
```

### 模式 2：符号到数值流水线

```python
# 1. 定义符号问题
x, y = symbols('x y')
expr = sin(x) + cos(y)

# 2. 符号操作
simplified = simplify(expr)
derivative = diff(simplified, x)

# 3. 转换为数值函数
f = lambdify((x, y), derivative, 'numpy')

# 4. 数值计算
results = f(x_data, y_data)
```

### 模式 3：记录数学结果

```python
# 符号计算结果
integral_expr = Integral(x**2, (x, 0, 1))
result = integral_expr.doit()

# 生成文档
print(f"LaTeX: {latex(integral_expr)} = {latex(result)}")
print(f"美观打印: {pretty(integral_expr)} = {pretty(result)}")
print(f"数值: {result.evalf()}")
```

## 与科学工作流集成

### 与 NumPy 集成

```python
import numpy as np
from sympy import symbols, lambdify

x = symbols('x')
expr = x**2 + 2*x + 1

f = lambdify(x, expr, 'numpy')
x_array = np.linspace(-5, 5, 100)
y_array = f(x_array)
```

### 与 Matplotlib 集成

```python
import matplotlib.pyplot as plt
import numpy as np
from sympy import symbols, lambdify, sin

x = symbols('x')
expr = sin(x) / x

f = lambdify(x, expr, 'numpy')
x_vals = np.linspace(-10, 10, 1000)
y_vals = f(x_vals)

plt.plot(x_vals, y_vals)
plt.show()
```

### 与 SciPy 集成

```python
from scipy.optimize import fsolve
from sympy import symbols, lambdify

# 符号定义方程
x = symbols('x')
equation = x**3 - 2*x - 5

# 转换为数值函数
f = lambdify(x, equation, 'numpy')

# 用初始猜测数值求解
solution = fsolve(f, 2)
```

## 快速参考：最常用函数

```python
# 符号
from sympy import symbols, Symbol
x, y = symbols('x y')

# 基本运算
from sympy import simplify, expand, factor, collect, cancel
from sympy import sqrt, exp, log, sin, cos, tan, pi, E, I, oo

# 微积分
from sympy import diff, integrate, limit, series, Derivative, Integral

# 求解
from sympy import solve, solveset, linsolve, nonlinsolve, dsolve

# 矩阵
from sympy import Matrix, eye, zeros, ones, diag

# 逻辑和集合
from sympy import And, Or, Not, Implies, FiniteSet, Interval, Union

# 输出
from sympy import latex, pprint, lambdify, init_printing

# 工具
from sympy import evalf, N, nsimplify
```

## 入门示例

### 示例 1：求解二次方程
```python
from sympy import symbols, solve, sqrt
x = symbols('x')
solution = solve(x**2 - 5*x + 6, x)
# [2, 3]
```

### 示例 2：计算导数
```python
from sympy import symbols, diff, sin
x = symbols('x')
f = sin(x**2)
df_dx = diff(f, x)
# 2*x*cos(x**2)
```

### 示例 3：计算积分
```python
from sympy import symbols, integrate, exp
x = symbols('x')
integral = integrate(x * exp(-x**2), (x, 0, oo))
# 1/2
```

### 示例 4：矩阵特征值
```python
from sympy import Matrix
M = Matrix([[1, 2], [2, 1]])
eigenvals = M.eigenvals()
# {3: 1, -1: 1}
```

### 示例 5：生成 Python 函数
```python
from sympy import symbols, lambdify
import numpy as np
x = symbols('x')
expr = x**2 + 2*x + 1
f = lambdify(x, expr, 'numpy')
f(np.array([1, 2, 3]))
# array([ 4,  9, 16])
```

## 常见问题排查

1. **"NameError: name 'x' is not defined"**
   - 解决方案：使用前始终用 `symbols()` 定义符号

2. **意外的数值结果**
   - 问题：使用浮点数如 `0.5` 而非 `Rational(1, 2)`
   - 解决方案：使用 `Rational()` 或 `S()` 进行精确算术

3. **循环中性能缓慢**
   - 问题：重复使用 `subs()` 和 `evalf()`
   - 解决方案：使用 `lambdify()` 创建快速数值函数

4. **"Can't solve this equation"**
   - 尝试不同的求解器：`solve`、`solveset`、`nsolve`（数值）
   - 检查方程是否可代数求解
   - 如果不存在闭式解，使用数值方法

5. **简化未按预期工作**
   - 尝试不同的简化函数：`simplify`、`factor`、`expand`、`trigsimp`
   - 为符号添加假设条件（如 `positive=True`）
   - 使用 `simplify(expr, force=True)` 进行强制简化

## 其他资源

- 官方文档：https://docs.sympy.org/
- 教程：https://docs.sympy.org/latest/tutorials/intro-tutorial/index.html
- API 参考：https://docs.sympy.org/latest/reference/index.html
- 示例：https://github.com/sympy/sympy/tree/master/examples

## 限制
- 仅当任务明确符合上述描述的范围时使用此技能。
- 不要将输出视为环境特定验证、测试或专家审查的替代品。
- 如果缺少所需的输入、权限、安全边界或成功标准，请停止并请求澄清。

