mcpField
A
alterlab-sympy

alterlab-sympy

github.com/alterlab-ieu其他7872 次安装5 周前更新
代码仓库

关于 alterlab-sympy

alterlab-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/alterlab-ieu/alterlab-academic-skills --skill alterlab-sympy

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

包含的文件

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

evals/
evals.json
references/
advanced-topics.md
code-generation-printing.md
core-capabilities.md
matrices-linear-algebra.md
physics-mechanics.md

详细介绍

SymPy - Python 中的符号数学

概述

SymPy 是一个用于符号数学的 Python 库,可使用数学符号而非数值近似进行精确计算。本技能全面介绍如何使用 SymPy 进行符号代数、微积分、线性代数、方程求解、物理计算和代码生成。

何时使用此技能

在以下情况下使用此技能:

  • 符号求解方程(代数方程、微分方程、方程组)
  • 执行微积分运算(导数、积分、极限、级数)
  • 操作和化简代数表达式
  • 使用矩阵和符号线性代数
  • 进行物理计算(力学、量子力学、向量分析)
  • 进行数论计算(素数、因式分解、模运算)
  • 进行几何计算(二维/三维几何、解析几何)
  • 将数学表达式转换为可执行代码(Python、C、Fortran)
  • 生成 LaTeX 或其他格式的数学输出
  • 需要精确的数学结果(例如,sqrt(2),而不是 1.414...)
不适用的情况
场景请改用
对数据拟合统计模型或运行假设检验alterlab-statistical-analysis
数值多目标或约束优化(Pareto 前沿、NSGA-II)alterlab-pymoo
对开放量子系统进行数值模拟(主方程、Lindblad 动力学)alterlab-qutip
带单位的天文学计算(坐标、宇宙学、FITS)alterlab-astropy

核心功能

1. 符号计算基础

创建符号和表达式:

from sympy import symbols, Symbol
x, y, z = symbols('x y z')
expr = x**2 + 2*x + 1

# With assumptions
x = symbols('x', real=True, positive=True)
n = symbols('n', integer=True)

化简和操作:

from sympy import simplify, expand, factor, cancel
simplify(sin(x)**2 + cos(x)**2)  # Returns 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. 微积分

导数:

from sympy import diff
diff(x**2, x)        # 2*x
diff(x**4, x, 3)     # 24*x (third derivative)
diff(x**2*y**3, x, y)  # 6*x*y**2 (partial derivatives)

积分:

from sympy import integrate, oo
integrate(x**2, x)              # x**3/3 (indefinite)
integrate(x**2, (x, 0, 1))      # 1/3 (definite)
integrate(exp(-x), (x, 0, oo))  # 1 (improper)

极限和级数:

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. 方程求解

代数方程:

from sympy import solveset, solve, Eq
solveset(x**2 - 4, x)  # {-2, 2}
solve(Eq(x**2, 4), x)  # [-2, 2]

方程组:

from sympy import linsolve, nonlinsolve
linsolve([x + y - 2, x - y], x, y)  # {(1, 1)} (linear)
nonlinsolve([x**2 + y - 2, x + y**2 - 3], x, y)  # (nonlinear)

微分方程:

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. 矩阵和线性代数

矩阵创建和运算:

from sympy import Matrix, eye, zeros
M = Matrix([[1, 2], [3, 4]])
M_inv = M**-1  # Inverse
M.det()        # Determinant
M.T            # Transpose

特征值和特征向量:

eigenvals = M.eigenvals()  # {eigenvalue: multiplicity}
eigenvects = M.eigenvects()  # [(eigenval, mult, [eigenvectors])]
P, D = M.diagonalize()  # M = P*D*P^-1

求解线性方程组:

A = Matrix([[1, 2], [3, 4]])
b = Matrix([5, 6])
x = A.solve(b)  # Solve Ax = b

全面的线性代数内容: 请参阅 references/matrices-linear-algebra.md

5. 物理和力学

经典力学:

from sympy.physics.mechanics import dynamicsymbols, LagrangesMethod
from sympy import symbols

# Define system
q = dynamicsymbols('q')
m, g, l = symbols('m g l')

# Lagrangian (T - V)
L = m*(l*q.diff())**2/2 - m*g*l*(1 - cos(q))

# Apply Lagrange's method
LM = LagrangesMethod(L, [q])

向量分析:

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)  # Dot product
cross(v1, v2)  # Cross product

量子力学:

from sympy.physics.quantum import Ket, Operator, Commutator
psi = Ket('psi')
A, B = Operator('A'), Operator('B')
comm = Commutator(A, B).doit()  # A*B - B*A

详细的物理功能: 请参阅 references/physics-mechanics.md

6. 高等数学

本技能全面支持以下内容:

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

详细的高等主题: 请参阅 references/advanced-topics.md

7. 代码生成和输出

转换为可执行函数:

from sympy import lambdify
import numpy as np

expr = x**2 + 2*x + 1
f = lambdify(x, expr, 'numpy')  # Create NumPy function
x_vals = np.linspace(0, 10, 100)
y_vals = f(x_vals)  # Fast numerical evaluation

生成 C/Fortran 代码:

from sympy.utilities.codegen import codegen
[(c_name, c_code), (h_name, h_header)] = codegen(
    ('my_func', expr), 'C'
)

LaTeX 输出:

from sympy import latex
latex_str = latex(expr)  # Convert to LaTeX for documents

全面的代码生成内容: 请参阅 references/code-generation-printing.md

使用 SymPy:最佳实践

1. 先定义符号

SymPy 只会将通过 symbols()(或 Symbol)创建的名称视为数学变量;未定义的名称会引发 NameError。

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()}")

与科学工作流的集成

lambdify 是从符号 SymPy 过渡到数值计算栈的桥梁:先进行精确推导和化简,再编译为快速可调用对象,以供 NumPy、Matplotlib 或 SciPy 使用。对于 NumPy 绘图,模式与最佳实践 #5 中的相同(在 np.linspace 上使用 lambdify(x, expr, 'numpy'))。一个常见但不太显然的情况是,将符号方程传递给数值求根器:

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

# Derive symbolically, then solve numerically where no closed form exists
x = symbols('x')
f = lambdify(x, x**3 - 2*x - 5, 'numpy')
solution = fsolve(f, 2)  # initial guess 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 (numerical eval: N(expr) or expr.evalf())
from sympy import N, nsimplify, simplify, S, Rational

常见问题排查

  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)
    • powsimp、expand_log 和 logcombine 接受 force=True,可忽略假设(simplify 没有 force 选项)

其他资源

属于 AlterLab Academic Skills 套件。

评论

支持 Markdown