sympy
Pythonで記号数学を扱う際に使用するスキルです。方程式の代数的求解、微積分演算(微分・積分・極限)、代数式の変換、記号的な行列計算、物理計算、数論、幾何学的計算、数式から実行可能なコードの生成など、記号計算全般に対応します。数値近似ではなく厳密な記号的結果が必要な場合や、変数やパラメータを含む数式を扱う場合に適用してください。
description の原文を見る
Use this skill when working with symbolic mathematics in Python. This skill should be used for symbolic computation tasks including solving equations algebraically, performing calculus operations (derivatives, integrals, limits), manipulating algebraic expressions, working with matrices symbolically, physics calculations, number theory problems, geometry computations, and generating executable code from mathematical expressions. Apply this skill when the user needs exact symbolic results rather than numerical approximations, or when working with mathematical formulas that contain variables and parameters.
SKILL.md 本文
SymPy - Python での記号数学
概要
SymPy は、数値近似ではなく数学記号を使用した正確な計算を可能にする、Python 用記号数学ライブラリです。このスキルは、SymPy を使用して記号代数、微積分、線形代数、方程式の求解、物理計算、およびコード生成を実行するための包括的なガイダンスを提供します。
このスキルを使用する場合
以下の場合に、このスキルを使用してください:
- 方程式を記号的に解く(代数方程式、微分方程式、連立方程式)
- 微積分演算を実行する(導数、積分、極限、級数展開)
- 代数式を操作および簡約化する
- 行列と線形代数を記号的に扱う
- 物理計算を行う(力学、量子力学、ベクトル解析)
- 数論計算を実行する(素数、因数分解、剰余演算)
- 幾何計算を実行する(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
# 仮定付き
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) # 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(3 階導数)
diff(x**2*y**3, x, y) # 6*x*y**2(偏導数)
積分:
from sympy import integrate, oo
integrate(x**2, x) # x**3/3(不定積分)
integrate(x**2, (x, 0, 1)) # 1/3(定積分)
integrate(exp(-x), (x, 0, oo)) # 1(広義積分)
極限と級数展開:
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)}(線形)
nonlinsolve([x**2 + y - 2, x + y**2 - 3], x, y) # (非線形)
微分方程式:
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 # 逆行列
M.det() # 行列式
M.T # 転置
固有値と固有ベクトル:
eigenvals = M.eigenvals() # {固有値: 重複度}
eigenvects = M.eigenvects() # [(固有値, 重複度, [固有ベクトル])]
P, D = M.diagonalize() # M = P*D*P^-1
線形システムの求解:
A = Matrix([[1, 2], [3, 4]])
b = Matrix([5, 6])
x = A.solve(b) # Ax = b を解く
包括的な線形代数について: references/matrices-linear-algebra.md を参照してください
5. 物理と力学
古典力学:
from sympy.physics.mechanics import dynamicsymbols, LagrangesMethod
from sympy import symbols
# システムを定義
q = dynamicsymbols('q')
m, g, l = symbols('m g l')
# ラグランジアン (T - V)
L = m*(l*q.diff())**2/2 - m*g*l*(1 - cos(q))
# ラグランジュ法を適用
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) # スカラー積
cross(v1, v2) # クロス積
量子力学:
from sympy.physics.quantum import Ket, Bra, Commutator
psi = Ket('psi')
A = Operator('A')
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') # NumPy 関数を作成
x_vals = np.linspace(0, 10, 100)
y_vals = f(x_vals) # 高速な数値評価
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) # ドキュメント用 LaTeX に変換
包括的なコード生成について: references/code-generation-printing.md を参照してください
SymPy を使用する際のベストプラクティス
1. 常にシンボルを最初に定義する
from sympy import symbols
x, y, z = symbols('x y z')
# これで x, y, z を式で使用できます
2. より良い簡約化のために仮定を使用する
x = symbols('x', positive=True, real=True)
sqrt(x**2) # 正の仮定により Abs(x) ではなく x を返す
一般的な仮定:real、positive、negative、integer、rational、complex、even、odd
3. 正確な算術を使用する
from sympy import Rational, S
# 正しい(正確):
expr = Rational(1, 2) * x
expr = S(1)/2 * x
# 間違い(浮動小数点):
expr = 0.5 * x # 近似値を作成
4. 必要に応じて数値評価する
from sympy import pi, sqrt
result = sqrt(8) + pi
result.evalf() # 5.96371554103586
result.evalf(50) # 50 桁の精度
5. パフォーマンスのために NumPy に変換する
# 多くの評価でこれは遅い:
for x_val in range(1000):
result = expr.subs(x, x_val).evalf()
# これは高速:
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、codegen、LaTeX 出力、印刷- 以下の場合に読み込む:式をコードに変換または形式付き出力を生成する場合
一般的なユースケースパターン
パターン 1:求解と検証
from sympy import symbols, solve, simplify
x = symbols('x')
# 方程式を解く
equation = x**2 - 5*x + 6
solutions = solve(equation, x) # [2, 3]
# 解を検証する
for sol in solutions:
result = simplify(equation.subs(x, sol))
assert result == 0
パターン 2:記号から数値へのパイプライン
# 1. 記号問題を定義
x, y = symbols('x y')
expr = sin(x) + cos(y)
# 2. 記号的に操作
simplified = simplify(expr)
derivative = diff(simplified, x)
# 3. 数値関数に変換
f = lambdify((x, y), derivative, 'numpy')
# 4. 数値的に評価
results = f(x_data, y_data)
パターン 3:数学的結果をドキュメント化
# 結果を記号的に計算
integral_expr = Integral(x**2, (x, 0, 1))
result = integral_expr.doit()
# ドキュメントを生成
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
# 方程式を記号的に定義
x = symbols('x')
equation = x**3 - 2*x - 5
# 数値関数に変換
f = lambdify(x, equation, 'numpy')
# 初期推定値で数値的に求解
solution = fsolve(f, 2)
クイックリファレンス:最も一般的な関数
# シンボル
from sympy import symbols, Symbol
x, y = symbols('x y')
# 基本演算
from sympy import simplify, expand, factor, collect, cancel
from sympy import sqrt, exp, log, sin, cos, tan, pi, E, I, oo
# 微積分
from sympy import diff, integrate, limit, series, Derivative, Integral
# 求解
from sympy import solve, solveset, linsolve, nonlinsolve, dsolve
# 行列
from sympy import Matrix, eye, zeros, ones, diag
# 論理と集合
from sympy import And, Or, Not, Implies, FiniteSet, Interval, Union
# 出力
from sympy import latex, pprint, lambdify, init_printing
# ユーティリティ
from sympy import evalf, N, nsimplify
開始するための例
例 1:2 次方程式を解く
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)を使用する
- 異なる簡約化関数を試す:
追加リソース
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- davila7
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/davila7/claude-code-templates / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。