关于 sympy
这是 Python 符号数学库 SymPy 的使用指导技能,面向需要精确计算的用户,涵盖代数、微积分、方程、矩阵、物理计算,以及将表达式转换为代码或格式化输出。
主要功能
- 01精确符号运算
- 02微积分与方程求解
- 03符号矩阵运算
- 04物理与高级数学
- 05代码生成与 LaTeX 输出
适用场景
- 01求解方程并验证结果
- 02对表达式求导或积分
- 03计算符号矩阵特征值
- 04根据公式生成数值函数
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill sympy安装后在 Claude Code 中输入/sympy确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/advanced-topics.mdcode-generation-printing.mdcore_capabilities.mdcore-capabilities.mdmatrices-linear-algebra.mdphysics-mechanics.md详细介绍
SymPy - Python 中的符号数学
概述
SymPy 是一个用于符号数学的 Python 库,可使用数学符号而非数值近似进行精确计算。本技能全面介绍如何使用 SymPy 执行符号代数、微积分、线性代数、方程求解、物理计算和代码生成。
安装
已针对 SymPy 1.14.0(稳定版;2025 年 4 月)进行测试。需要 Python 3.9+。
# Install SymPy using uv
uv pip install "sympy>=1.14"
# Optional: for lambdify and plotting examples
uv pip install numpy scipy matplotlib
检查版本:
import sympy
print(sympy.__version__)
何时使用本技能
在以下情况下使用本技能:
- 以符号方式求解方程(代数方程、微分方程、方程组)
- 执行微积分运算(导数、积分、极限、级数)
- 运算和简化代数表达式
- 以符号方式处理矩阵和线性代数
- 进行物理计算(力学、量子力学、向量分析)
- 进行数论计算(素数、因式分解、模运算)
- 进行几何计算(二维/三维几何、解析几何)
- 将数学表达式转换为可执行代码(Python、C、Fortran)
- 生成 LaTeX 或其他格式的数学输出
- 需要精确的数学结果(例如
sqrt(2),而非1.414...)
核心能力
references/core_capabilities.md 中介绍了七个能力领域:
- 符号计算基础 — 符号、表达式、化简、替换。
- 微积分 — 求导、积分、极限、级数。
- 方程求解 —
solve、solveset、线性和非线性方程组、ODE。 - 矩阵和线性代数 — 参见 references/matrices-linear-algebra.md。
- 物理和力学 — 参见 references/physics-mechanics.md。
- 高级数学 — 参见 references/advanced-topics.md。
- 代码生成和输出 — 参见 references/code-generation-printing.md。
前三个领域的深入介绍见 references/core-capabilities.md。
使用 SymPy 的最佳实践
1. 始终先定义符号
from sympy import symbols
x, y, z = symbols('x y z')
# Now x, y, z can be used in expressions
2. 使用假设以获得更好的化简效果
x = symbols('x', positive=True, real=True)
sqrt(x**2) # Returns x (not Abs(x)) due to positive assumption
常见假设:real、positive、negative、integer、rational、complex、even、odd
3. 使用精确算术
from sympy import Rational, S
# Correct (exact):
expr = Rational(1, 2) * x
expr = S(1)/2 * x
# Incorrect (floating-point):
expr = 0.5 * x # Creates approximate value
4. 按需进行数值计算
from sympy import pi, sqrt
result = sqrt(8) + pi
result.evalf() # 5.96371554103586
result.evalf(50) # 50 digits of precision
5. 转换为 NumPy 以提升性能
# Slow for many evaluations:
for x_val in range(1000):
result = expr.subs(x, x_val).evalf()
# Fast:
f = lambdify(x, expr, 'numpy')
results = f(np.arange(1000))
6. 使用合适的求解器
solveset:代数方程(首选)linsolve:线性方程组nonlinsolve:非线性方程组dsolve:微分方程solve:通用求解器(旧版,但灵活)
参考文件结构
本技能使用模块化参考文件来介绍不同的能力:
-
core-capabilities.md:符号、代数、微积分、化简、方程求解- 加载时机:进行基础符号计算、微积分或方程求解
-
matrices-linear-algebra.md:矩阵运算、特征值、线性方程组- 加载时机:处理矩阵或线性代数问题
-
physics-mechanics.md:经典力学、量子力学、向量、单位- 加载时机:进行物理计算或处理力学问题
-
advanced-topics.md:几何、数论、组合数学、逻辑、统计学- 加载时机:处理基础代数和微积分之外的高级数学主题
-
code-generation-printing.md:Lambdify、代码生成、LaTeX 输出、打印- 加载时机:将表达式转换为代码或生成格式化输出
常见用例模式
模式 1:求解并验证
from sympy import symbols, solve, simplify
x = symbols('x')
# Solve equation
equation = x**2 - 5*x + 6
solutions = solve(equation, x) # [2, 3]
# Verify solutions
for sol in solutions:
result = simplify(equation.subs(x, sol))
assert result == 0
模式 2:从符号到数值的流程
# 1. Define symbolic problem
x, y = symbols('x y')
expr = sin(x) + cos(y)
# 2. Manipulate symbolically
simplified = simplify(expr)
derivative = diff(simplified, x)
# 3. Convert to numerical function
f = lambdify((x, y), derivative, 'numpy')
# 4. Evaluate numerically
results = f(x_data, y_data)
模式 3:记录数学结果
# Compute result symbolically
integral_expr = Integral(x**2, (x, 0, 1))
result = integral_expr.doit()
# Generate documentation
print(f"LaTeX: {latex(integral_expr)} = {latex(result)}")
print(f"Pretty: {pretty(integral_expr)} = {pretty(result)}")
print(f"Numerical: {result.evalf()}")
与科学工作流集成
与 NumPy 集成
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 集成
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 集成
from scipy.optimize import fsolve
from sympy import symbols, lambdify
# Define equation symbolically
x = symbols('x')
equation = x**3 - 2*x - 5
# Convert to numerical function
f = lambdify(x, equation, 'numpy')
# Solve numerically with initial guess
solution = fsolve(f, 2)
快速参考:最常用的函数
# Symbols
from sympy import symbols, Symbol
x, y = symbols('x y')
# Basic operations
from sympy import simplify, expand, factor, collect, cancel
from sympy import sqrt, exp, log, sin, cos, tan, pi, E, I, oo
# Calculus
from sympy import diff, integrate, limit, series, Derivative, Integral
# Solving
from sympy import solve, solveset, linsolve, nonlinsolve, dsolve
# Matrices
from sympy import Matrix, eye, zeros, ones, diag
# Logic and sets
from sympy import And, Or, Not, Implies, FiniteSet, Interval, Union
# Output
from sympy import latex, pprint, lambdify, init_printing
# Utilities
from sympy import evalf, N, nsimplify
入门示例
示例 1:求解二次方程
from sympy import symbols, solve, sqrt
x = symbols('x')
solution = solve(x**2 - 5*x + 6, x)
# [2, 3]
示例 2:计算导数
from sympy import symbols, diff, sin
x = symbols('x')
f = sin(x**2)
df_dx = diff(f, x)
# 2*x*cos(x**2)
示例 3:计算积分
from sympy import symbols, integrate, exp
x = symbols('x')
integral = integrate(x * exp(-x**2), (x, 0, oo))
# 1/2
示例 4:矩阵特征值
from sympy import Matrix
M = Matrix([[1, 2], [2, 1]])
eigenvals = M.eigenvals()
# {3: 1, -1: 1}
示例 5:生成 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])
常见问题排查
-
“NameError: name 'x' is not defined”
- 解决方法:使用前务必通过
symbols()定义符号
- 解决方法:使用前务必通过
-
数值结果与预期不符
- 问题:使用
0.5这样的浮点数,而不是Rational(1, 2) - 解决方法:使用
Rational()或S()进行精确运算
- 问题:使用
-
循环中的性能缓慢
- 问题:反复使用
subs()和evalf() - 解决方法:使用
lambdify()创建快速数值函数
- 问题:反复使用
-
“无法求解此方程”
- 尝试使用不同的求解器:
solve、solveset、nsolve(数值求解) - 检查方程是否可通过代数方法求解
- 如果不存在闭式解,请使用数值方法
- 尝试使用不同的求解器:
-
化简结果不符合预期
- 尝试使用不同的化简函数:
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
Agent 操作流程
- 检查环境。 确认 Python 环境和库版本(
python -c "import pkg; print(pkg.__version__)"),并检查数据的形状、类型和缺失值。 - 明确输入。 根据数据或用户确认格式、标识符和参数。任何会改变结果的值都应询问确认,不要猜测。
- 先运行小规模版本。 先在样本或单个折上运行,并检查运行时间和内存占用。
- 使用上述说明和参考资料执行完整任务。
- 验证结果。 使用留出数据、固定随机种子和适当的指标;检查是否存在数据泄漏;报告不确定性(置信区间、不同随机种子的标准差)。
- 报告。 说明运行了什么(版本、命令、参数)、检查了什么,以及仍有哪些不确定之处。
| 如果出现以下情况 | 请执行以下操作 |
|---|---|
| 内存不足或执行速度很慢 | 使用子采样、分块或惰性计算,或者缩小模型规模,并告知用户所做的更改。 |
| 已安装版本中缺少这些说明里的函数、标志或端点 | 查看已安装版本自己的文档(help()、--help、官方文档),调整用法并告知用户。切勿凭空编造 API。 |
| 必需的输入、标识符或参数含义不明确 | 询问用户,或在运行前明确说明所采用的假设。 |
诚信准则
- 切勿捏造结果、参数、标识符、引文或统计数据。如果无法运行或验证某项内容,请直言说明。
- 切勿报告本次会话中未计算的指标;应展示生成每个数值的代码路径。
- 此处与版本相关的细节可能已经过时:请对照已安装版本的官方文档进行确认。
- 对于会产生费用、占用共享 GPU 或云配额、涉及个人或患者数据,或无法撤销的操作,须事先征得同意。