mcpField
S
sympy

sympy

github.com/hkphysics数据与数据库045 次安装19 周前更新
代码仓库

关于 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/hkphysics/scientific-agent-skills --skill sympy

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

包含的文件

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

references/
advanced-topics.md
code-generation-printing.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...)

核心功能

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, Bra, Operator, Commutator
A, B = Operator('A'), Operator('B')
psi = Ket('psi')
comm = Commutator(A, B).doit()

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

6. 高等数学

本技能提供全面支持,包括:

  • 几何: 二维/三维解析几何、点、直线、圆、多边形、变换
  • 数论: 素数、因式分解、最大公约数/最小公倍数、模运算、丢番图方程
  • 组合数学: 排列、组合、划分、群论
  • 逻辑与集合: 布尔逻辑、集合论、有限集和无限集
  • 统计学: 概率分布、随机变量、期望、方差
  • 特殊函数: Gamma 函数、贝塞尔函数、正交多项式、超几何函数
  • 多项式: 多项式代数、根、因式分解、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. 始终先定义符号
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. “Can't solve this equation”

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

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

其他资源

评论

支持 Markdown