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__)

このスキルを使用する場面

次のような場合に、このスキルを使用します。

  • 方程式を記号的に解く場合(代数方程式、微分方程式、連立方程式)
  • 微積分演算を行う場合(導関数、積分、極限、級数)
  • 代数式を操作・簡約する場合
  • 行列や線形代数を記号的に扱う場合
  • 物理計算を行う場合(力学、量子力学、ベクトル解析)
  • 数論計算を行う場合(素数、因数分解、モジュラー演算)
  • 幾何計算を行う場合(2D/3D 幾何、解析幾何)
  • 数式を実行可能なコードに変換する場合(Python、C、Fortran)
  • LaTeX やその他の書式による数式出力を生成する場合
  • 厳密な数学的結果が必要な場合(例:1.414... ではなく sqrt(2))

主な機能

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. 高度な数学

このスキルは、次の分野を包括的にサポートします。

  • 幾何学: 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. まずシンボルを定義する
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. 予期しない数値結果

    • 問題:Rational(1, 2) ではなく、0.5 のような浮動小数点数を使用している
    • 解決策:厳密な演算には Rational() または S() を使用します。
  3. ループ内での処理が遅い

    • 問題:subs() と evalf() を繰り返し使用している
    • 解決策:lambdify() を使って高速な数値関数を作成します。
  4. 「この方程式は解けません」

    • 別のソルバーを試します:solve、solveset、nsolve(数値)
    • 方程式が代数的に解けるか確認します
    • 閉形式の解が存在しない場合は、数値解法を使用します
  5. 簡約が期待どおりに機能しない

    • 別の簡約関数を試します:simplify、factor、expand、trigsimp
    • シンボルに仮定を追加します(例:positive=True)
    • 強力な簡約には simplify(expr, force=True) を使用します

追加リソース

コメント