sympy について
厳密な記号数学を行うPythonライブラリSymPyの利用を案内するスキルです。代数、微積分、方程式、行列、物理計算に加え、式から実行可能なコードや整形済み出力を作る作業を支援します。
主な機能
- 01厳密な記号演算
- 02微積分と方程式の求解
- 03記号行列演算
- 04物理と高度な数学
- 05コード生成とLaTeX出力
活用シーン
- 01方程式の求解と結果の検証
- 02式の微分や積分
- 03記号行列の固有値計算
- 04数式から数値関数を生成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill sympyインストール後、Claude Code で/sympyを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/advanced-topics.mdcode-generation-printing.mdcore_capabilities.mdcore-capabilities.mdmatrices-linear-algebra.mdphysics-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__)
このスキルを使用する場面
次のような場合に、このスキルを使用します。
- 方程式を記号的に解く(代数方程式、微分方程式、連立方程式)
- 微積分演算を行う(導関数、積分、極限、級数)
- 代数式を操作し、簡約する
- 行列や線形代数を記号的に扱う
- 物理計算を行う(力学、量子力学、ベクトル解析)
- 数論計算を行う(素数、因数分解、剰余演算)
- 幾何計算を行う(2D/3D 幾何学、解析幾何学)
- 数式を実行可能なコードに変換する(Python、C、Fortran)
- LaTeX やその他の形式で数式を出力する
- 厳密な数学的結果が必要な場合(例:
1.414...ではなくsqrt(2))
主な機能
7つの機能分野については、 references/core_capabilities.md に記載されています。
- 記号計算の基礎 — 記号、式、簡約、代入。
- 微積分 — 微分、積分、極限、級数。
- 方程式の求解 —
solve、solveset、線形および非線形の連立方程式、ODE。 - 行列と線形代数 — 詳しくは references/matrices-linear-algebra.md を参照してください。
- 物理学と力学 — 詳しくは references/physics-mechanics.md を参照してください。
- 高度な数学 — 詳しくは references/advanced-topics.md を参照してください。
- コード生成と出力 — 詳しくは references/code-generation-printing.md を参照してください。
最初の3項目についての詳しい説明は、 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:汎用(レガシーですが柔軟です)
リファレンスファイルの構成
このスキルでは、機能ごとにモジュール化されたリファレンスファイルを使用します。
-
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()}")
科学計算ワークフローとの統合
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])
よくある問題のトラブルシューティング
-
「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) - より強力な簡約には
simplify(expr, force=True)を使用します
- 別の簡約関数を試します:
その他のリソース
- 公式ドキュメント: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
エージェントの実行手順
- 環境を確認します。 Python 環境とライブラリのバージョン(
python -c "import pkg; print(pkg.__version__)")を確認し、データの形状、型、欠損値を調べます。 - 入力内容を明確にします。 データまたはユーザーに確認し、形式、識別子、パラメーターを確定します。結果を変える値については、推測せずに質問します。
- まず小規模に実行します。 サンプルまたは単一のフォールドで実行し、実行時間とメモリ使用量を確認します。
- 上記の指示と参考資料を使って、タスク全体を実行します。
- 結果を検証します。 ホールドアウトデータ、固定した乱数シード、適切な指標を使用し、データ漏洩がないか確認します。不確実性(信頼区間、シード間の標準偏差)を報告します。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未解決の不確実性を明記します。
| このような場合 | 対応方法 |
|---|---|
| メモリ不足、または実行が非常に遅い | サブサンプリングする、チャンク処理または遅延計算を使う、あるいはモデルサイズを縮小し、変更内容をユーザーに伝えます。 |
| これらの手順に記載された関数、フラグ、エンドポイントがインストール済みバージョンにない | インストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認し、適応させてユーザーに伝えます。API を捏造してはいけません。 |
| 必須の入力、識別子、またはパラメーターが曖昧 | ユーザーに質問するか、実行前に仮定を明示します。 |
インテグリティに関するルール
- 結果、パラメーター、識別子、引用、統計値を捏造してはいけません。実行または検証できない場合は、明確にそう伝えます。
- このセッションで計算していない指標を報告してはいけません。すべての数値について、それを生成したコードの処理経路を示します。
- ここに記載されているバージョン固有の詳細は古くなっている可能性があるものとして扱い、インストール済みバージョンの公式ドキュメントで確認します。
- 費用が発生する、共有 GPU やクラウドのクォータを消費する、個人データや患者データを扱う、または取り消せない操作を行う前には、ユーザーに確認します。