alterlab-sympy について
alterlab-sympyは、Pythonの記号数学ライブラリSymPyの利用を支援するスキルです。研究者や開発者が代数、微積分、方程式、行列、物理計算、コード生成を扱う際に役立ちます。
主な機能
- 01記号代数と式の簡約
- 02微積分と方程式の求解
- 03行列と線形代数の演算
- 04物理計算と高度な数学
- 05コードとLaTeXの生成
活用シーン
- 01方程式の厳密解を求める
- 02記号微分や積分を導出する
- 03行列や固有値の問題を解く
- 04式を実行可能なコードに変換する
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ alterlab-ieu/ alterlab-academic-skills --skill alterlab-sympyインストール後、Claude Code で/alterlab-sympyを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/advanced-topics.mdcode-generation-printing.mdcore-capabilities.mdmatrices-linear-algebra.mdphysics-mechanics.md詳細
SymPy - Python による記号数学
概要
SymPy は、数値近似ではなく数学記号を使って厳密な計算を行う Python の記号数学ライブラリです。このスキルでは、SymPy を使った記号代数、微積分、線形代数、方程式の解法、物理計算、コード生成について、包括的なガイダンスを提供します。
このスキルを使用する場面
次のような場合にこのスキルを使用してください:
- 方程式を記号的に解く場合(代数方程式、微分方程式、連立方程式)
- 微積分の演算を行う場合(導関数、積分、極限、級数)
- 代数式を操作、簡約する場合
- 行列や線形代数を記号的に扱う場合
- 物理計算を行う場合(力学、量子力学、ベクトル解析)
- 整数論の計算を行う場合(素数、因数分解、剰余演算)
- 幾何計算を行う場合(2D/3D 幾何、解析幾何)
- 数学式を実行可能なコードに変換する場合(Python、C、Fortran)
- LaTeX やその他の形式で数式を出力する場合
- 厳密な数学的結果が必要な場合(例:
1.414...ではなくsqrt(2))
対象外
| シナリオ | 代わりに使用 |
|---|---|
| 統計モデルをデータに当てはめる、または仮説検定を実行する | alterlab-statistical-analysis |
| 数値的な多目的最適化または制約付き最適化(パレートフロント、NSGA-II) | alterlab-pymoo |
| 開放量子系を数値シミュレーションする(マスター方程式、リンドブラッドダイナミクス) | 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. 高度な数学
このスキルでは、次の分野を包括的にサポートしています。
- 幾何学: 2D/3D 解析幾何、点、直線、円、多角形、変換
- 整数論: 素数、因数分解、GCD/LCM、剰余演算、ディオファントス方程式
- 組合せ論: 順列、組み合わせ、分割、群論
- 論理と集合: ブール論理、集合論、有限集合と無限集合
- 統計学: 確率分布、確率変数、期待値、分散
- 特殊関数: ガンマ関数、ベッセル関数、直交多項式、超幾何関数
- 多項式: 多項式代数、根、因数分解、グレブナー基底
高度なトピックの詳細: 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:汎用(レガシーですが、柔軟です)
リファレンスファイルの構成
このスキルでは、機能ごとにモジュール化されたリファレンスファイルを使用します。
-
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()}")
科学計算ワークフローとの統合
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
よくある問題のトラブルシューティング
-
「NameError: name 'x' is not defined」
- 解決策:使用する前に、必ず
symbols()でシンボルを定義してください
- 解決策:使用する前に、必ず
-
予期しない数値結果
- 問題:
Rational(1, 2)ではなく、0.5のような浮動小数点数を使用している - 解決策:厳密な演算には
Rational()またはS()を使用してください
- 問題:
-
ループ内でのパフォーマンス低下
- 問題:
subs()とevalf()を繰り返し使用している - 解決策:
lambdify()を使用して高速な数値関数を作成してください
- 問題:
-
「この方程式を解けません」
- 別のソルバーを試してください:
solve、solveset、nsolve(数値計算) - 方程式が代数的に解けるか確認してください
- 閉形式解が存在しない場合は、数値計算の手法を使用してください
- 別のソルバーを試してください:
-
簡約が期待どおりに機能しない
- 別の簡約関数を試してください:
simplify、factor、expand、trigsimp - シンボルに仮定を追加してください(例:
positive=True) powsimp、expand_log、logcombineは、仮定を無視するためにforce=Trueを受け付けます(simplifyにはforceオプションがありません)
- 別の簡約関数を試してください:
追加リソース
- 公式ドキュメント: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/doc/src/modules
AlterLab Academic Skillsスイートの一部です。