SuperAPI AI 工具集

sympy

数据与分析

查看项目

更新于 10-21 16:27

技能介绍

用途

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

安装与版本

资料显示该技能针对 SymPy 1.14.0(稳定版;2025 年 4 月)测试,要求 Python 3.9+。

# 使用 uv 安装 SymPy
uv pip install "sympy>=1.14"

# 可选:用于 lambdify 和绘图示例
uv pip install numpy scipy matplotlib

检查版本:

import sympy
print(sympy.__version__)

适用场景

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

主要能力

资料在 references/core_capabilities.md 中记录了七个能力领域:

  1. 符号计算基础——符号、表达式、化简、代入。
  2. 微积分——微分、积分、极限、级数。
  3. 方程求解——solve、solveset、线性与非线性系统、常微分方程。
  4. 矩阵与线性代数——见 references/matrices-linear-algebra.md。
  5. 物理与力学——见 references/physics-mechanics.md。
  6. 进阶数学——见 references/advanced-topics.md。
  7. 代码生成与输出——见 references/code-generation-printing.md。

前三项的深入内容见 references/core-capabilities.md。

使用方式与最佳实践

  1. 始终先定义符号:
from sympy import symbols
x, y, z = symbols('x y z')
  1. 使用假设以获得更好的化简:
x = symbols('x', positive=True, real=True)
sqrt(x**2)  # 由于 positive 假设,返回 x(而非 Abs(x))

常见假设:real、positive、negative、integer、rational、complex、even、odd。

  1. 使用精确算术:
from sympy import Rational, S
# 正确(精确):
expr = Rational(1, 2) * x
expr = S(1)/2 * x

# 错误(浮点):
expr = 0.5 * x  # 产生近似值
  1. 需要时进行数值求值:
from sympy import pi, sqrt
result = sqrt(8) + pi
result.evalf()    # 5.96371554103586
result.evalf(50)  # 50 位精度
  1. 转换为 NumPy 以提升性能:
# 多次求值时较慢:
for x_val in range(1000):
    result = expr.subs(x, x_val).evalf()

# 快速:
f = lambdify(x, expr, 'numpy')
results = f(np.arange(1000))
  1. 使用合适的求解器:solveset 用于代数方程(首选);linsolve 用于线性系统;nonlinsolve 用于非线性系统;dsolve 用于微分方程;solve 为通用(旧版,但灵活)。

参考文件结构

该技能使用模块化参考文件对应不同能力:core-capabilities.md(符号、代数、微积分、化简、方程求解);matrices-linear-algebra.md(矩阵运算、特征值、线性系统);physics-mechanics.md(经典力学、量子力学、向量、单位);advanced-topics.md(几何、数论、组合数学、逻辑、统计);code-generation-printing.md(lambdify、codegen、LaTeX 输出、打印)。

常见用例模式

模式 1:求解并验证——用 solve 求解方程,再用 simplify 代入验证结果为零。

模式 2:符号到数值流水线——定义符号问题、符号化操作(如 simplify、diff)、用 lambdify 转换为数值函数、再进行数值求值。

模式 3:记录数学结果——符号计算积分等结果,再用 latex、pretty、evalf 生成文档输出。

与科学计算工作流集成

可与 NumPy 配合(用 lambdify 将表达式转为可作用于数组的函数)、与 Matplotlib 配合(对 lambdify 生成的函数绘图)、与 SciPy 配合(用 lambdify 转换方程后交给 scipy.optimize.fsolve 数值求解)。

常用函数速查

符号:symbols、Symbol。基本运算:simplify、expand、factor、collect、cancel、sqrt、exp、log、sin、cos、tan、pi、E、I、oo。微积分:diff、integrate、limit、series、Derivative、Integral。求解:solve、solveset、linsolve、nonlinsolve、dsolve。矩阵:Matrix、eye、zeros、ones、diag。逻辑与集合:And、Or、Not、Implies、FiniteSet、Interval、Union。输出:latex、pprint、lambdify、init_printing。工具:evalf、N、nsimplify。

入门示例

求解二次方程:solve(x**2 - 5*x + 6, x) 得到 [2, 3]。

求导:diff(sin(x2), x) 得到 2xcos(x2)。

求积分:integrate(x * exp(-x**2), (x, 0, oo)) 得到 1/2。

矩阵特征值:Matrix([[1, 2], [2, 1]]).eigenvals() 得到 {3: 1, -1: 1}。

生成 Python 函数:lambdify(x, x**2 + 2*x + 1, 'numpy') 作用于 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) 进行激进化简。

限制与注意事项

资料中的版本相关细节可能已过时,应针对已安装版本查阅官方文档确认。若指令中的函数、标志或端点在已安装版本中缺失,应查阅该版本文档并告知用户,不得虚构 API。不得编造结果、参数、标识符、引用或统计量;无法运行或验证的内容应如实说明。涉及花费金钱、占用共享 GPU 或云配额、触碰个人或患者数据、或不可撤销的操作前应先询问。

其他资源

官方文档: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 。