mcpField
S
sympy

sympy

github.com/kalarislabs其他7344 次安装4 天前更新
代码仓库

关于 sympy

这是 Python 符号数学库 SymPy 的使用指导技能,面向需要精确计算的用户,涵盖代数、微积分、方程、矩阵、物理计算,以及将表达式转换为代码或格式化输出。

主要功能

  1. 01精确符号运算
  2. 02微积分与方程求解
  3. 03符号矩阵运算
  4. 04物理与高级数学
  5. 05代码生成与 LaTeX 输出

适用场景

  1. 01求解方程并验证结果
  2. 02对表达式求导或积分
  3. 03计算符号矩阵特征值
  4. 04根据公式生成数值函数

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill sympy

安装后在 Claude Code 中输入/sympy确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
advanced-topics.md
code-generation-printing.md
core_capabilities.md
core-capabilities.md
matrices-linear-algebra.md
physics-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 中介绍了七个能力领域:

  1. 符号计算基础 — 符号、表达式、化简、替换。
  2. 微积分 — 求导、积分、极限、级数。
  3. 方程求解 — solve、solveset、线性和非线性方程组、ODE。
  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。

使用 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:通用求解器(旧版,但灵活)

参考文件结构

本技能使用模块化参考文件来介绍不同的能力:

  1. core-capabilities.md:符号、代数、微积分、化简、方程求解

    • 加载时机:进行基础符号计算、微积分或方程求解
  2. matrices-linear-algebra.md:矩阵运算、特征值、线性方程组

    • 加载时机:处理矩阵或线性代数问题
  3. physics-mechanics.md:经典力学、量子力学、向量、单位

    • 加载时机:进行物理计算或处理力学问题
  4. advanced-topics.md:几何、数论、组合数学、逻辑、统计学

    • 加载时机:处理基础代数和微积分之外的高级数学主题
  5. 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])

常见问题排查

  1. “NameError: name 'x' is not defined”

    • 解决方法:使用前务必通过 symbols() 定义符号
  2. 数值结果与预期不符

    • 问题:使用 0.5 这样的浮点数,而不是 Rational(1, 2)
    • 解决方法:使用 Rational() 或 S() 进行精确运算
  3. 循环中的性能缓慢

    • 问题:反复使用 subs() 和 evalf()
    • 解决方法:使用 lambdify() 创建快速数值函数
  4. “无法求解此方程”

    • 尝试使用不同的求解器:solve、solveset、nsolve(数值求解)
    • 检查方程是否可通过代数方法求解
    • 如果不存在闭式解,请使用数值方法
  5. 化简结果不符合预期

    • 尝试使用不同的化简函数:simplify、factor、expand、trigsimp
    • 为符号添加假设(例如,positive=True)
    • 使用 simplify(expr, force=True) 进行强力化简

更多资源

Agent 操作流程

  1. 检查环境。 确认 Python 环境和库版本(python -c "import pkg; print(pkg.__version__)"),并检查数据的形状、类型和缺失值。
  2. 明确输入。 根据数据或用户确认格式、标识符和参数。任何会改变结果的值都应询问确认,不要猜测。
  3. 先运行小规模版本。 先在样本或单个折上运行,并检查运行时间和内存占用。
  4. 使用上述说明和参考资料执行完整任务。
  5. 验证结果。 使用留出数据、固定随机种子和适当的指标;检查是否存在数据泄漏;报告不确定性(置信区间、不同随机种子的标准差)。
  6. 报告。 说明运行了什么(版本、命令、参数)、检查了什么,以及仍有哪些不确定之处。
如果出现以下情况请执行以下操作
内存不足或执行速度很慢使用子采样、分块或惰性计算,或者缩小模型规模,并告知用户所做的更改。
已安装版本中缺少这些说明里的函数、标志或端点查看已安装版本自己的文档(help()、--help、官方文档),调整用法并告知用户。切勿凭空编造 API。
必需的输入、标识符或参数含义不明确询问用户,或在运行前明确说明所采用的假设。

诚信准则

  • 切勿捏造结果、参数、标识符、引文或统计数据。如果无法运行或验证某项内容,请直言说明。
  • 切勿报告本次会话中未计算的指标;应展示生成每个数值的代码路径。
  • 此处与版本相关的细节可能已经过时:请对照已安装版本的官方文档进行确认。
  • 对于会产生费用、占用共享 GPU 或云配额、涉及个人或患者数据,或无法撤销的操作,须事先征得同意。

评论

支持 Markdown